/ Hex Artifact Content
Login

Artifact 4ace6d1d5ba9a89822deb287317f33c810440526eafe185c2d8a48c31df1e995:


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 20 20 20 20 73 71 6c  IdList);.    sql
0370: 69 74 65 33 55 70 73 65 72 74 44 65 6c 65 74 65  ite3UpsertDelete
0380: 28 64 62 2c 20 70 54 6d 70 2d 3e 70 55 70 73 65  (db, pTmp->pUpse
0390: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
03a0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 2d  DbFree(db, pTmp-
03b0: 3e 7a 53 70 61 6e 29 3b 0a 0a 20 20 20 20 73 71  >zSpan);..    sq
03c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
03d0: 70 54 6d 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pTmp);.  }.}../*
03e0: 0a 2a 2a 20 47 69 76 65 6e 20 74 61 62 6c 65 20  .** Given table 
03f0: 70 54 61 62 2c 20 72 65 74 75 72 6e 20 61 20 6c  pTab, return a l
0400: 69 73 74 20 6f 66 20 61 6c 6c 20 74 68 65 20 74  ist of all the t
0410: 72 69 67 67 65 72 73 20 61 74 74 61 63 68 65 64  riggers attached
0420: 20 74 6f 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   to .** the tabl
0430: 65 2e 20 54 68 65 20 6c 69 73 74 20 69 73 20 63  e. The list is c
0440: 6f 6e 6e 65 63 74 65 64 20 62 79 20 54 72 69 67  onnected by Trig
0450: 67 65 72 2e 70 4e 65 78 74 20 70 6f 69 6e 74 65  ger.pNext pointe
0460: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  rs..**.** All of
0470: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 6f 6e   the triggers on
0480: 20 70 54 61 62 20 74 68 61 74 20 61 72 65 20 69   pTab that are i
0490: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
04a0: 61 73 65 20 61 73 20 70 54 61 62 0a 2a 2a 20 61  ase as pTab.** a
04b0: 72 65 20 61 6c 72 65 61 64 79 20 61 74 74 61 63  re already attac
04c0: 68 65 64 20 74 6f 20 70 54 61 62 2d 3e 70 54 72  hed to pTab->pTr
04d0: 69 67 67 65 72 2e 20 20 42 75 74 20 74 68 65 72  igger.  But ther
04e0: 65 20 6d 69 67 68 74 20 62 65 20 61 64 64 69 74  e might be addit
04f0: 69 6f 6e 61 6c 0a 2a 2a 20 74 72 69 67 67 65 72  ional.** trigger
0500: 73 20 6f 6e 20 70 54 61 62 20 69 6e 20 74 68 65  s on pTab in the
0510: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20 54   TEMP schema.  T
0520: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 65 70  his routine prep
0530: 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 54 45 4d 50  ends all.** TEMP
0540: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 70 54 61   triggers on pTa
0550: 62 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  b to the beginni
0560: 6e 67 20 6f 66 20 74 68 65 20 70 54 61 62 2d 3e  ng of the pTab->
0570: 70 54 72 69 67 67 65 72 20 6c 69 73 74 0a 2a 2a  pTrigger list.**
0580: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
0590: 20 63 6f 6d 62 69 6e 65 64 20 6c 69 73 74 2e 0a   combined list..
05a0: 2a 2a 0a 2a 2a 20 54 6f 20 73 74 61 74 65 20 69  **.** To state i
05b0: 74 20 61 6e 6f 74 68 65 72 20 77 61 79 3a 20 20  t another way:  
05c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
05d0: 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 61  urns a list of a
05e0: 6c 6c 20 74 72 69 67 67 65 72 73 0a 2a 2a 20 74  ll triggers.** t
05f0: 68 61 74 20 66 69 72 65 20 6f 66 66 20 6f 66 20  hat fire off of 
0600: 70 54 61 62 2e 20 20 54 68 65 20 6c 69 73 74 20  pTab.  The list 
0610: 77 69 6c 6c 20 69 6e 63 6c 75 64 65 20 61 6e 79  will include any
0620: 20 54 45 4d 50 20 74 72 69 67 67 65 72 73 20 6f   TEMP triggers o
0630: 6e 0a 2a 2a 20 70 54 61 62 20 61 73 20 77 65 6c  n.** pTab as wel
0640: 6c 20 61 73 20 74 68 65 20 74 72 69 67 67 65 72  l as the trigger
0650: 73 20 6c 69 73 65 64 20 69 6e 20 70 54 61 62 2d  s lised in pTab-
0660: 3e 70 54 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72  >pTrigger..*/.Tr
0670: 69 67 67 65 72 20 2a 73 71 6c 69 74 65 33 54 72  igger *sqlite3Tr
0680: 69 67 67 65 72 4c 69 73 74 28 50 61 72 73 65 20  iggerList(Parse 
0690: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
06a0: 70 54 61 62 29 7b 0a 20 20 53 63 68 65 6d 61 20  pTab){.  Schema 
06b0: 2a 20 63 6f 6e 73 74 20 70 54 6d 70 53 63 68 65  * const pTmpSche
06c0: 6d 61 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ma = pParse->db-
06d0: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[1].pSchema;
06e0: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 73  .  Trigger *pLis
06f0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
0700: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
0710: 6f 66 20 74 72 69 67 67 65 72 73 20 74 6f 20 72  of triggers to r
0720: 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  eturn */..  if( 
0730: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 54  pParse->disableT
0740: 72 69 67 67 65 72 73 20 29 7b 0a 20 20 20 20 72  riggers ){.    r
0750: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
0760: 69 66 28 20 70 54 6d 70 53 63 68 65 6d 61 21 3d  if( pTmpSchema!=
0770: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
0780: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
0790: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
07a0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
07b0: 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  Held(pParse->db,
07c0: 20 30 2c 20 70 54 6d 70 53 63 68 65 6d 61 29 20   0, pTmpSchema) 
07d0: 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  );.    for(p=sql
07e0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 54  iteHashFirst(&pT
07f0: 6d 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  mpSchema->trigHa
0800: 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  sh); p; p=sqlite
0810: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
0820: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
0830: 69 67 20 3d 20 28 54 72 69 67 67 65 72 20 2a 29  ig = (Trigger *)
0840: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
0850: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72  );.      if( pTr
0860: 69 67 2d 3e 70 54 61 62 53 63 68 65 6d 61 3d 3d  ig->pTabSchema==
0870: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 0a 20 20  pTab->pSchema.  
0880: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
0890: 65 33 53 74 72 49 43 6d 70 28 70 54 72 69 67 2d  e3StrICmp(pTrig-
08a0: 3e 74 61 62 6c 65 2c 20 70 54 61 62 2d 3e 7a 4e  >table, pTab->zN
08b0: 61 6d 65 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  ame) .      ){. 
08c0: 20 20 20 20 20 20 20 70 54 72 69 67 2d 3e 70 4e         pTrig->pN
08d0: 65 78 74 20 3d 20 28 70 4c 69 73 74 20 3f 20 70  ext = (pList ? p
08e0: 4c 69 73 74 20 3a 20 70 54 61 62 2d 3e 70 54 72  List : pTab->pTr
08f0: 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  igger);.        
0900: 70 4c 69 73 74 20 3d 20 70 54 72 69 67 3b 0a 20  pList = pTrig;. 
0910: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
0920: 0a 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73  ..  return (pLis
0930: 74 20 3f 20 70 4c 69 73 74 20 3a 20 70 54 61 62  t ? pList : pTab
0940: 2d 3e 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a  ->pTrigger);.}..
0950: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
0960: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
0970: 65 72 20 77 68 65 6e 20 69 74 20 73 65 65 73 20  er when it sees 
0980: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  a CREATE TRIGGER
0990: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 75 70   statement.** up
09a0: 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20 6f 66   to the point of
09b0: 20 74 68 65 20 42 45 47 49 4e 20 62 65 66 6f 72   the BEGIN befor
09c0: 65 20 74 68 65 20 74 72 69 67 67 65 72 20 61 63  e the trigger ac
09d0: 74 69 6f 6e 73 2e 20 20 41 20 54 72 69 67 67 65  tions.  A Trigge
09e0: 72 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69  r.** structure i
09f0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 61 73 65  s generated base
0a00: 64 20 6f 6e 20 74 68 65 20 69 6e 66 6f 72 6d 61  d on the informa
0a10: 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65 20 61  tion available a
0a20: 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  nd stored.** in 
0a30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
0a40: 67 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ger.  After the 
0a50: 74 72 69 67 67 65 72 20 61 63 74 69 6f 6e 73 20  trigger actions 
0a60: 68 61 76 65 20 62 65 65 6e 20 70 61 72 73 65 64  have been parsed
0a70: 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  , the.** sqlite3
0a80: 46 69 6e 69 73 68 54 72 69 67 67 65 72 28 29 20  FinishTrigger() 
0a90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
0aa0: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
0ab0: 68 65 20 74 72 69 67 67 65 72 0a 2a 2a 20 63 6f  he trigger.** co
0ac0: 6e 73 74 72 75 63 74 69 6f 6e 20 70 72 6f 63 65  nstruction proce
0ad0: 73 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ss..*/.void sqli
0ae0: 74 65 33 42 65 67 69 6e 54 72 69 67 67 65 72 28  te3BeginTrigger(
0af0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0b00: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
0b10: 72 73 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  rse context of t
0b20: 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45  he CREATE TRIGGE
0b30: 52 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  R statement */. 
0b40: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
0b50: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65       /* The name
0b60: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
0b70: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
0b80: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
0b90: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67  name of the trig
0ba0: 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f  ger */.  int tr_
0bb0: 74 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tm,          /* 
0bc0: 4f 6e 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45  One of TK_BEFORE
0bd0: 2c 20 54 4b 5f 41 46 54 45 52 2c 20 54 4b 5f 49  , TK_AFTER, TK_I
0be0: 4e 53 54 45 41 44 20 2a 2f 0a 20 20 69 6e 74 20  NSTEAD */.  int 
0bf0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
0c00: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e 53  /* One of TK_INS
0c10: 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20  ERT, TK_UPDATE, 
0c20: 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 49  TK_DELETE */.  I
0c30: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c  dList *pColumns,
0c40: 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73     /* column lis
0c50: 74 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  t if this is an 
0c60: 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67 65  UPDATE OF trigge
0c70: 72 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  r */.  SrcList *
0c80: 70 54 61 62 6c 65 4e 61 6d 65 2c 2f 2a 20 54 68  pTableName,/* Th
0c90: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0ca0: 62 6c 65 2f 76 69 65 77 20 74 68 65 20 74 72 69  ble/view the tri
0cb0: 67 67 65 72 20 61 70 70 6c 69 65 73 20 74 6f 20  gger applies to 
0cc0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 6e  */.  Expr *pWhen
0cd0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 4e  ,        /* WHEN
0ce0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
0cf0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
0d00: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
0d10: 54 45 4d 50 4f 52 41 52 59 20 6b 65 79 77 6f 72  TEMPORARY keywor
0d20: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0d30: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
0d40: 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73        /* Suppres
0d50: 73 20 65 72 72 6f 72 73 20 69 66 20 74 68 65 20  s errors if the 
0d60: 74 72 69 67 67 65 72 20 61 6c 72 65 61 64 79 20  trigger already 
0d70: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
0d80: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
0d90: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6e 65   = 0;  /* The ne
0da0: 77 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 54  w trigger */.  T
0db0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
0dc0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
0dd0: 74 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72  that the trigger
0de0: 20 66 69 72 65 73 20 6f 66 66 20 6f 66 20 2a 2f   fires off of */
0df0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
0e00: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61   0;        /* Na
0e10: 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  me of the trigge
0e20: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
0e30: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0e40: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
0e50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
0e60: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
0e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0e80: 20 64 61 74 61 62 61 73 65 20 74 6f 20 73 74 6f   database to sto
0e90: 72 65 20 74 68 65 20 74 72 69 67 67 65 72 20 69  re the trigger i
0ea0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
0eb0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
0ec0: 2a 20 54 68 65 20 75 6e 71 75 61 6c 69 66 69 65  * The unqualifie
0ed0: 64 20 64 62 20 6e 61 6d 65 20 2a 2f 0a 20 20 44  d db name */.  D
0ee0: 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
0ef0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20         /* State 
0f00: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 44  vector for the D
0f10: 42 20 66 69 78 65 72 20 2a 2f 0a 0a 20 20 61 73  B fixer */..  as
0f20: 73 65 72 74 28 20 70 4e 61 6d 65 31 21 3d 30 20  sert( pName1!=0 
0f30: 29 3b 20 20 20 2f 2a 20 70 4e 61 6d 65 31 2d 3e  );   /* pName1->
0f40: 7a 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 2c  z might be NULL,
0f50: 20 62 75 74 20 6e 6f 74 20 70 4e 61 6d 65 31 20   but not pName1 
0f60: 69 74 73 65 6c 66 20 2a 2f 0a 20 20 61 73 73 65  itself */.  asse
0f70: 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b  rt( pName2!=0 );
0f80: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
0f90: 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d  K_INSERT || op==
0fa0: 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d  TK_UPDATE || op=
0fb0: 3d 54 4b 5f 44 45 4c 45 54 45 20 29 3b 0a 20 20  =TK_DELETE );.  
0fc0: 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20  assert( op>0 && 
0fd0: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
0fe0: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 2f   isTemp ){.    /
0ff0: 2a 20 49 66 20 54 45 4d 50 20 77 61 73 20 73 70  * If TEMP was sp
1000: 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68  ecified, then th
1010: 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 6d  e trigger name m
1020: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
1030: 69 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ied. */.    if( 
1040: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
1050: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1060: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
1070: 6d 70 6f 72 61 72 79 20 74 72 69 67 67 65 72 20  mporary trigger 
1080: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 71 75 61  may not have qua
1090: 6c 69 66 69 65 64 20 6e 61 6d 65 22 29 3b 0a 20  lified name");. 
10a0: 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65       goto trigge
10b0: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  r_cleanup;.    }
10c0: 0a 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20  .    iDb = 1;.  
10d0: 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31    pName = pName1
10e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10f0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
1100: 20 64 62 20 74 68 61 74 20 74 68 65 20 74 72 69   db that the tri
1110: 67 67 65 72 20 77 69 6c 6c 20 62 65 20 63 72 65  gger will be cre
1120: 61 74 65 64 20 69 6e 20 2a 2f 0a 20 20 20 20 69  ated in */.    i
1130: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
1140: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
1150: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
1160: 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
1170: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
1180: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
1190: 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  anup;.    }.  }.
11a0: 20 20 69 66 28 20 21 70 54 61 62 6c 65 4e 61 6d    if( !pTableNam
11b0: 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e || db->mallocF
11c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
11d0: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
11e0: 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20 6c  p;.  }..  /* A l
11f0: 6f 6e 67 2d 73 74 61 6e 64 69 6e 67 20 70 61 72  ong-standing par
1200: 73 65 72 20 62 75 67 20 69 73 20 74 68 61 74 20  ser bug is that 
1210: 74 68 69 73 20 73 79 6e 74 61 78 20 77 61 73 20  this syntax was 
1220: 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1230: 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  **    CREATE TRI
1240: 47 47 45 52 20 61 74 74 61 63 68 65 64 2e 64 65  GGER attached.de
1250: 6d 6f 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  mo AFTER INSERT 
1260: 4f 4e 20 61 74 74 61 63 68 65 64 2e 74 61 62 20  ON attached.tab 
1270: 2e 2e 2e 2e 0a 20 20 2a 2a 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 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e            ^^^^^^
12b0: 5e 5e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20  ^^.  **.  ** To 
12c0: 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
12d0: 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
12e0: 2c 20 69 67 6e 6f 72 65 20 74 68 65 20 64 61 74  , ignore the dat
12f0: 61 62 61 73 65 0a 20 20 2a 2a 20 6e 61 6d 65 20  abase.  ** name 
1300: 6f 6e 20 70 54 61 62 6c 65 4e 61 6d 65 20 69 66  on pTableName if
1310: 20 77 65 20 61 72 65 20 72 65 70 61 72 73 69 6e   we are reparsin
1320: 67 20 6f 75 74 20 6f 66 20 53 51 4c 49 54 45 5f  g out of SQLITE_
1330: 4d 41 53 54 45 52 2e 0a 20 20 2a 2f 0a 20 20 69  MASTER..  */.  i
1340: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1350: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
1360: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1370: 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e  db, pTableName->
1380: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1390: 0a 20 20 20 20 70 54 61 62 6c 65 4e 61 6d 65 2d  .    pTableName-
13a0: 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 20  >a[0].zDatabase 
13b0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
13c0: 66 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61  f the trigger na
13d0: 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69  me was unqualifi
13e0: 65 64 2c 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ed, and the tabl
13f0: 65 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  e is a temp tabl
1400: 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74  e,.  ** then set
1410: 20 69 44 62 20 74 6f 20 31 20 74 6f 20 63 72 65   iDb to 1 to cre
1420: 61 74 65 20 74 68 65 20 74 72 69 67 67 65 72 20  ate the trigger 
1430: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
1440: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20   database..  ** 
1450: 49 66 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  If sqlite3SrcLis
1460: 74 4c 6f 6f 6b 75 70 28 29 20 72 65 74 75 72 6e  tLookup() return
1470: 73 20 30 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  s 0, indicating 
1480: 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  the table does n
1490: 6f 74 0a 20 20 2a 2a 20 65 78 69 73 74 2c 20 74  ot.  ** exist, t
14a0: 68 65 20 65 72 72 6f 72 20 69 73 20 63 61 75 67  he error is caug
14b0: 68 74 20 62 79 20 74 68 65 20 62 6c 6f 63 6b 20  ht by the block 
14c0: 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 54  below..  */.  pT
14d0: 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
14e0: 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
14f0: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  , pTableName);. 
1500: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1510: 73 79 3d 3d 30 20 26 26 20 70 4e 61 6d 65 32 2d  sy==0 && pName2-
1520: 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 0a 20 20  >n==0 && pTab.  
1530: 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70        && pTab->p
1540: 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
1550: 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
1560: 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 7d 0a 0a    iDb = 1;.  }..
1570: 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
1580: 74 61 62 6c 65 20 6e 61 6d 65 20 6d 61 74 63 68  table name match
1590: 65 73 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  es database name
15a0: 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 74 61   and that the ta
15b0: 62 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ble exists */.  
15c0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
15d0: 69 6c 65 64 20 29 20 67 6f 74 6f 20 74 72 69 67  iled ) goto trig
15e0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 61  ger_cleanup;.  a
15f0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 4e 61 6d  ssert( pTableNam
1600: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
1610: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
1620: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
1630: 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20 70 4e  b, "trigger", pN
1640: 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
1650: 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
1660: 46 69 78 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  Fix, pTableName)
1670: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69   ){.    goto tri
1680: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
1690: 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  }.  pTab = sqlit
16a0: 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
16b0: 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61  pParse, pTableNa
16c0: 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
16d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74   ){.    /* The t
16e0: 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  able does not ex
16f0: 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ist. */.    if( 
1700: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
1710: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  ){.      /* Tick
1720: 65 74 20 23 33 38 31 30 2e 0a 20 20 20 20 20 20  et #3810..      
1730: 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65  ** Normally, whe
1740: 6e 65 76 65 72 20 61 20 74 61 62 6c 65 20 69 73  never a table is
1750: 20 64 72 6f 70 70 65 64 2c 20 61 6c 6c 20 61 73   dropped, all as
1760: 73 6f 63 69 61 74 65 64 20 74 72 69 67 67 65 72  sociated trigger
1770: 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 64  s are.      ** d
1780: 72 6f 70 70 65 64 20 74 6f 6f 2e 20 20 42 75 74  ropped too.  But
1790: 20 69 66 20 61 20 54 45 4d 50 20 74 72 69 67 67   if a TEMP trigg
17a0: 65 72 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e  er is created on
17b0: 20 61 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c   a non-TEMP tabl
17c0: 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  e.      ** and t
17d0: 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
17e0: 70 65 64 20 62 79 20 61 20 64 69 66 66 65 72 65  ped by a differe
17f0: 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  nt database conn
1800: 65 63 74 69 6f 6e 2c 20 74 68 65 0a 20 20 20 20  ection, the.    
1810: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20    ** trigger is 
1820: 6e 6f 74 20 76 69 73 69 62 6c 65 20 74 6f 20 74  not visible to t
1830: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1840: 65 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73  ection that does
1850: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 72   the.      ** dr
1860: 6f 70 20 73 6f 20 74 68 65 20 74 72 69 67 67 65  op so the trigge
1870: 72 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  r cannot be drop
1880: 70 65 64 2e 20 20 54 68 69 73 20 72 65 73 75 6c  ped.  This resul
1890: 74 73 20 69 6e 20 61 6e 0a 20 20 20 20 20 20 2a  ts in an.      *
18a0: 2a 20 22 6f 72 70 68 61 6e 65 64 20 74 72 69 67  * "orphaned trig
18b0: 67 65 72 22 20 2d 20 61 20 74 72 69 67 67 65 72  ger" - a trigger
18c0: 20 77 68 6f 73 65 20 61 73 73 6f 63 69 61 74 65   whose associate
18d0: 64 20 74 61 62 6c 65 20 69 73 20 6d 69 73 73 69  d table is missi
18e0: 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
18f0: 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6f 72 70 68     db->init.orph
1900: 61 6e 54 72 69 67 67 65 72 20 3d 20 31 3b 0a 20  anTrigger = 1;. 
1910: 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 74 72     }.    goto tr
1920: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
1930: 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75   }.  if( IsVirtu
1940: 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
1950: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1960: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
1970: 63 72 65 61 74 65 20 74 72 69 67 67 65 72 73 20  create triggers 
1980: 6f 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  on virtual table
1990: 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  s");.    goto tr
19a0: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
19b0: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
19c0: 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72 20  hat the trigger 
19d0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 72 65 73 65  name is not rese
19e0: 72 76 65 64 20 61 6e 64 20 74 68 61 74 20 6e 6f  rved and that no
19f0: 20 74 72 69 67 67 65 72 20 6f 66 20 74 68 65 0a   trigger of the.
1a00: 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e    ** specified n
1a10: 61 6d 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ame exists */.  
1a20: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1a30: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1a40: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21   pName);.  if( !
1a50: 7a 4e 61 6d 65 20 7c 7c 20 53 51 4c 49 54 45 5f  zName || SQLITE_
1a60: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
1a70: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
1a80: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
1a90: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
1aa0: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73  eanup;.  }.  ass
1ab0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
1ac0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1ad0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  iDb, 0) );.  if(
1ae0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1af0: 28 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  (&(db->aDb[iDb].
1b00: 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73  pSchema->trigHas
1b10: 68 29 2c 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  h),zName) ){.   
1b20: 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20   if( !noErr ){. 
1b30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1b40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 72  rMsg(pParse, "tr
1b50: 69 67 67 65 72 20 25 54 20 61 6c 72 65 61 64 79  igger %T already
1b60: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
1b70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b80: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
1b90: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
1ba0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1bb0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1bc0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20  e, iDb);.    }. 
1bd0: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
1be0: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
1bf0: 2f 2a 20 44 6f 20 6e 6f 74 20 63 72 65 61 74 65  /* Do not create
1c00: 20 61 20 74 72 69 67 67 65 72 20 6f 6e 20 61 20   a trigger on a 
1c10: 73 79 73 74 65 6d 20 74 61 62 6c 65 20 2a 2f 0a  system table */.
1c20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1c30: 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
1c40: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
1c50: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1c60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c70: 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74  e, "cannot creat
1c80: 65 20 74 72 69 67 67 65 72 20 6f 6e 20 73 79 73  e trigger on sys
1c90: 74 65 6d 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  tem table");.   
1ca0: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
1cb0: 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eanup;.  }..  /*
1cc0: 20 49 4e 53 54 45 41 44 20 6f 66 20 74 72 69 67   INSTEAD of trig
1cd0: 67 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 66 6f  gers are only fo
1ce0: 72 20 76 69 65 77 73 20 61 6e 64 20 76 69 65 77  r views and view
1cf0: 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 49  s only support I
1d00: 4e 53 54 45 41 44 0a 20 20 2a 2a 20 6f 66 20 74  NSTEAD.  ** of t
1d10: 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  riggers..  */.  
1d20: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
1d30: 74 20 26 26 20 74 72 5f 74 6d 21 3d 54 4b 5f 49  t && tr_tm!=TK_I
1d40: 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73 71  NSTEAD ){.    sq
1d50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1d60: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72  arse, "cannot cr
1d70: 65 61 74 65 20 25 73 20 74 72 69 67 67 65 72 20  eate %s trigger 
1d80: 6f 6e 20 76 69 65 77 3a 20 25 53 22 2c 20 0a 20  on view: %S", . 
1d90: 20 20 20 20 20 20 20 28 74 72 5f 74 6d 20 3d 3d         (tr_tm ==
1da0: 20 54 4b 5f 42 45 46 4f 52 45 29 3f 22 42 45 46   TK_BEFORE)?"BEF
1db0: 4f 52 45 22 3a 22 41 46 54 45 52 22 2c 20 70 54  ORE":"AFTER", pT
1dc0: 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ableName, 0);.  
1dd0: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
1de0: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66  leanup;.  }.  if
1df0: 28 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  ( !pTab->pSelect
1e00: 20 26 26 20 74 72 5f 74 6d 3d 3d 54 4b 5f 49 4e   && tr_tm==TK_IN
1e10: 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73 71 6c  STEAD ){.    sql
1e20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1e30: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65  rse, "cannot cre
1e40: 61 74 65 20 49 4e 53 54 45 41 44 20 4f 46 22 0a  ate INSTEAD OF".
1e50: 20 20 20 20 20 20 20 20 22 20 74 72 69 67 67 65          " trigge
1e60: 72 20 6f 6e 20 74 61 62 6c 65 3a 20 25 53 22 2c  r on table: %S",
1e70: 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b   pTableName, 0);
1e80: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
1e90: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  r_cleanup;.  }..
1ea0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1eb0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
1ec0: 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 54  N.  {.    int iT
1ed0: 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63  abDb = sqlite3Sc
1ee0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
1ef0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
1f00: 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
1f10: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
1f20: 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73 74 20  GGER;.    const 
1f30: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
1f40: 61 44 62 5b 69 54 61 62 44 62 5d 2e 7a 44 62 53  aDb[iTabDb].zDbS
1f50: 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
1f60: 63 68 61 72 20 2a 7a 44 62 54 72 69 67 20 3d 20  char *zDbTrig = 
1f70: 69 73 54 65 6d 70 20 3f 20 64 62 2d 3e 61 44 62  isTemp ? db->aDb
1f80: 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 7a  [1].zDbSName : z
1f90: 44 62 3b 0a 20 20 20 20 69 66 28 20 69 54 61 62  Db;.    if( iTab
1fa0: 44 62 3d 3d 31 20 7c 7c 20 69 73 54 65 6d 70 20  Db==1 || isTemp 
1fb0: 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
1fc0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47  CREATE_TEMP_TRIG
1fd0: 47 45 52 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  GER;.    if( sql
1fe0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1ff0: 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d  arse, code, zNam
2000: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
2010: 7a 44 62 54 72 69 67 29 20 29 7b 0a 20 20 20 20  zDbTrig) ){.    
2020: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
2030: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
2040: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
2050: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
2060: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
2070: 48 45 4d 41 5f 54 41 42 4c 45 28 69 54 61 62 44  HEMA_TABLE(iTabD
2080: 62 29 2c 30 2c 7a 44 62 29 29 7b 0a 20 20 20 20  b),0,zDb)){.    
2090: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
20a0: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
20b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
20c0: 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65  NSTEAD OF trigge
20d0: 72 73 20 63 61 6e 20 6f 6e 6c 79 20 61 70 70 65  rs can only appe
20e0: 61 72 20 6f 6e 20 76 69 65 77 73 20 61 6e 64 20  ar on views and 
20f0: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 0a  BEFORE triggers.
2100: 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 61 70 70 65    ** cannot appe
2110: 61 72 20 6f 6e 20 76 69 65 77 73 2e 20 20 53 6f  ar on views.  So
2120: 20 77 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c   we might as wel
2130: 6c 20 74 72 61 6e 73 6c 61 74 65 20 65 76 65 72  l translate ever
2140: 79 0a 20 20 2a 2a 20 49 4e 53 54 45 41 44 20 4f  y.  ** INSTEAD O
2150: 46 20 74 72 69 67 67 65 72 20 69 6e 74 6f 20 61  F trigger into a
2160: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 2e   BEFORE trigger.
2170: 20 20 49 74 20 73 69 6d 70 6c 69 66 69 65 73 20    It simplifies 
2180: 63 6f 64 65 0a 20 20 2a 2a 20 65 6c 73 65 77 68  code.  ** elsewh
2190: 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28  ere..  */.  if (
21a0: 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 49 4e 53 54  tr_tm == TK_INST
21b0: 45 41 44 29 7b 0a 20 20 20 20 74 72 5f 74 6d 20  EAD){.    tr_tm 
21c0: 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 0a 20 20 7d  = TK_BEFORE;.  }
21d0: 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 74 68 65  ..  /* Build the
21e0: 20 54 72 69 67 67 65 72 20 6f 62 6a 65 63 74 20   Trigger object 
21f0: 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  */.  pTrigger = 
2200: 28 54 72 69 67 67 65 72 2a 29 73 71 6c 69 74 65  (Trigger*)sqlite
2210: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
2220: 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72  , sizeof(Trigger
2230: 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67  ));.  if( pTrigg
2240: 65 72 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72 69  er==0 ) goto tri
2250: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
2260: 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 20  pTrigger->zName 
2270: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65  = zName;.  zName
2280: 20 3d 20 30 3b 0a 20 20 70 54 72 69 67 67 65 72   = 0;.  pTrigger
2290: 2d 3e 74 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  ->table = sqlite
22a0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 54  3DbStrDup(db, pT
22b0: 61 62 6c 65 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  ableName->a[0].z
22c0: 4e 61 6d 65 29 3b 0a 20 20 70 54 72 69 67 67 65  Name);.  pTrigge
22d0: 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  r->pSchema = db-
22e0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
22f0: 61 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70  a;.  pTrigger->p
2300: 54 61 62 53 63 68 65 6d 61 20 3d 20 70 54 61 62  TabSchema = pTab
2310: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 72  ->pSchema;.  pTr
2320: 69 67 67 65 72 2d 3e 6f 70 20 3d 20 28 75 38 29  igger->op = (u8)
2330: 6f 70 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e  op;.  pTrigger->
2340: 74 72 5f 74 6d 20 3d 20 74 72 5f 74 6d 3d 3d 54  tr_tm = tr_tm==T
2350: 4b 5f 42 45 46 4f 52 45 20 3f 20 54 52 49 47 47  K_BEFORE ? TRIGG
2360: 45 52 5f 42 45 46 4f 52 45 20 3a 20 54 52 49 47  ER_BEFORE : TRIG
2370: 47 45 52 5f 41 46 54 45 52 3b 0a 20 20 70 54 72  GER_AFTER;.  pTr
2380: 69 67 67 65 72 2d 3e 70 57 68 65 6e 20 3d 20 73  igger->pWhen = s
2390: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
23a0: 2c 20 70 57 68 65 6e 2c 20 45 58 50 52 44 55 50  , pWhen, EXPRDUP
23b0: 5f 52 45 44 55 43 45 29 3b 0a 20 20 70 54 72 69  _REDUCE);.  pTri
23c0: 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 20 3d  gger->pColumns =
23d0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
23e0: 70 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b  p(db, pColumns);
23f0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
2400: 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 3d 3d  e->pNewTrigger==
2410: 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  0 );.  pParse->p
2420: 4e 65 77 54 72 69 67 67 65 72 20 3d 20 70 54 72  NewTrigger = pTr
2430: 69 67 67 65 72 3b 0a 0a 74 72 69 67 67 65 72 5f  igger;..trigger_
2440: 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
2450: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
2460: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  me);.  sqlite3Sr
2470: 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
2480: 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 73  pTableName);.  s
2490: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
24a0: 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29  te(db, pColumns)
24b0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
24c0: 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65 6e 29  elete(db, pWhen)
24d0: 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  ;.  if( !pParse-
24e0: 3e 70 4e 65 77 54 72 69 67 67 65 72 20 29 7b 0a  >pNewTrigger ){.
24f0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
2500: 65 54 72 69 67 67 65 72 28 64 62 2c 20 70 54 72  eTrigger(db, pTr
2510: 69 67 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  igger);.  }else{
2520: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2530: 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72  rse->pNewTrigger
2540: 3d 3d 70 54 72 69 67 67 65 72 20 29 3b 0a 20 20  ==pTrigger );.  
2550: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2560: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2570: 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  d after all of t
2580: 68 65 20 74 72 69 67 67 65 72 20 61 63 74 69 6f  he trigger actio
2590: 6e 73 20 68 61 76 65 20 62 65 65 6e 20 70 61 72  ns have been par
25a0: 73 65 64 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  sed.** in order 
25b0: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
25c0: 70 72 6f 63 65 73 73 20 6f 66 20 62 75 69 6c 64  process of build
25d0: 69 6e 67 20 74 68 65 20 74 72 69 67 67 65 72 2e  ing the trigger.
25e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25f0: 46 69 6e 69 73 68 54 72 69 67 67 65 72 28 0a 20  FinishTrigger(. 
2600: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2610: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
2620: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2630: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74  TriggerStep *pSt
2640: 65 70 4c 69 73 74 2c 20 2f 2a 20 54 68 65 20 74  epList, /* The t
2650: 72 69 67 67 65 72 65 64 20 70 72 6f 67 72 61 6d  riggered program
2660: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c   */.  Token *pAl
2670: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l             /*
2680: 20 54 6f 6b 65 6e 20 74 68 61 74 20 64 65 73 63   Token that desc
2690: 72 69 62 65 73 20 74 68 65 20 63 6f 6d 70 6c 65  ribes the comple
26a0: 74 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45  te CREATE TRIGGE
26b0: 52 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65  R */.){.  Trigge
26c0: 72 20 2a 70 54 72 69 67 20 3d 20 70 50 61 72 73  r *pTrig = pPars
26d0: 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 3b 20  e->pNewTrigger; 
26e0: 20 20 2f 2a 20 54 72 69 67 67 65 72 20 62 65 69    /* Trigger bei
26f0: 6e 67 20 66 69 6e 69 73 68 65 64 20 2a 2f 0a 20  ng finished */. 
2700: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2730: 20 6f 66 20 74 72 69 67 67 65 72 20 2a 2f 0a 20   of trigger */. 
2740: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2750: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
2760: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2770: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 44 62  database */.  Db
2780: 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 20 20 20 20 20 20 2f 2a 20 46 69 78 65 72 20 6f        /* Fixer o
27b0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
27c0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
27f0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 72  ontaining the tr
2800: 69 67 67 65 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e  igger */.  Token
2810: 20 6e 61 6d 65 54 6f 6b 65 6e 3b 20 20 20 20 20   nameToken;     
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 6e 61     /* Trigger na
2840: 6d 65 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70  me for error rep
2850: 6f 72 74 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61  orting */..  pPa
2860: 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72  rse->pNewTrigger
2870: 20 3d 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45   = 0;.  if( NEVE
2880: 52 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 20  R(pParse->nErr) 
2890: 7c 7c 20 21 70 54 72 69 67 20 29 20 67 6f 74 6f  || !pTrig ) goto
28a0: 20 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63   triggerfinish_c
28b0: 6c 65 61 6e 75 70 3b 0a 20 20 7a 4e 61 6d 65 20  leanup;.  zName 
28c0: 3d 20 70 54 72 69 67 2d 3e 7a 4e 61 6d 65 3b 0a  = pTrig->zName;.
28d0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
28e0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
28f0: 72 73 65 2d 3e 64 62 2c 20 70 54 72 69 67 2d 3e  rse->db, pTrig->
2900: 70 53 63 68 65 6d 61 29 3b 0a 20 20 70 54 72 69  pSchema);.  pTri
2910: 67 2d 3e 73 74 65 70 5f 6c 69 73 74 20 3d 20 70  g->step_list = p
2920: 53 74 65 70 4c 69 73 74 3b 0a 20 20 77 68 69 6c  StepList;.  whil
2930: 65 28 20 70 53 74 65 70 4c 69 73 74 20 29 7b 0a  e( pStepList ){.
2940: 20 20 20 20 70 53 74 65 70 4c 69 73 74 2d 3e 70      pStepList->p
2950: 54 72 69 67 20 3d 20 70 54 72 69 67 3b 0a 20 20  Trig = pTrig;.  
2960: 20 20 70 53 74 65 70 4c 69 73 74 20 3d 20 70 53    pStepList = pS
2970: 74 65 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  tepList->pNext;.
2980: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 6f 6b    }.  sqlite3Tok
2990: 65 6e 49 6e 69 74 28 26 6e 61 6d 65 54 6f 6b 65  enInit(&nameToke
29a0: 6e 2c 20 70 54 72 69 67 2d 3e 7a 4e 61 6d 65 29  n, pTrig->zName)
29b0: 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e  ;.  sqlite3FixIn
29c0: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
29d0: 2c 20 69 44 62 2c 20 22 74 72 69 67 67 65 72 22  , iDb, "trigger"
29e0: 2c 20 26 6e 61 6d 65 54 6f 6b 65 6e 29 3b 0a 20  , &nameToken);. 
29f0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 54   if( sqlite3FixT
2a00: 72 69 67 67 65 72 53 74 65 70 28 26 73 46 69 78  riggerStep(&sFix
2a10: 2c 20 70 54 72 69 67 2d 3e 73 74 65 70 5f 6c 69  , pTrig->step_li
2a20: 73 74 29 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  st) .   || sqlit
2a30: 65 33 46 69 78 45 78 70 72 28 26 73 46 69 78 2c  e3FixExpr(&sFix,
2a40: 20 70 54 72 69 67 2d 3e 70 57 68 65 6e 29 20 0a   pTrig->pWhen) .
2a50: 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72    ){.    goto tr
2a60: 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61  iggerfinish_clea
2a70: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 69  nup;.  }..  /* i
2a80: 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69  f we are not ini
2a90: 74 69 61 6c 69 7a 69 6e 67 2c 0a 20 20 2a 2a 20  tializing,.  ** 
2aa0: 62 75 69 6c 64 20 74 68 65 20 73 71 6c 69 74 65  build the sqlite
2ab0: 5f 6d 61 73 74 65 72 20 65 6e 74 72 79 0a 20 20  _master entry.  
2ac0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
2ad0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 56  it.busy ){.    V
2ae0: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
2af0: 20 2a 7a 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b   *z;..    /* Mak
2b00: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
2b10: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2b20: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 76 20 3d  table */.    v =
2b30: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
2b40: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
2b50: 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72 69   v==0 ) goto tri
2b60: 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e  ggerfinish_clean
2b70: 75 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  up;.    sqlite3B
2b80: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
2b90: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
2ba0: 62 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  b);.    z = sqli
2bb0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
2bc0: 20 28 63 68 61 72 2a 29 70 41 6c 6c 2d 3e 7a 2c   (char*)pAll->z,
2bd0: 20 70 41 6c 6c 2d 3e 6e 29 3b 0a 20 20 20 20 74   pAll->n);.    t
2be0: 65 73 74 63 61 73 65 28 20 7a 3d 3d 30 20 29 3b  estcase( z==0 );
2bf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
2c00: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
2c10: 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
2c20: 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
2c30: 28 27 74 72 69 67 67 65 72 27 2c 25 51 2c 25 51  ('trigger',%Q,%Q
2c40: 2c 30 2c 27 43 52 45 41 54 45 20 54 52 49 47 47  ,0,'CREATE TRIGG
2c50: 45 52 20 25 71 27 29 22 2c 0a 20 20 20 20 20 20  ER %q')",.      
2c60: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
2c70: 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
2c80: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 0a 20 20 20 20  AME, zName,.    
2c90: 20 20 20 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c     pTrig->table,
2ca0: 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
2cb0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
2cc0: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
2cd0: 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
2ce0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
2cf0: 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
2d00: 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
2d10: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
2d20: 6e 74 66 28 64 62 2c 20 22 74 79 70 65 3d 27 74  ntf(db, "type='t
2d30: 72 69 67 67 65 72 27 20 41 4e 44 20 6e 61 6d 65  rigger' AND name
2d40: 3d 27 25 71 27 22 2c 20 7a 4e 61 6d 65 29 29 3b  ='%q'", zName));
2d50: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e  .  }..  if( db->
2d60: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
2d70: 20 54 72 69 67 67 65 72 20 2a 70 4c 69 6e 6b 20   Trigger *pLink 
2d80: 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 48 61 73  = pTrig;.    Has
2d90: 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e  h *pHash = &db->
2da0: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
2db0: 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20  ->trigHash;.    
2dc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
2dd0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
2de0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
2df0: 20 20 70 54 72 69 67 20 3d 20 73 71 6c 69 74 65    pTrig = sqlite
2e00: 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
2e10: 68 2c 20 7a 4e 61 6d 65 2c 20 70 54 72 69 67 29  h, zName, pTrig)
2e20: 3b 0a 20 20 20 20 69 66 28 20 70 54 72 69 67 20  ;.    if( pTrig 
2e30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e40: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
2e50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 6e    }else if( pLin
2e60: 6b 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 4c 69 6e  k->pSchema==pLin
2e70: 6b 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 29 7b  k->pTabSchema ){
2e80: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
2e90: 61 62 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  ab;.      pTab =
2ea0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
2eb0: 28 26 70 4c 69 6e 6b 2d 3e 70 54 61 62 53 63 68  (&pLink->pTabSch
2ec0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 4c  ema->tblHash, pL
2ed0: 69 6e 6b 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 20  ink->table);.   
2ee0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
2ef0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 6e  =0 );.      pLin
2f00: 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  k->pNext = pTab-
2f10: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20  >pTrigger;.     
2f20: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 20   pTab->pTrigger 
2f30: 3d 20 70 4c 69 6e 6b 3b 0a 20 20 20 20 7d 0a 20  = pLink;.    }. 
2f40: 20 7d 0a 0a 74 72 69 67 67 65 72 66 69 6e 69 73   }..triggerfinis
2f50: 68 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  h_cleanup:.  sql
2f60: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
2f70: 72 28 64 62 2c 20 70 54 72 69 67 29 3b 0a 20 20  r(db, pTrig);.  
2f80: 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d  assert( !pParse-
2f90: 3e 70 4e 65 77 54 72 69 67 67 65 72 20 29 3b 0a  >pNewTrigger );.
2fa0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
2fb0: 72 69 67 67 65 72 53 74 65 70 28 64 62 2c 20 70  riggerStep(db, p
2fc0: 53 74 65 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  StepList);.}../*
2fd0: 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61 20  .** Duplicate a 
2fe0: 72 61 6e 67 65 20 6f 66 20 74 65 78 74 20 66 72  range of text fr
2ff0: 6f 6d 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  om an SQL statem
3000: 65 6e 74 2c 20 74 68 65 6e 20 63 6f 6e 76 65 72  ent, then conver
3010: 74 20 61 6c 6c 0a 2a 2a 20 77 68 69 74 65 73 70  t all.** whitesp
3020: 61 63 65 20 63 68 61 72 61 63 74 65 72 73 20 69  ace characters i
3030: 6e 74 6f 20 6f 72 64 69 6e 61 72 79 20 73 70 61  nto ordinary spa
3040: 63 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  ce characters..*
3050: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 74  /.static char *t
3060: 72 69 67 67 65 72 53 70 61 6e 44 75 70 28 73 71  riggerSpanDup(sq
3070: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
3080: 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 63   char *zStart, c
3090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 29  onst char *zEnd)
30a0: 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  {.  char *z = sq
30b0: 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70 28 64  lite3DbSpanDup(d
30c0: 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29  b, zStart, zEnd)
30d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
30e0: 20 7a 20 29 20 66 6f 72 28 69 3d 30 3b 20 7a 5b   z ) for(i=0; z[
30f0: 69 5d 3b 20 69 2b 2b 29 20 69 66 28 20 73 71 6c  i]; i++) if( sql
3100: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
3110: 29 20 29 20 7a 5b 69 5d 20 3d 20 27 20 27 3b 0a  ) ) z[i] = ' ';.
3120: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 20 20 20    return z;.}   
3130: 20 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20   ../*.** Turn a 
3140: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3150: 20 28 74 68 61 74 20 74 68 65 20 70 53 65 6c 65   (that the pSele
3160: 63 74 20 70 61 72 61 6d 65 74 65 72 20 70 6f 69  ct parameter poi
3170: 6e 74 73 20 74 6f 29 20 69 6e 74 6f 0a 2a 2a 20  nts to) into.** 
3180: 61 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20  a trigger step. 
3190: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
31a0: 72 20 74 6f 20 61 20 54 72 69 67 67 65 72 53 74  r to a TriggerSt
31b0: 65 70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ep structure..**
31c0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
31d0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
31e0: 65 20 77 68 65 6e 20 69 74 20 66 69 6e 64 73 20  e when it finds 
31f0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
3200: 6e 74 20 69 6e 0a 2a 2a 20 62 6f 64 79 20 6f 66  nt in.** body of
3210: 20 61 20 54 52 49 47 47 45 52 2e 20 20 0a 2a 2f   a TRIGGER.  .*/
3220: 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71  .TriggerStep *sq
3230: 6c 69 74 65 33 54 72 69 67 67 65 72 53 65 6c 65  lite3TriggerSele
3240: 63 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  ctStep(.  sqlite
3250: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
3260: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
3270: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
3280: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
3290: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
32a0: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
32b0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
32c0: 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20   char *zStart,  
32d0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
32e0: 6f 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 20  of SQL text */. 
32f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
3300: 64 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d            /* 
3310: 45 6e 64 20 6f 66 20 53 51 4c 20 74 65 78 74 20  End of SQL text 
3320: 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53  */.){.  TriggerS
3330: 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65  tep *pTriggerSte
3340: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
3350: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
3360: 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29 29  of(TriggerStep))
3370: 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  ;.  if( pTrigger
3380: 53 74 65 70 3d 3d 30 20 29 20 7b 0a 20 20 20 20  Step==0 ) {.    
3390: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
33a0: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
33b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
33c0: 20 20 7d 0a 20 20 70 54 72 69 67 67 65 72 53 74    }.  pTriggerSt
33d0: 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45  ep->op = TK_SELE
33e0: 43 54 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  CT;.  pTriggerSt
33f0: 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  ep->pSelect = pS
3400: 65 6c 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65  elect;.  pTrigge
3410: 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20  rStep->orconf = 
3420: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 70 54  OE_Default;.  pT
3430: 72 69 67 67 65 72 53 74 65 70 2d 3e 7a 53 70 61  riggerStep->zSpa
3440: 6e 20 3d 20 74 72 69 67 67 65 72 53 70 61 6e 44  n = triggerSpanD
3450: 75 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a  up(db, zStart, z
3460: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  End);.  return p
3470: 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a  TriggerStep;.}..
3480: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
3490: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 20 6e  pace to hold a n
34a0: 65 77 20 74 72 69 67 67 65 72 20 73 74 65 70 2e  ew trigger step.
34b0: 20 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 64 20    The allocated 
34c0: 73 70 61 63 65 0a 2a 2a 20 68 6f 6c 64 73 20 62  space.** holds b
34d0: 6f 74 68 20 74 68 65 20 54 72 69 67 67 65 72 53  oth the TriggerS
34e0: 74 65 70 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  tep object and t
34f0: 68 65 20 54 72 69 67 67 65 72 53 74 65 70 2e 74  he TriggerStep.t
3500: 61 72 67 65 74 2e 7a 20 73 74 72 69 6e 67 2e 0a  arget.z string..
3510: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
3520: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
3530: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
3540: 6e 64 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  nd db->mallocFai
3550: 6c 65 64 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  led is set..*/.s
3560: 74 61 74 69 63 20 54 72 69 67 67 65 72 53 74 65  tatic TriggerSte
3570: 70 20 2a 74 72 69 67 67 65 72 53 74 65 70 41 6c  p *triggerStepAl
3580: 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
3590: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
35a0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
35b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
35c0: 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20    u8 op,        
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35e0: 20 54 72 69 67 67 65 72 20 6f 70 63 6f 64 65 20   Trigger opcode 
35f0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
3600: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
3610: 20 2f 2a 20 54 68 65 20 74 61 72 67 65 74 20 6e   /* The target n
3620: 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ame */.  const c
3630: 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20  har *zStart,    
3640: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
3650: 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 20 20 63   SQL text */.  c
3660: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20  onst char *zEnd 
3670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
3680: 64 20 6f 66 20 53 51 4c 20 74 65 78 74 20 2a 2f  d of SQL text */
3690: 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65  .){.  TriggerSte
36a0: 70 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b  p *pTriggerStep;
36b0: 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ..  pTriggerStep
36c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
36d0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
36e0: 66 28 54 72 69 67 67 65 72 53 74 65 70 29 20 2b  f(TriggerStep) +
36f0: 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 31 29 3b 0a   pName->n + 1);.
3700: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
3710: 65 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ep ){.    char *
3720: 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 54 72 69  z = (char*)&pTri
3730: 67 67 65 72 53 74 65 70 5b 31 5d 3b 0a 20 20 20  ggerStep[1];.   
3740: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d 65   memcpy(z, pName
3750: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
3760: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
3770: 74 65 28 7a 29 3b 0a 20 20 20 20 70 54 72 69 67  te(z);.    pTrig
3780: 67 65 72 53 74 65 70 2d 3e 7a 54 61 72 67 65 74  gerStep->zTarget
3790: 20 3d 20 7a 3b 0a 20 20 20 20 70 54 72 69 67 67   = z;.    pTrigg
37a0: 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 6f 70 3b  erStep->op = op;
37b0: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
37c0: 70 2d 3e 7a 53 70 61 6e 20 3d 20 74 72 69 67 67  p->zSpan = trigg
37d0: 65 72 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53  erSpanDup(db, zS
37e0: 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d  tart, zEnd);.  }
37f0: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67  .  return pTrigg
3800: 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erStep;.}../*.**
3810: 20 42 75 69 6c 64 20 61 20 74 72 69 67 67 65 72   Build a trigger
3820: 20 73 74 65 70 20 6f 75 74 20 6f 66 20 61 6e 20   step out of an 
3830: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
3840: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
3850: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65  ter.** to the ne
3860: 77 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 0a  w trigger step..
3870: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
3880: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
3890: 69 6e 65 20 77 68 65 6e 20 69 74 20 73 65 65 73  ine when it sees
38a0: 20 61 6e 20 49 4e 53 45 52 54 20 69 6e 73 69 64   an INSERT insid
38b0: 65 20 74 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66  e the.** body of
38c0: 20 61 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 54   a trigger..*/.T
38d0: 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69  riggerStep *sqli
38e0: 74 65 33 54 72 69 67 67 65 72 49 6e 73 65 72 74  te3TriggerInsert
38f0: 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 20  Step(.  sqlite3 
3900: 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  *db,        /* T
3910: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
3920: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
3930: 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20  n *pTableName,  
3940: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3950: 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
3960: 77 65 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 49  we insert */.  I
3970: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20  dList *pColumn, 
3980: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
3990: 6c 75 6d 6e 73 20 69 6e 20 70 54 61 62 6c 65 4e  lumns in pTableN
39a0: 61 6d 65 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ame to insert in
39b0: 74 6f 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  to */.  Select *
39c0: 70 53 65 6c 65 63 74 2c 20 20 20 20 2f 2a 20 41  pSelect,    /* A
39d0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
39e0: 74 20 74 68 61 74 20 73 75 70 70 6c 69 65 73 20  t that supplies 
39f0: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 6f  values */.  u8 o
3a00: 72 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20  rconf,          
3a10: 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20  /* The conflict 
3a20: 61 6c 67 6f 72 69 74 68 6d 20 28 4f 45 5f 41 62  algorithm (OE_Ab
3a30: 6f 72 74 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ort, OE_Replace,
3a40: 20 65 74 63 2e 29 20 2a 2f 0a 20 20 55 70 73 65   etc.) */.  Upse
3a50: 72 74 20 2a 70 55 70 73 65 72 74 2c 20 20 20 20  rt *pUpsert,    
3a60: 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  /* ON CONFLICT c
3a70: 6c 61 75 73 65 73 20 66 6f 72 20 75 70 73 65 72  lauses for upser
3a80: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
3a90: 72 20 2a 7a 53 74 61 72 74 2c 20 2f 2a 20 53 74  r *zStart, /* St
3aa0: 61 72 74 20 6f 66 20 53 51 4c 20 74 65 78 74 20  art of SQL text 
3ab0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
3ac0: 2a 7a 45 6e 64 20 20 20 20 2f 2a 20 45 6e 64 20  *zEnd    /* End 
3ad0: 6f 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 29  of SQL text */.)
3ae0: 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20  {.  TriggerStep 
3af0: 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 0a  *pTriggerStep;..
3b00: 20 20 61 73 73 65 72 74 28 70 53 65 6c 65 63 74    assert(pSelect
3b10: 20 21 3d 20 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   != 0 || db->mal
3b20: 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 0a 20 20 70  locFailed);..  p
3b30: 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 74 72  TriggerStep = tr
3b40: 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63 61 74  iggerStepAllocat
3b50: 65 28 64 62 2c 20 54 4b 5f 49 4e 53 45 52 54 2c  e(db, TK_INSERT,
3b60: 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 53 74   pTableName, zSt
3b70: 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 69 66  art, zEnd);.  if
3b80: 28 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29  ( pTriggerStep )
3b90: 7b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  {.    pTriggerSt
3ba0: 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  ep->pSelect = sq
3bb0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
3bc0: 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52  b, pSelect, EXPR
3bd0: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
3be0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
3bf0: 49 64 4c 69 73 74 20 3d 20 70 43 6f 6c 75 6d 6e  IdList = pColumn
3c00: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
3c10: 65 70 2d 3e 70 55 70 73 65 72 74 20 3d 20 70 55  ep->pUpsert = pU
3c20: 70 73 65 72 74 3b 0a 20 20 20 20 70 54 72 69 67  psert;.    pTrig
3c30: 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20  gerStep->orconf 
3c40: 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 7d 65 6c 73  = orconf;.  }els
3c50: 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e{.    testcase(
3c60: 20 70 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20   pColumn );.    
3c70: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
3c80: 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 29  ete(db, pColumn)
3c90: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
3ca0: 70 55 70 73 65 72 74 20 29 3b 0a 20 20 20 20 73  pUpsert );.    s
3cb0: 71 6c 69 74 65 33 55 70 73 65 72 74 44 65 6c 65  qlite3UpsertDele
3cc0: 74 65 28 64 62 2c 20 70 55 70 73 65 72 74 29 3b  te(db, pUpsert);
3cd0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
3ce0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
3cf0: 53 65 6c 65 63 74 29 3b 0a 0a 20 20 72 65 74 75  Select);..  retu
3d00: 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b  rn pTriggerStep;
3d10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
3d20: 75 63 74 20 61 20 74 72 69 67 67 65 72 20 73 74  uct a trigger st
3d30: 65 70 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ep that implemen
3d40: 74 73 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  ts an UPDATE sta
3d50: 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72  tement and retur
3d60: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
3d70: 6f 20 74 68 61 74 20 74 72 69 67 67 65 72 20 73  o that trigger s
3d80: 74 65 70 2e 20 20 54 68 65 20 70 61 72 73 65 72  tep.  The parser
3d90: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
3da0: 69 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73  ine when it.** s
3db0: 65 65 73 20 61 6e 20 55 50 44 41 54 45 20 73 74  ees an UPDATE st
3dc0: 61 74 65 6d 65 6e 74 20 69 6e 73 69 64 65 20 74  atement inside t
3dd0: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 43 52 45  he body of a CRE
3de0: 41 54 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a  ATE TRIGGER..*/.
3df0: 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c  TriggerStep *sql
3e00: 69 74 65 33 54 72 69 67 67 65 72 55 70 64 61 74  ite3TriggerUpdat
3e10: 65 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  eStep(.  sqlite3
3e20: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
3e30: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
3e40: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
3e50: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c  ken *pTableName,
3e60: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3e70: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 75 70  e table to be up
3e80: 64 61 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  dated */.  ExprL
3e90: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
3ea0: 2f 2a 20 54 68 65 20 53 45 54 20 63 6c 61 75 73  /* The SET claus
3eb0: 65 3a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  e: list of colum
3ec0: 6e 20 61 6e 64 20 6e 65 77 20 76 61 6c 75 65 73  n and new values
3ed0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
3ee0: 72 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  re,        /* Th
3ef0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
3f00: 2f 0a 20 20 75 38 20 6f 72 63 6f 6e 66 2c 20 20  /.  u8 orconf,  
3f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3f20: 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74  conflict algorit
3f30: 68 6d 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f  hm. (OE_Abort, O
3f40: 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 20 2a  E_Ignore, etc) *
3f50: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3f60: 7a 53 74 61 72 74 2c 20 20 2f 2a 20 53 74 61 72  zStart,  /* Star
3f70: 74 20 6f 66 20 53 51 4c 20 74 65 78 74 20 2a 2f  t of SQL text */
3f80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3f90: 45 6e 64 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  End     /* End o
3fa0: 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 29 7b  f SQL text */.){
3fb0: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
3fc0: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 0a 20  pTriggerStep;.. 
3fd0: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20   pTriggerStep = 
3fe0: 74 72 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63  triggerStepAlloc
3ff0: 61 74 65 28 64 62 2c 20 54 4b 5f 55 50 44 41 54  ate(db, TK_UPDAT
4000: 45 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  E, pTableName, z
4010: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
4020: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70  if( pTriggerStep
4030: 20 29 7b 0a 20 20 20 20 70 54 72 69 67 67 65 72   ){.    pTrigger
4040: 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 20  Step->pExprList 
4050: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
4060: 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c  tDup(db, pEList,
4070: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
4080: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
4090: 65 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ep->pWhere = sql
40a0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
40b0: 70 57 68 65 72 65 2c 20 45 58 50 52 44 55 50 5f  pWhere, EXPRDUP_
40c0: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 70 54 72  REDUCE);.    pTr
40d0: 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e  iggerStep->orcon
40e0: 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 7d 0a  f = orconf;.  }.
40f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4100: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69  tDelete(db, pELi
4110: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  st);.  sqlite3Ex
4120: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 68  prDelete(db, pWh
4130: 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ere);.  return p
4140: 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a  TriggerStep;.}..
4150: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
4160: 61 20 74 72 69 67 67 65 72 20 73 74 65 70 20 74  a trigger step t
4170: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  hat implements a
4180: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
4190: 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  t and return.** 
41a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61  a pointer to tha
41b0: 74 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20  t trigger step. 
41c0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
41d0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
41e0: 68 65 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20 61  hen it.** sees a
41f0: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
4200: 74 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64  t inside the bod
4210: 79 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 52  y of a CREATE TR
4220: 49 47 47 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65  IGGER..*/.Trigge
4230: 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72  rStep *sqlite3Tr
4240: 69 67 67 65 72 44 65 6c 65 74 65 53 74 65 70 28  iggerDeleteStep(
4250: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
4260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
4270: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4280: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  n */.  Token *pT
4290: 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 20 2f  ableName,      /
42a0: 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  * The table from
42b0: 20 77 68 69 63 68 20 72 6f 77 73 20 61 72 65 20   which rows are 
42c0: 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 45 78 70  deleted */.  Exp
42d0: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
42e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
42f0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 63 6f  E clause */.  co
4300: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74  nst char *zStart
4310: 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f  ,     /* Start o
4320: 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 20 20  f SQL text */.  
4330: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64  const char *zEnd
4340: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
4350: 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 29 7b  f SQL text */.){
4360: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
4370: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 0a 20  pTriggerStep;.. 
4380: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20   pTriggerStep = 
4390: 74 72 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63  triggerStepAlloc
43a0: 61 74 65 28 64 62 2c 20 54 4b 5f 44 45 4c 45 54  ate(db, TK_DELET
43b0: 45 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  E, pTableName, z
43c0: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
43d0: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70  if( pTriggerStep
43e0: 20 29 7b 0a 20 20 20 20 70 54 72 69 67 67 65 72   ){.    pTrigger
43f0: 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d 20 73  Step->pWhere = s
4400: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
4410: 2c 20 70 57 68 65 72 65 2c 20 45 58 50 52 44 55  , pWhere, EXPRDU
4420: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 70  P_REDUCE);.    p
4430: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63  TriggerStep->orc
4440: 6f 6e 66 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74  onf = OE_Default
4450: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
4460: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57  xprDelete(db, pW
4470: 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  here);.  return 
4480: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a  pTriggerStep;.}.
4490: 0a 2f 2a 20 0a 2a 2a 20 52 65 63 75 72 73 69 76  ./* .** Recursiv
44a0: 65 6c 79 20 64 65 6c 65 74 65 20 61 20 54 72 69  ely delete a Tri
44b0: 67 67 65 72 20 73 74 72 75 63 74 75 72 65 0a 2a  gger structure.*
44c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
44d0: 6c 65 74 65 54 72 69 67 67 65 72 28 73 71 6c 69  leteTrigger(sqli
44e0: 74 65 33 20 2a 64 62 2c 20 54 72 69 67 67 65 72  te3 *db, Trigger
44f0: 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 20 69   *pTrigger){.  i
4500: 66 28 20 70 54 72 69 67 67 65 72 3d 3d 30 20 29  f( pTrigger==0 )
4510: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
4520: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 53  e3DeleteTriggerS
4530: 74 65 70 28 64 62 2c 20 70 54 72 69 67 67 65 72  tep(db, pTrigger
4540: 2d 3e 73 74 65 70 5f 6c 69 73 74 29 3b 0a 20 20  ->step_list);.  
4550: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4560: 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d  , pTrigger->zNam
4570: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
4580: 72 65 65 28 64 62 2c 20 70 54 72 69 67 67 65 72  ree(db, pTrigger
4590: 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69  ->table);.  sqli
45a0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
45b0: 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65  , pTrigger->pWhe
45c0: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  n);.  sqlite3IdL
45d0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
45e0: 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73  rigger->pColumns
45f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4600: 65 65 28 64 62 2c 20 70 54 72 69 67 67 65 72 29  ee(db, pTrigger)
4610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4620: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4630: 65 64 20 74 6f 20 64 72 6f 70 20 61 20 74 72 69  ed to drop a tri
4640: 67 67 65 72 20 66 72 6f 6d 20 74 68 65 20 64 61  gger from the da
4650: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 0a  tabase schema. .
4660: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20 62  **.** This may b
4670: 65 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c  e called directl
4680: 79 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65  y from the parse
4690: 72 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  r and therefore 
46a0: 69 64 65 6e 74 69 66 69 65 73 0a 2a 2a 20 74 68  identifies.** th
46b0: 65 20 74 72 69 67 67 65 72 20 62 79 20 6e 61 6d  e trigger by nam
46c0: 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 44  e.  The sqlite3D
46d0: 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 29 20  ropTriggerPtr() 
46e0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
46f0: 0a 2a 2a 20 73 61 6d 65 20 6a 6f 62 20 61 73 20  .** same job as 
4700: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78 63  this routine exc
4710: 65 70 74 20 69 74 20 74 61 6b 65 73 20 61 20 70  ept it takes a p
4720: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 72  ointer to the tr
4730: 69 67 67 65 72 0a 2a 2a 20 69 6e 73 74 65 61 64  igger.** instead
4740: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
4750: 6e 61 6d 65 2e 0a 2a 2a 2f 0a 76 6f 69 64 20 73  name..**/.void s
4760: 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
4770: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
4780: 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
4790: 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54   int noErr){.  T
47a0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
47b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
47c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
47d0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
47e0: 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  zName;.  sqlite3
47f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4800: 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b;..  if( db->ma
4810: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
4820: 6f 20 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63  o drop_trigger_c
4830: 6c 65 61 6e 75 70 3b 0a 20 20 69 66 28 20 53 51  leanup;.  if( SQ
4840: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
4850: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
4860: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64  e) ){.    goto d
4870: 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61  rop_trigger_clea
4880: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  nup;.  }..  asse
4890: 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
48a0: 3d 31 20 29 3b 0a 20 20 7a 44 62 20 3d 20 70 4e  =1 );.  zDb = pN
48b0: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
48c0: 61 73 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70  ase;.  zName = p
48d0: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
48e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21  ;.  assert( zDb!
48f0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
4900: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
4910: 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69  s(db) );.  for(i
4920: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
4930: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4940: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
4950: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20   ? i^1 : i;  /* 
4960: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
4970: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69  re MAIN */.    i
4980: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
4990: 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62  3StrICmp(db->aDb
49a0: 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 44  [j].zDbSName, zD
49b0: 62 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  b) ) continue;. 
49c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
49d0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
49e0: 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20  d(db, j, 0) );. 
49f0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71     pTrigger = sq
4a00: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 28  lite3HashFind(&(
4a10: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
4a20: 6d 61 2d 3e 74 72 69 67 48 61 73 68 29 2c 20 7a  ma->trigHash), z
4a30: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
4a40: 54 72 69 67 67 65 72 20 29 20 62 72 65 61 6b 3b  Trigger ) break;
4a50: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 54 72 69  .  }.  if( !pTri
4a60: 67 67 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20  gger ){.    if( 
4a70: 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20  !noErr ){.      
4a80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4a90: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
4aa0: 20 74 72 69 67 67 65 72 3a 20 25 53 22 2c 20 70   trigger: %S", p
4ab0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  Name, 0);.    }e
4ac0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
4ad0: 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
4ae0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
4af0: 7a 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zDb);.    }.    
4b00: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
4b10: 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
4b20: 6f 20 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63  o drop_trigger_c
4b30: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 71  leanup;.  }.  sq
4b40: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
4b50: 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
4b60: 67 67 65 72 29 3b 0a 0a 64 72 6f 70 5f 74 72 69  gger);..drop_tri
4b70: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  gger_cleanup:.  
4b80: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
4b90: 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
4ba0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4bb0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4bc0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
4bd0: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
4be0: 74 68 61 74 20 61 20 74 72 69 67 67 65 72 0a 2a  that a trigger.*
4bf0: 2a 20 69 73 20 73 65 74 20 6f 6e 2e 0a 2a 2f 0a  * is set on..*/.
4c00: 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 74 61  static Table *ta
4c10: 62 6c 65 4f 66 54 72 69 67 67 65 72 28 54 72 69  bleOfTrigger(Tri
4c20: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 29 7b  gger *pTrigger){
4c30: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4c40: 33 48 61 73 68 46 69 6e 64 28 26 70 54 72 69 67  3HashFind(&pTrig
4c50: 67 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 2d  ger->pTabSchema-
4c60: 3e 74 62 6c 48 61 73 68 2c 20 70 54 72 69 67 67  >tblHash, pTrigg
4c70: 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 7d 0a 0a 0a  er->table);.}...
4c80: 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 74 72 69  /*.** Drop a tri
4c90: 67 67 65 72 20 67 69 76 65 6e 20 61 20 70 6f 69  gger given a poi
4ca0: 6e 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69  nter to that tri
4cb0: 67 67 65 72 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  gger. .*/.void s
4cc0: 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
4cd0: 72 50 74 72 28 50 61 72 73 65 20 2a 70 50 61 72  rPtr(Parse *pPar
4ce0: 73 65 2c 20 54 72 69 67 67 65 72 20 2a 70 54 72  se, Trigger *pTr
4cf0: 69 67 67 65 72 29 7b 0a 20 20 54 61 62 6c 65 20  igger){.  Table 
4d00: 20 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62    *pTable;.  Vdb
4d10: 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
4d20: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4d30: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
4d40: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
4d50: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
4d60: 65 2d 3e 64 62 2c 20 70 54 72 69 67 67 65 72 2d  e->db, pTrigger-
4d70: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73  >pSchema);.  ass
4d80: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
4d90: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
4da0: 70 54 61 62 6c 65 20 3d 20 74 61 62 6c 65 4f 66  pTable = tableOf
4db0: 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72  Trigger(pTrigger
4dc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
4dd0: 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
4de0: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
4df0: 3d 3d 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68  ==pTrigger->pSch
4e00: 65 6d 61 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  ema || iDb==1 );
4e10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4e20: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
4e30: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
4e40: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
4e50: 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 63  P_TRIGGER;.    c
4e60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
4e70: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
4e80: 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  bSName;.    cons
4e90: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
4ea0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
4eb0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31  ;.    if( iDb==1
4ec0: 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
4ed0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  _DROP_TEMP_TRIGG
4ee0: 45 52 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ER;.    if( sqli
4ef0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
4f00: 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 72 69 67  rse, code, pTrig
4f10: 67 65 72 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  ger->zName, pTab
4f20: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  le->zName, zDb) 
4f30: 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ||.      sqlite3
4f40: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
4f50: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
4f60: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
4f70: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
4f80: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
4f90: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
4fa0: 63 6f 64 65 20 74 6f 20 64 65 73 74 72 6f 79 20  code to destroy 
4fb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 63  the database rec
4fc0: 6f 72 64 20 6f 66 20 74 68 65 20 74 72 69 67 67  ord of the trigg
4fd0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  er..  */.  asser
4fe0: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a  t( pTable!=0 );.
4ff0: 20 20 69 66 28 20 28 76 20 3d 20 73 71 6c 69 74    if( (v = sqlit
5000: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
5010: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
5020: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
5030: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
5040: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
5050: 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20  s WHERE name=%Q 
5060: 41 4e 44 20 74 79 70 65 3d 27 74 72 69 67 67 65  AND type='trigge
5070: 72 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  r'",.       db->
5080: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
5090: 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
50a0: 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 0a  pTrigger->zName.
50b0: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
50c0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
50d0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
50e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
50f0: 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 72 69  p4(v, OP_DropTri
5100: 67 67 65 72 2c 20 69 44 62 2c 20 30 2c 20 30 2c  gger, iDb, 0, 0,
5110: 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65   pTrigger->zName
5120: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
5130: 2a 2a 20 52 65 6d 6f 76 65 20 61 20 74 72 69 67  ** Remove a trig
5140: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ger from the has
5150: 68 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  h tables of the 
5160: 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 2e  sqlite* pointer.
5170: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5180: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
5190: 72 69 67 67 65 72 28 73 71 6c 69 74 65 33 20 2a  rigger(sqlite3 *
51a0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
51b0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
51c0: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
51d0: 67 67 65 72 3b 0a 20 20 48 61 73 68 20 2a 70 48  gger;.  Hash *pH
51e0: 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ash;..  assert( 
51f0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
5200: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
5210: 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20  0) );.  pHash = 
5220: 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  &(db->aDb[iDb].p
5230: 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68  Schema->trigHash
5240: 29 3b 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  );.  pTrigger = 
5250: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
5260: 74 28 70 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  t(pHash, zName, 
5270: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
5280: 28 70 54 72 69 67 67 65 72 29 20 29 7b 0a 20 20  (pTrigger) ){.  
5290: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e    if( pTrigger->
52a0: 70 53 63 68 65 6d 61 3d 3d 70 54 72 69 67 67 65  pSchema==pTrigge
52b0: 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 29 7b  r->pTabSchema ){
52c0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
52d0: 61 62 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 67  ab = tableOfTrig
52e0: 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20  ger(pTrigger);. 
52f0: 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 2a 70       Trigger **p
5300: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d  p;.      for(pp=
5310: 26 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b  &pTab->pTrigger;
5320: 20 2a 70 70 21 3d 70 54 72 69 67 67 65 72 3b 20   *pp!=pTrigger; 
5330: 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78  pp=&((*pp)->pNex
5340: 74 29 29 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d  t));.      *pp =
5350: 20 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b 0a 20   (*pp)->pNext;. 
5360: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5370: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62  DeleteTrigger(db
5380: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  , pTrigger);.   
5390: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d   db->mDbFlags |=
53a0: 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
53b0: 61 6e 67 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ange;.  }.}../*.
53c0: 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 74 68 65  ** pEList is the
53d0: 20 53 45 54 20 63 6c 61 75 73 65 20 6f 66 20 61   SET clause of a
53e0: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
53f0: 6e 74 2e 20 20 45 61 63 68 20 65 6e 74 72 79 0a  nt.  Each entry.
5400: 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 69 73 20  ** in pEList is 
5410: 6f 66 20 74 68 65 20 66 6f 72 6d 61 74 20 3c 69  of the format <i
5420: 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49 66 20 61  d>=<expr>.  If a
5430: 6e 79 20 6f 66 20 74 68 65 20 65 6e 74 72 69 65  ny of the entrie
5440: 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 68  s.** in pEList h
5450: 61 76 65 20 61 6e 20 3c 69 64 3e 20 77 68 69 63  ave an <id> whic
5460: 68 20 6d 61 74 63 68 65 73 20 61 6e 20 69 64 65  h matches an ide
5470: 6e 74 69 66 69 65 72 20 69 6e 20 70 49 64 4c 69  ntifier in pIdLi
5480: 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  st,.** then retu
5490: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 70 49 64  rn TRUE.  If pId
54a0: 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  List==NULL, then
54b0: 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65   it is considere
54c0: 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61 72 64 20  d a.** wildcard 
54d0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79  that matches any
54e0: 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77 69 73 65  thing.  Likewise
54f0: 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55 4c 4c   if pEList==NULL
5500: 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d 61 74 63   then.** it matc
5510: 68 65 73 20 61 6e 79 74 68 69 6e 67 20 73 6f 20  hes anything so 
5520: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 72  always return tr
5530: 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ue.  Return fals
5540: 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 65  e only.** if the
5550: 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2e 0a  re is no match..
5560: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
5570: 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70  eckColumnOverlap
5580: 28 49 64 4c 69 73 74 20 2a 70 49 64 4c 69 73 74  (IdList *pIdList
5590: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
55a0: 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b 0a 20 20  st){.  int e;.  
55b0: 69 66 28 20 70 49 64 4c 69 73 74 3d 3d 30 20 7c  if( pIdList==0 |
55c0: 7c 20 4e 45 56 45 52 28 70 45 4c 69 73 74 3d 3d  | NEVER(pEList==
55d0: 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
55e0: 20 66 6f 72 28 65 3d 30 3b 20 65 3c 70 45 4c 69   for(e=0; e<pELi
55f0: 73 74 2d 3e 6e 45 78 70 72 3b 20 65 2b 2b 29 7b  st->nExpr; e++){
5600: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
5610: 49 64 4c 69 73 74 49 6e 64 65 78 28 70 49 64 4c  IdListIndex(pIdL
5620: 69 73 74 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 65  ist, pEList->a[e
5630: 5d 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 20 72 65  ].zName)>=0 ) re
5640: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
5650: 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  turn 0; .}../*.*
5660: 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  * Return a list 
5670: 6f 66 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  of all triggers 
5680: 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 20 69 66  on table pTab if
5690: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 74   there exists at
56a0: 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 74 72   least.** one tr
56b0: 69 67 67 65 72 20 74 68 61 74 20 6d 75 73 74 20  igger that must 
56c0: 62 65 20 66 69 72 65 64 20 77 68 65 6e 20 61 6e  be fired when an
56d0: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 79   operation of ty
56e0: 70 65 20 27 6f 70 27 20 69 73 20 0a 2a 2a 20 70  pe 'op' is .** p
56f0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
5700: 74 61 62 6c 65 2c 20 61 6e 64 2c 20 69 66 20 74  table, and, if t
5710: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  hat operation is
5720: 20 61 6e 20 55 50 44 41 54 45 2c 20 69 66 20 61   an UPDATE, if a
5730: 74 0a 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20 6f  t.** least one o
5740: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
5750: 20 70 43 68 61 6e 67 65 73 20 69 73 20 62 65 69   pChanges is bei
5760: 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a  ng modified..*/.
5770: 54 72 69 67 67 65 72 20 2a 73 71 6c 69 74 65 33  Trigger *sqlite3
5780: 54 72 69 67 67 65 72 73 45 78 69 73 74 28 0a 20  TriggersExist(. 
5790: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
57a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
57b0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
57c0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
57d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
57e0: 62 6c 65 20 74 68 65 20 63 6f 6e 74 61 69 6e 73  ble the contains
57f0: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 2a 2f   the triggers */
5800: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
5810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e             /* on
5820: 65 20 6f 66 20 54 4b 5f 44 45 4c 45 54 45 2c 20  e of TK_DELETE, 
5830: 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50  TK_INSERT, TK_UP
5840: 44 41 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69  DATE */.  ExprLi
5850: 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 20  st *pChanges,   
5860: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74 68 61    /* Columns tha
5870: 74 20 63 68 61 6e 67 65 20 69 6e 20 61 6e 20 55  t change in an U
5880: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
5890: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4d 61 73 6b 20  */.  int *pMask 
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
58b0: 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 54 52 49  OUT: Mask of TRI
58c0: 47 47 45 52 5f 42 45 46 4f 52 45 7c 54 52 49 47  GGER_BEFORE|TRIG
58d0: 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 29 7b 0a  GER_AFTER */.){.
58e0: 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a    int mask = 0;.
58f0: 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 73 74    Trigger *pList
5900: 20 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72 20   = 0;.  Trigger 
5910: 2a 70 3b 0a 0a 20 20 69 66 28 20 28 70 50 61 72  *p;..  if( (pPar
5920: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
5930: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
5940: 67 67 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  gger)!=0 ){.    
5950: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 54  pList = sqlite3T
5960: 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73  riggerList(pPars
5970: 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20  e, pTab);.  }.  
5980: 61 73 73 65 72 74 28 20 70 4c 69 73 74 3d 3d 30  assert( pList==0
5990: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54   || IsVirtual(pT
59a0: 61 62 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ab)==0 );.  for(
59b0: 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
59c0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
59d0: 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 63 68   p->op==op && ch
59e0: 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70  eckColumnOverlap
59f0: 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70 43  (p->pColumns, pC
5a00: 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20 20 20  hanges) ){.     
5a10: 20 6d 61 73 6b 20 7c 3d 20 70 2d 3e 74 72 5f 74   mask |= p->tr_t
5a20: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  m;.    }.  }.  i
5a30: 66 28 20 70 4d 61 73 6b 20 29 7b 0a 20 20 20 20  f( pMask ){.    
5a40: 2a 70 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 20  *pMask = mask;. 
5a50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 6d 61 73   }.  return (mas
5a60: 6b 20 3f 20 70 4c 69 73 74 20 3a 20 30 29 3b 0a  k ? pList : 0);.
5a70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
5a80: 20 74 68 65 20 70 53 74 65 70 2d 3e 7a 54 61 72   the pStep->zTar
5a90: 67 65 74 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  get string into 
5aa0: 61 20 53 72 63 4c 69 73 74 20 61 6e 64 20 72 65  a SrcList and re
5ab0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
5ac0: 2a 20 74 6f 20 74 68 61 74 20 53 72 63 4c 69 73  * to that SrcLis
5ad0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
5ae0: 75 74 69 6e 65 20 61 64 64 73 20 61 20 73 70 65  utine adds a spe
5af0: 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20 6e  cific database n
5b00: 61 6d 65 2c 20 69 66 20 6e 65 65 64 65 64 2c 20  ame, if needed, 
5b10: 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 77 68  to the target wh
5b20: 65 6e 0a 2a 2a 20 66 6f 72 6d 69 6e 67 20 74 68  en.** forming th
5b30: 65 20 53 72 63 4c 69 73 74 2e 20 20 54 68 69 73  e SrcList.  This
5b40: 20 70 72 65 76 65 6e 74 73 20 61 20 74 72 69 67   prevents a trig
5b50: 67 65 72 20 69 6e 20 6f 6e 65 20 64 61 74 61 62  ger in one datab
5b60: 61 73 65 20 66 72 6f 6d 0a 2a 2a 20 72 65 66 65  ase from.** refe
5b70: 72 72 69 6e 67 20 74 6f 20 61 20 74 61 72 67 65  rring to a targe
5b80: 74 20 69 6e 20 61 6e 6f 74 68 65 72 20 64 61 74  t in another dat
5b90: 61 62 61 73 65 2e 20 20 41 6e 20 65 78 63 65 70  abase.  An excep
5ba0: 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 74 68 65  tion is when the
5bb0: 0a 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20 69  .** trigger is i
5bc0: 6e 20 54 45 4d 50 20 69 6e 20 77 68 69 63 68 20  n TEMP in which 
5bd0: 63 61 73 65 20 69 74 20 63 61 6e 20 72 65 66 65  case it can refe
5be0: 72 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 64  r to any other d
5bf0: 61 74 61 62 61 73 65 20 69 74 0a 2a 2a 20 77 61  atabase it.** wa
5c00: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  nts..*/.static S
5c10: 72 63 4c 69 73 74 20 2a 74 61 72 67 65 74 53 72  rcList *targetSr
5c20: 63 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  cList(.  Parse *
5c30: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
5c40: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
5c50: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
5c60: 72 53 74 65 70 20 2a 70 53 74 65 70 20 20 20 2f  rStep *pStep   /
5c70: 2a 20 54 68 65 20 74 72 69 67 67 65 72 20 63 6f  * The trigger co
5c80: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 72  ntaining the tar
5c90: 67 65 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  get token */.){.
5ca0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5cb0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
5cc0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
5cd0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
5ce0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 75  he database to u
5cf0: 73 65 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  se */.  SrcList 
5d00: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 2f 2a 20  *pSrc;       /* 
5d10: 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 72 65  SrcList to be re
5d20: 74 75 72 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  turned */..  pSr
5d30: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
5d40: 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
5d50: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 72  0, 0);.  if( pSr
5d60: 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
5d70: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 30 20 29 3b   pSrc->nSrc>0 );
5d80: 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 70 53 72  .    pSrc->a[pSr
5d90: 63 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 4e 61 6d 65  c->nSrc-1].zName
5da0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
5db0: 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 7a 54  up(db, pStep->zT
5dc0: 61 72 67 65 74 29 3b 0a 20 20 20 20 69 44 62 20  arget);.    iDb 
5dd0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
5de0: 6f 49 6e 64 65 78 28 64 62 2c 20 70 53 74 65 70  oIndex(db, pStep
5df0: 2d 3e 70 54 72 69 67 2d 3e 70 53 63 68 65 6d 61  ->pTrig->pSchema
5e00: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  );.    if( iDb==
5e10: 30 20 7c 7c 20 69 44 62 3e 3d 32 20 29 7b 0a 20  0 || iDb>=2 ){. 
5e20: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5e30: 2a 7a 44 62 3b 0a 20 20 20 20 20 20 61 73 73 65  *zDb;.      asse
5e40: 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
5e50: 29 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 64  );.      zDb = d
5e60: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
5e70: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 53 72 63  Name;.      pSrc
5e80: 2d 3e 61 5b 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ->a[pSrc->nSrc-1
5e90: 5d 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 20 73  ].zDatabase =  s
5ea0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
5eb0: 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 7d 0a 20  b, zDb);.    }. 
5ec0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63   }.  return pSrc
5ed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
5ee0: 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f  ate VDBE code fo
5ef0: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73  r the statements
5f00: 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79   inside the body
5f10: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 0a 2a 2a   of a single .**
5f20: 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 73 74 61   trigger..*/.sta
5f30: 74 69 63 20 69 6e 74 20 63 6f 64 65 54 72 69 67  tic int codeTrig
5f40: 67 65 72 50 72 6f 67 72 61 6d 28 0a 20 20 50 61  gerProgram(.  Pa
5f50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5f60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5f70: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5f80: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
5f90: 70 53 74 65 70 4c 69 73 74 2c 20 20 20 2f 2a 20  pStepList,   /* 
5fa0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 6d 65 6e  List of statemen
5fb0: 74 73 20 69 6e 73 69 64 65 20 74 68 65 20 74 72  ts inside the tr
5fc0: 69 67 67 65 72 20 62 6f 64 79 20 2a 2f 0a 20 20  igger body */.  
5fd0: 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20  int orconf      
5fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
5ff0: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e  flict algorithm.
6000: 20 28 4f 45 5f 41 62 6f 72 74 2c 20 65 74 63 29   (OE_Abort, etc)
6010: 20 2a 2f 20 20 0a 29 7b 0a 20 20 54 72 69 67 67   */  .){.  Trigg
6020: 65 72 53 74 65 70 20 2a 70 53 74 65 70 3b 0a 20  erStep *pStep;. 
6030: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
6040: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69  e->pVdbe;.  sqli
6050: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6060: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
6070: 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65   pParse->pTrigge
6080: 72 54 61 62 20 26 26 20 70 50 61 72 73 65 2d 3e  rTab && pParse->
6090: 70 54 6f 70 6c 65 76 65 6c 20 29 3b 0a 20 20 61  pToplevel );.  a
60a0: 73 73 65 72 74 28 20 70 53 74 65 70 4c 69 73 74  ssert( pStepList
60b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21   );.  assert( v!
60c0: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 53 74 65  =0 );.  for(pSte
60d0: 70 3d 70 53 74 65 70 4c 69 73 74 3b 20 70 53 74  p=pStepList; pSt
60e0: 65 70 3b 20 70 53 74 65 70 3d 70 53 74 65 70 2d  ep; pStep=pStep-
60f0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20  >pNext){.    /* 
6100: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 4f  Figure out the O
6110: 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63  N CONFLICT polic
6120: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
6130: 73 65 64 20 66 6f 72 20 74 68 69 73 20 73 74 65  sed for this ste
6140: 70 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  p.    ** of the 
6150: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e  trigger program.
6160: 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
6170: 74 20 74 68 61 74 20 63 61 75 73 65 64 20 74 68  t that caused th
6180: 69 73 20 74 72 69 67 67 65 72 0a 20 20 20 20 2a  is trigger.    *
6190: 2a 20 74 6f 20 66 69 72 65 20 68 61 64 20 61 6e  * to fire had an
61a0: 20 65 78 70 6c 69 63 69 74 20 4f 4e 20 43 4f 4e   explicit ON CON
61b0: 46 4c 49 43 54 2c 20 74 68 65 6e 20 75 73 65 20  FLICT, then use 
61c0: 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  it. Otherwise, u
61d0: 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 4e  se.    ** the ON
61e0: 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79   CONFLICT policy
61f0: 20 74 68 61 74 20 77 61 73 20 73 70 65 63 69 66   that was specif
6200: 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
6210: 68 65 20 74 72 69 67 67 65 72 0a 20 20 20 20 2a  he trigger.    *
6220: 2a 20 73 74 65 70 20 73 74 61 74 65 6d 65 6e 74  * step statement
6230: 2e 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  . Example:.    *
6240: 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
6250: 45 20 54 52 49 47 47 45 52 20 41 46 54 45 52 20  E TRIGGER AFTER 
6260: 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47  INSERT ON t1 BEG
6270: 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 49  IN;.    **     I
6280: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
6290: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
62a0: 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20  new.a, new.b);. 
62b0: 20 20 20 2a 2a 20 20 20 45 4e 44 3b 0a 20 20 20     **   END;.   
62c0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 49 4e 53   **.    **   INS
62d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 2e 2e 2e 20  ERT INTO t1 ... 
62e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20  ;            -- 
62f0: 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 32 20 75  insert into t2 u
6300: 73 65 73 20 52 45 50 4c 41 43 45 20 70 6f 6c 69  ses REPLACE poli
6310: 63 79 0a 20 20 20 20 2a 2a 20 20 20 49 4e 53 45  cy.    **   INSE
6320: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
6330: 4f 20 74 31 20 2e 2e 2e 20 3b 20 20 2d 2d 20 69  O t1 ... ;  -- i
6340: 6e 73 65 72 74 20 69 6e 74 6f 20 74 32 20 75 73  nsert into t2 us
6350: 65 73 20 49 47 4e 4f 52 45 20 70 6f 6c 69 63 79  es IGNORE policy
6360: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
6370: 73 65 2d 3e 65 4f 72 63 6f 6e 66 20 3d 20 28 6f  se->eOrconf = (o
6380: 72 63 6f 6e 66 3d 3d 4f 45 5f 44 65 66 61 75 6c  rconf==OE_Defaul
6390: 74 29 3f 70 53 74 65 70 2d 3e 6f 72 63 6f 6e 66  t)?pStep->orconf
63a0: 3a 28 75 38 29 6f 72 63 6f 6e 66 3b 0a 20 20 20  :(u8)orconf;.   
63b0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
63c0: 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 3d 3d  >okConstFactor==
63d0: 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  0 );..#ifndef SQ
63e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
63f0: 20 20 20 20 69 66 28 20 70 53 74 65 70 2d 3e 7a      if( pStep->z
6400: 53 70 61 6e 20 29 7b 0a 20 20 20 20 20 20 73 71  Span ){.      sq
6410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
6420: 76 2c 20 4f 50 5f 54 72 61 63 65 2c 20 30 78 37  v, OP_Trace, 0x7
6430: 66 66 66 66 66 66 66 2c 20 31 2c 20 30 2c 0a 20  fffffff, 1, 0,. 
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6450: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
6460: 72 69 6e 74 66 28 64 62 2c 20 22 2d 2d 20 25 73  rintf(db, "-- %s
6470: 22 2c 20 70 53 74 65 70 2d 3e 7a 53 70 61 6e 29  ", pStep->zSpan)
6480: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6490: 20 20 20 20 20 20 20 20 20 20 50 34 5f 44 59 4e            P4_DYN
64a0: 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  AMIC);.    }.#en
64b0: 64 69 66 0a 0a 20 20 20 20 73 77 69 74 63 68 28  dif..    switch(
64c0: 20 70 53 74 65 70 2d 3e 6f 70 20 29 7b 0a 20 20   pStep->op ){.  
64d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 44 41      case TK_UPDA
64e0: 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  TE: {.        sq
64f0: 6c 69 74 65 33 55 70 64 61 74 65 28 70 50 61 72  lite3Update(pPar
6500: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 74  se, .          t
6510: 61 72 67 65 74 53 72 63 4c 69 73 74 28 70 50 61  argetSrcList(pPa
6520: 72 73 65 2c 20 70 53 74 65 70 29 2c 0a 20 20 20  rse, pStep),.   
6530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6540: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53  prListDup(db, pS
6550: 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 2c 20  tep->pExprList, 
6560: 30 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  0), .          s
6570: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6580: 2c 20 70 53 74 65 70 2d 3e 70 57 68 65 72 65 2c  , pStep->pWhere,
6590: 20 30 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20   0), .          
65a0: 70 50 61 72 73 65 2d 3e 65 4f 72 63 6f 6e 66 2c  pParse->eOrconf,
65b0: 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 20   0, 0, 0.       
65c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
65d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
65e0: 20 63 61 73 65 20 54 4b 5f 49 4e 53 45 52 54 3a   case TK_INSERT:
65f0: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
6600: 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c  e3Insert(pParse,
6610: 20 0a 20 20 20 20 20 20 20 20 20 20 74 61 72 67   .          targ
6620: 65 74 53 72 63 4c 69 73 74 28 70 50 61 72 73 65  etSrcList(pParse
6630: 2c 20 70 53 74 65 70 29 2c 0a 20 20 20 20 20 20  , pStep),.      
6640: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
6650: 74 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e  tDup(db, pStep->
6660: 70 53 65 6c 65 63 74 2c 20 30 29 2c 20 0a 20 20  pSelect, 0), .  
6670: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
6680: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 74  dListDup(db, pSt
6690: 65 70 2d 3e 70 49 64 4c 69 73 74 29 2c 20 0a 20  ep->pIdList), . 
66a0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
66b0: 3e 65 4f 72 63 6f 6e 66 2c 0a 20 20 20 20 20 20  >eOrconf,.      
66c0: 20 20 20 20 73 71 6c 69 74 65 33 55 70 73 65 72      sqlite3Upser
66d0: 74 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e  tDup(db, pStep->
66e0: 70 55 70 73 65 72 74 29 0a 20 20 20 20 20 20 20  pUpsert).       
66f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
6700: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
6710: 20 63 61 73 65 20 54 4b 5f 44 45 4c 45 54 45 3a   case TK_DELETE:
6720: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
6730: 65 33 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61  e3DeleteFrom(pPa
6740: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
6750: 74 61 72 67 65 74 53 72 63 4c 69 73 74 28 70 50  targetSrcList(pP
6760: 61 72 73 65 2c 20 70 53 74 65 70 29 2c 0a 20 20  arse, pStep),.  
6770: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6780: 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 65 70  xprDup(db, pStep
6790: 2d 3e 70 57 68 65 72 65 2c 20 30 29 2c 20 30 2c  ->pWhere, 0), 0,
67a0: 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
67b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
67c0: 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75     }.      defau
67d0: 6c 74 3a 20 61 73 73 65 72 74 28 20 70 53 74 65  lt: assert( pSte
67e0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
67f0: 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20 53 65   ); {.        Se
6800: 6c 65 63 74 44 65 73 74 20 73 44 65 73 74 3b 0a  lectDest sDest;.
6810: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
6820: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
6830: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
6840: 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 2c 20 30  Step->pSelect, 0
6850: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6860: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
6870: 28 26 73 44 65 73 74 2c 20 53 52 54 5f 44 69 73  (&sDest, SRT_Dis
6880: 63 61 72 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  card, 0);.      
6890: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
68a0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
68b0: 20 26 73 44 65 73 74 29 3b 0a 20 20 20 20 20 20   &sDest);.      
68c0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
68d0: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
68e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
68f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
6900: 20 0a 20 20 20 20 69 66 28 20 70 53 74 65 70 2d   .    if( pStep-
6910: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op!=TK_SELECT )
6920: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6930: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
6940: 52 65 73 65 74 43 6f 75 6e 74 29 3b 0a 20 20 20  ResetCount);.   
6950: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
6960: 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
6970: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
6980: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a  AIN_COMMENTS./*.
6990: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
69a0: 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
69b0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 29 20 61 6e  VdbeComment() an
69c0: 6e 6f 74 61 74 69 6f 6e 73 20 74 6f 20 61 20 56  notations to a V
69d0: 44 42 45 0a 2a 2a 20 70 72 6f 67 72 61 6d 2e 20  DBE.** program. 
69e0: 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  It is not used i
69f0: 6e 20 70 72 6f 64 75 63 74 69 6f 6e 20 63 6f 64  n production cod
6a00: 65 2c 20 6f 6e 6c 79 20 66 6f 72 20 64 65 62 75  e, only for debu
6a10: 67 67 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  gging..*/.static
6a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 6e 45   const char *onE
6a30: 72 72 6f 72 54 65 78 74 28 69 6e 74 20 6f 6e 45  rrorText(int onE
6a40: 72 72 6f 72 29 7b 0a 20 20 73 77 69 74 63 68 28  rror){.  switch(
6a50: 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20   onError ){.    
6a60: 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20  case OE_Abort:  
6a70: 20 20 72 65 74 75 72 6e 20 22 61 62 6f 72 74 22    return "abort"
6a80: 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f  ;.    case OE_Ro
6a90: 6c 6c 62 61 63 6b 3a 20 72 65 74 75 72 6e 20 22  llback: return "
6aa0: 72 6f 6c 6c 62 61 63 6b 22 3b 0a 20 20 20 20 63  rollback";.    c
6ab0: 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20  ase OE_Fail:    
6ac0: 20 72 65 74 75 72 6e 20 22 66 61 69 6c 22 3b 0a   return "fail";.
6ad0: 20 20 20 20 63 61 73 65 20 4f 45 5f 52 65 70 6c      case OE_Repl
6ae0: 61 63 65 3a 20 20 72 65 74 75 72 6e 20 22 72 65  ace:  return "re
6af0: 70 6c 61 63 65 22 3b 0a 20 20 20 20 63 61 73 65  place";.    case
6b00: 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 72 65   OE_Ignore:   re
6b10: 74 75 72 6e 20 22 69 67 6e 6f 72 65 22 3b 0a 20  turn "ignore";. 
6b20: 20 20 20 63 61 73 65 20 4f 45 5f 44 65 66 61 75     case OE_Defau
6b30: 6c 74 3a 20 20 72 65 74 75 72 6e 20 22 64 65 66  lt:  return "def
6b40: 61 75 6c 74 22 3b 0a 20 20 7d 0a 20 20 72 65 74  ault";.  }.  ret
6b50: 75 72 6e 20 22 6e 2f 61 22 3b 0a 7d 0a 23 65 6e  urn "n/a";.}.#en
6b60: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  dif../*.** Parse
6b70: 20 63 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75   context structu
6b80: 72 65 20 70 46 72 6f 6d 20 68 61 73 20 6a 75 73  re pFrom has jus
6b90: 74 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20 63  t been used to c
6ba0: 72 65 61 74 65 20 61 20 73 75 62 2d 76 64 62 65  reate a sub-vdbe
6bb0: 0a 2a 2a 20 28 74 72 69 67 67 65 72 20 70 72 6f  .** (trigger pro
6bc0: 67 72 61 6d 29 2e 20 49 66 20 61 6e 20 65 72 72  gram). If an err
6bd0: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
6be0: 20 74 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20   transfer error 
6bf0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
6c00: 72 6f 6d 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f  rom pFrom to pTo
6c10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6c20: 20 74 72 61 6e 73 66 65 72 50 61 72 73 65 45 72   transferParseEr
6c30: 72 6f 72 28 50 61 72 73 65 20 2a 70 54 6f 2c 20  ror(Parse *pTo, 
6c40: 50 61 72 73 65 20 2a 70 46 72 6f 6d 29 7b 0a 20  Parse *pFrom){. 
6c50: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
6c60: 7a 45 72 72 4d 73 67 3d 3d 30 20 7c 7c 20 70 46  zErrMsg==0 || pF
6c70: 72 6f 6d 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 61  rom->nErr );.  a
6c80: 73 73 65 72 74 28 20 70 54 6f 2d 3e 7a 45 72 72  ssert( pTo->zErr
6c90: 4d 73 67 3d 3d 30 20 7c 7c 20 70 54 6f 2d 3e 6e  Msg==0 || pTo->n
6ca0: 45 72 72 20 29 3b 0a 20 20 69 66 28 20 70 54 6f  Err );.  if( pTo
6cb0: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
6cc0: 20 70 54 6f 2d 3e 7a 45 72 72 4d 73 67 20 3d 20   pTo->zErrMsg = 
6cd0: 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67 3b 0a  pFrom->zErrMsg;.
6ce0: 20 20 20 20 70 54 6f 2d 3e 6e 45 72 72 20 3d 20      pTo->nErr = 
6cf0: 70 46 72 6f 6d 2d 3e 6e 45 72 72 3b 0a 20 20 20  pFrom->nErr;.   
6d00: 20 70 54 6f 2d 3e 72 63 20 3d 20 70 46 72 6f 6d   pTo->rc = pFrom
6d10: 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->rc;.  }else{. 
6d20: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6d30: 28 70 46 72 6f 6d 2d 3e 64 62 2c 20 70 46 72 6f  (pFrom->db, pFro
6d40: 6d 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  m->zErrMsg);.  }
6d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
6d60: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 20   and populate a 
6d70: 6e 65 77 20 54 72 69 67 67 65 72 50 72 67 20 6f  new TriggerPrg o
6d80: 62 6a 65 63 74 20 77 69 74 68 20 61 20 73 75 62  bject with a sub
6d90: 2d 70 72 6f 67 72 61 6d 20 0a 2a 2a 20 69 6d 70  -program .** imp
6da0: 6c 65 6d 65 6e 74 69 6e 67 20 74 72 69 67 67 65  lementing trigge
6db0: 72 20 70 54 72 69 67 67 65 72 20 77 69 74 68 20  r pTrigger with 
6dc0: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69  ON CONFLICT poli
6dd0: 63 79 20 6f 72 63 6f 6e 66 2e 0a 2a 2f 0a 73 74  cy orconf..*/.st
6de0: 61 74 69 63 20 54 72 69 67 67 65 72 50 72 67 20  atic TriggerPrg 
6df0: 2a 63 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28  *codeRowTrigger(
6e00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6e10: 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65  ,       /* Curre
6e20: 6e 74 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74  nt parse context
6e30: 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70   */.  Trigger *p
6e40: 54 72 69 67 67 65 72 2c 20 20 20 2f 2a 20 54 72  Trigger,   /* Tr
6e50: 69 67 67 65 72 20 74 6f 20 63 6f 64 65 20 2a 2f  igger to code */
6e60: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
6e70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
6e80: 61 62 6c 65 20 70 54 72 69 67 67 65 72 20 69 73  able pTrigger is
6e90: 20 61 74 74 61 63 68 65 64 20 74 6f 20 2a 2f 0a   attached to */.
6ea0: 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20    int orconf    
6eb0: 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e         /* ON CON
6ec0: 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 74 6f 20  FLICT policy to 
6ed0: 63 6f 64 65 20 74 72 69 67 67 65 72 20 70 72 6f  code trigger pro
6ee0: 67 72 61 6d 20 77 69 74 68 20 2a 2f 0a 29 7b 0a  gram with */.){.
6ef0: 20 20 50 61 72 73 65 20 2a 70 54 6f 70 20 3d 20    Parse *pTop = 
6f00: 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
6f10: 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
6f20: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6f30: 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44  arse->db;   /* D
6f40: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
6f50: 2f 0a 20 20 54 72 69 67 67 65 72 50 72 67 20 2a  /.  TriggerPrg *
6f60: 70 50 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  pPrg;           
6f70: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
6f80: 72 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  rn */.  Expr *pW
6f90: 68 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  hen = 0;        
6fa0: 20 20 20 20 2f 2a 20 44 75 70 6c 69 63 61 74 65      /* Duplicate
6fb0: 20 6f 66 20 74 72 69 67 67 65 72 20 57 48 45 4e   of trigger WHEN
6fc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
6fd0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6ff0: 54 65 6d 70 6f 72 61 72 79 20 56 4d 20 2a 2f 0a  Temporary VM */.
7000: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
7010: 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  C;            /*
7020: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
7030: 72 20 73 75 62 2d 76 64 62 65 20 2a 2f 0a 20 20  r sub-vdbe */.  
7040: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 50 72 6f  SubProgram *pPro
7050: 67 72 61 6d 20 3d 20 30 3b 20 20 20 2f 2a 20 53  gram = 0;   /* S
7060: 75 62 2d 76 64 62 65 20 66 6f 72 20 74 72 69 67  ub-vdbe for trig
7070: 67 65 72 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20  ger program */. 
7080: 20 50 61 72 73 65 20 2a 70 53 75 62 50 61 72 73   Parse *pSubPars
7090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
70a0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 66 6f  Parse context fo
70b0: 72 20 73 75 62 2d 76 64 62 65 20 2a 2f 0a 20 20  r sub-vdbe */.  
70c0: 69 6e 74 20 69 45 6e 64 54 72 69 67 67 65 72 20  int iEndTrigger 
70d0: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  = 0;        /* L
70e0: 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
70f0: 69 66 20 57 48 45 4e 20 69 73 20 66 61 6c 73 65  if WHEN is false
7100: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
7110: 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 3d 3d  Trigger->zName==
7120: 30 20 7c 7c 20 70 54 61 62 3d 3d 74 61 62 6c 65  0 || pTab==table
7130: 4f 66 54 72 69 67 67 65 72 28 70 54 72 69 67 67  OfTrigger(pTrigg
7140: 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
7150: 20 70 54 6f 70 2d 3e 70 56 64 62 65 20 29 3b 0a   pTop->pVdbe );.
7160: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
7170: 68 65 20 54 72 69 67 67 65 72 50 72 67 20 61 6e  he TriggerPrg an
7180: 64 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a  d SubProgram obj
7190: 65 63 74 73 2e 20 54 6f 20 65 6e 73 75 72 65 20  ects. To ensure 
71a0: 74 68 61 74 20 74 68 65 79 0a 20 20 2a 2a 20 61  that they.  ** a
71b0: 72 65 20 66 72 65 65 64 20 69 66 20 61 6e 20 65  re freed if an e
71c0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 69 6e  rror occurs, lin
71d0: 6b 20 74 68 65 6d 20 69 6e 74 6f 20 74 68 65 20  k them into the 
71e0: 50 61 72 73 65 2e 70 54 72 69 67 67 65 72 50 72  Parse.pTriggerPr
71f0: 67 20 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20  g .  ** list of 
7200: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 50 61  the top-level Pa
7210: 72 73 65 20 6f 62 6a 65 63 74 20 73 6f 6f 6e 65  rse object soone
7220: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
7230: 74 65 72 2e 20 20 2a 2f 0a 20 20 70 50 72 67 20  ter.  */.  pPrg 
7240: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7250: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
7260: 28 54 72 69 67 67 65 72 50 72 67 29 29 3b 0a 20  (TriggerPrg));. 
7270: 20 69 66 28 20 21 70 50 72 67 20 29 20 72 65 74   if( !pPrg ) ret
7280: 75 72 6e 20 30 3b 0a 20 20 70 50 72 67 2d 3e 70  urn 0;.  pPrg->p
7290: 4e 65 78 74 20 3d 20 70 54 6f 70 2d 3e 70 54 72  Next = pTop->pTr
72a0: 69 67 67 65 72 50 72 67 3b 0a 20 20 70 54 6f 70  iggerPrg;.  pTop
72b0: 2d 3e 70 54 72 69 67 67 65 72 50 72 67 20 3d 20  ->pTriggerPrg = 
72c0: 70 50 72 67 3b 0a 20 20 70 50 72 67 2d 3e 70 50  pPrg;.  pPrg->pP
72d0: 72 6f 67 72 61 6d 20 3d 20 70 50 72 6f 67 72 61  rogram = pProgra
72e0: 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  m = sqlite3DbMal
72f0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
7300: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 29 29 3b  of(SubProgram));
7310: 0a 20 20 69 66 28 20 21 70 50 72 6f 67 72 61 6d  .  if( !pProgram
7320: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
7330: 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75  qlite3VdbeLinkSu
7340: 62 50 72 6f 67 72 61 6d 28 70 54 6f 70 2d 3e 70  bProgram(pTop->p
7350: 56 64 62 65 2c 20 70 50 72 6f 67 72 61 6d 29 3b  Vdbe, pProgram);
7360: 0a 20 20 70 50 72 67 2d 3e 70 54 72 69 67 67 65  .  pPrg->pTrigge
7370: 72 20 3d 20 70 54 72 69 67 67 65 72 3b 0a 20 20  r = pTrigger;.  
7380: 70 50 72 67 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f  pPrg->orconf = o
7390: 72 63 6f 6e 66 3b 0a 20 20 70 50 72 67 2d 3e 61  rconf;.  pPrg->a
73a0: 43 6f 6c 6d 61 73 6b 5b 30 5d 20 3d 20 30 78 66  Colmask[0] = 0xf
73b0: 66 66 66 66 66 66 66 3b 0a 20 20 70 50 72 67 2d  fffffff;.  pPrg-
73c0: 3e 61 43 6f 6c 6d 61 73 6b 5b 31 5d 20 3d 20 30  >aColmask[1] = 0
73d0: 78 66 66 66 66 66 66 66 66 3b 0a 0a 20 20 2f 2a  xffffffff;..  /*
73e0: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f   Allocate and po
73f0: 70 75 6c 61 74 65 20 61 20 6e 65 77 20 50 61 72  pulate a new Par
7400: 73 65 20 63 6f 6e 74 65 78 74 20 74 6f 20 75 73  se context to us
7410: 65 20 66 6f 72 20 63 6f 64 69 6e 67 20 74 68 65  e for coding the
7420: 20 0a 20 20 2a 2a 20 74 72 69 67 67 65 72 20 73   .  ** trigger s
7430: 75 62 2d 70 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a  ub-program.  */.
7440: 20 20 70 53 75 62 50 61 72 73 65 20 3d 20 73 71    pSubParse = sq
7450: 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 5a  lite3StackAllocZ
7460: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 50  ero(db, sizeof(P
7470: 61 72 73 65 29 29 3b 0a 20 20 69 66 28 20 21 70  arse));.  if( !p
7480: 53 75 62 50 61 72 73 65 20 29 20 72 65 74 75 72  SubParse ) retur
7490: 6e 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 0;.  memset(&s
74a0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
74b0: 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  C));.  sNC.pPars
74c0: 65 20 3d 20 70 53 75 62 50 61 72 73 65 3b 0a 20  e = pSubParse;. 
74d0: 20 70 53 75 62 50 61 72 73 65 2d 3e 64 62 20 3d   pSubParse->db =
74e0: 20 64 62 3b 0a 20 20 70 53 75 62 50 61 72 73 65   db;.  pSubParse
74f0: 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 3d 20  ->pTriggerTab = 
7500: 70 54 61 62 3b 0a 20 20 70 53 75 62 50 61 72 73  pTab;.  pSubPars
7510: 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 20 3d 20 70  e->pToplevel = p
7520: 54 6f 70 3b 0a 20 20 70 53 75 62 50 61 72 73 65  Top;.  pSubParse
7530: 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
7540: 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65   pTrigger->zName
7550: 3b 0a 20 20 70 53 75 62 50 61 72 73 65 2d 3e 65  ;.  pSubParse->e
7560: 54 72 69 67 67 65 72 4f 70 20 3d 20 70 54 72 69  TriggerOp = pTri
7570: 67 67 65 72 2d 3e 6f 70 3b 0a 20 20 70 53 75 62  gger->op;.  pSub
7580: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
7590: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
75a0: 72 79 4c 6f 6f 70 3b 0a 0a 20 20 76 20 3d 20 73  ryLoop;..  v = s
75b0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 53  qlite3GetVdbe(pS
75c0: 75 62 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  ubParse);.  if( 
75d0: 76 20 29 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d  v ){.    VdbeCom
75e0: 6d 65 6e 74 28 28 76 2c 20 22 53 74 61 72 74 3a  ment((v, "Start:
75f0: 20 25 73 2e 25 73 20 28 25 73 20 25 73 25 73 25   %s.%s (%s %s%s%
7600: 73 20 4f 4e 20 25 73 29 22 2c 20 0a 20 20 20 20  s ON %s)", .    
7610: 20 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d    pTrigger->zNam
7620: 65 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f  e, onErrorText(o
7630: 72 63 6f 6e 66 29 2c 0a 20 20 20 20 20 20 28 70  rconf),.      (p
7640: 54 72 69 67 67 65 72 2d 3e 74 72 5f 74 6d 3d 3d  Trigger->tr_tm==
7650: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 3f  TRIGGER_BEFORE ?
7660: 20 22 42 45 46 4f 52 45 22 20 3a 20 22 41 46 54   "BEFORE" : "AFT
7670: 45 52 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70  ER"),.        (p
7680: 54 72 69 67 67 65 72 2d 3e 6f 70 3d 3d 54 4b 5f  Trigger->op==TK_
7690: 55 50 44 41 54 45 20 3f 20 22 55 50 44 41 54 45  UPDATE ? "UPDATE
76a0: 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 20  " : ""),.       
76b0: 20 28 70 54 72 69 67 67 65 72 2d 3e 6f 70 3d 3d   (pTrigger->op==
76c0: 54 4b 5f 49 4e 53 45 52 54 20 3f 20 22 49 4e 53  TK_INSERT ? "INS
76d0: 45 52 54 22 20 3a 20 22 22 29 2c 0a 20 20 20 20  ERT" : ""),.    
76e0: 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e 6f      (pTrigger->o
76f0: 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 3f 20 22  p==TK_DELETE ? "
7700: 44 45 4c 45 54 45 22 20 3a 20 22 22 29 2c 0a 20  DELETE" : ""),. 
7710: 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
7720: 0a 20 20 20 20 29 29 3b 0a 23 69 66 6e 64 65 66  .    ));.#ifndef
7730: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
7740: 43 45 0a 20 20 20 20 69 66 28 20 70 54 72 69 67  CE.    if( pTrig
7750: 67 65 72 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  ger->zName ){.  
7760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7770: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 0a  hangeP4(v, -1, .
7780: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
7790: 50 72 69 6e 74 66 28 64 62 2c 20 22 2d 2d 20 54  Printf(db, "-- T
77a0: 52 49 47 47 45 52 20 25 73 22 2c 20 70 54 72 69  RIGGER %s", pTri
77b0: 67 67 65 72 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34  gger->zName), P4
77c0: 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 20 20 29  _DYNAMIC.      )
77d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
77e0: 20 20 20 20 2f 2a 20 49 66 20 6f 6e 65 20 77 61      /* If one wa
77f0: 73 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 64  s specified, cod
7800: 65 20 74 68 65 20 57 48 45 4e 20 63 6c 61 75 73  e the WHEN claus
7810: 65 2e 20 49 66 20 69 74 20 65 76 61 6c 75 61 74  e. If it evaluat
7820: 65 73 20 74 6f 20 66 61 6c 73 65 0a 20 20 20 20  es to false.    
7830: 2a 2a 20 28 6f 72 20 4e 55 4c 4c 29 20 74 68 65  ** (or NULL) the
7840: 20 73 75 62 2d 76 64 62 65 20 69 73 20 69 6d 6d   sub-vdbe is imm
7850: 65 64 69 61 74 65 6c 79 20 68 61 6c 74 65 64 20  ediately halted 
7860: 62 79 20 6a 75 6d 70 69 6e 67 20 74 6f 20 74 68  by jumping to th
7870: 65 20 0a 20 20 20 20 2a 2a 20 4f 50 5f 48 61 6c  e .    ** OP_Hal
7880: 74 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 68  t inserted at th
7890: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  e end of the pro
78a0: 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66  gram.  */.    if
78b0: 28 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65  ( pTrigger->pWhe
78c0: 6e 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 6e  n ){.      pWhen
78d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
78e0: 70 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e  p(db, pTrigger->
78f0: 70 57 68 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20  pWhen, 0);.     
7900: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
7910: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
7920: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 57  prNames(&sNC, pW
7930: 68 65 6e 29 20 0a 20 20 20 20 20 20 20 26 26 20  hen) .       && 
7940: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7950: 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  ==0 .      ){.  
7960: 20 20 20 20 20 20 69 45 6e 64 54 72 69 67 67 65        iEndTrigge
7970: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  r = sqlite3VdbeM
7980: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
7990: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
79a0: 49 66 46 61 6c 73 65 28 70 53 75 62 50 61 72 73  IfFalse(pSubPars
79b0: 65 2c 20 70 57 68 65 6e 2c 20 69 45 6e 64 54 72  e, pWhen, iEndTr
79c0: 69 67 67 65 72 2c 20 53 51 4c 49 54 45 5f 4a 55  igger, SQLITE_JU
79d0: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
79e0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
79f0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7a00: 57 68 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  When);.    }..  
7a10: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 74 72    /* Code the tr
7a20: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 69 6e  igger program in
7a30: 74 6f 20 74 68 65 20 73 75 62 2d 76 64 62 65 2e  to the sub-vdbe.
7a40: 20 2a 2f 0a 20 20 20 20 63 6f 64 65 54 72 69 67   */.    codeTrig
7a50: 67 65 72 50 72 6f 67 72 61 6d 28 70 53 75 62 50  gerProgram(pSubP
7a60: 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 2d 3e  arse, pTrigger->
7a70: 73 74 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e  step_list, orcon
7a80: 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65  f);..    /* Inse
7a90: 72 74 20 61 6e 20 4f 50 5f 48 61 6c 74 20 61 74  rt an OP_Halt at
7aa0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
7ab0: 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a  sub-program. */.
7ac0: 20 20 20 20 69 66 28 20 69 45 6e 64 54 72 69 67      if( iEndTrig
7ad0: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
7ae0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
7af0: 61 62 65 6c 28 76 2c 20 69 45 6e 64 54 72 69 67  abel(v, iEndTrig
7b00: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
7b10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7b20: 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 20  0(v, OP_Halt);. 
7b30: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
7b40: 76 2c 20 22 45 6e 64 3a 20 25 73 2e 25 73 22 2c  v, "End: %s.%s",
7b50: 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65   pTrigger->zName
7b60: 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72  , onErrorText(or
7b70: 63 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 74 72  conf)));..    tr
7b80: 61 6e 73 66 65 72 50 61 72 73 65 45 72 72 6f 72  ansferParseError
7b90: 28 70 50 61 72 73 65 2c 20 70 53 75 62 50 61 72  (pParse, pSubPar
7ba0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  se);.    if( db-
7bb0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
7bc0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
7bd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 72  ==0 ){.      pPr
7be0: 6f 67 72 61 6d 2d 3e 61 4f 70 20 3d 20 73 71 6c  ogram->aOp = sql
7bf0: 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72  ite3VdbeTakeOpAr
7c00: 72 61 79 28 76 2c 20 26 70 50 72 6f 67 72 61 6d  ray(v, &pProgram
7c10: 2d 3e 6e 4f 70 2c 20 26 70 54 6f 70 2d 3e 6e 4d  ->nOp, &pTop->nM
7c20: 61 78 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20  axArg);.    }.  
7c30: 20 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d    pProgram->nMem
7c40: 20 3d 20 70 53 75 62 50 61 72 73 65 2d 3e 6e 4d   = pSubParse->nM
7c50: 65 6d 3b 0a 20 20 20 20 70 50 72 6f 67 72 61 6d  em;.    pProgram
7c60: 2d 3e 6e 43 73 72 20 3d 20 70 53 75 62 50 61 72  ->nCsr = pSubPar
7c70: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 70 50  se->nTab;.    pP
7c80: 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 20 3d 20  rogram->token = 
7c90: 28 76 6f 69 64 20 2a 29 70 54 72 69 67 67 65 72  (void *)pTrigger
7ca0: 3b 0a 20 20 20 20 70 50 72 67 2d 3e 61 43 6f 6c  ;.    pPrg->aCol
7cb0: 6d 61 73 6b 5b 30 5d 20 3d 20 70 53 75 62 50 61  mask[0] = pSubPa
7cc0: 72 73 65 2d 3e 6f 6c 64 6d 61 73 6b 3b 0a 20 20  rse->oldmask;.  
7cd0: 20 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b    pPrg->aColmask
7ce0: 5b 31 5d 20 3d 20 70 53 75 62 50 61 72 73 65 2d  [1] = pSubParse-
7cf0: 3e 6e 65 77 6d 61 73 6b 3b 0a 20 20 20 20 73 71  >newmask;.    sq
7d00: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
7d10: 76 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  v);.  }..  asser
7d20: 74 28 20 21 70 53 75 62 50 61 72 73 65 2d 3e 70  t( !pSubParse->p
7d30: 41 69 6e 63 20 20 20 20 20 20 20 26 26 20 21 70  Ainc       && !p
7d40: 53 75 62 50 61 72 73 65 2d 3e 70 5a 6f 6d 62 69  SubParse->pZombi
7d50: 65 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74  eTab );.  assert
7d60: 28 20 21 70 53 75 62 50 61 72 73 65 2d 3e 70 54  ( !pSubParse->pT
7d70: 72 69 67 67 65 72 50 72 67 20 26 26 20 21 70 53  riggerPrg && !pS
7d80: 75 62 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67  ubParse->nMaxArg
7d90: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 72   );.  sqlite3Par
7da0: 73 65 72 52 65 73 65 74 28 70 53 75 62 50 61 72  serReset(pSubPar
7db0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  se);.  sqlite3St
7dc0: 61 63 6b 46 72 65 65 28 64 62 2c 20 70 53 75 62  ackFree(db, pSub
7dd0: 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72  Parse);..  retur
7de0: 6e 20 70 50 72 67 3b 0a 7d 0a 20 20 20 20 0a 2f  n pPrg;.}.    ./
7df0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
7e00: 69 6e 74 65 72 20 74 6f 20 61 20 54 72 69 67 67  inter to a Trigg
7e10: 65 72 50 72 67 20 6f 62 6a 65 63 74 20 63 6f 6e  erPrg object con
7e20: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 75 62 2d  taining the sub-
7e30: 70 72 6f 67 72 61 6d 20 66 6f 72 0a 2a 2a 20 74  program for.** t
7e40: 72 69 67 67 65 72 20 70 54 72 69 67 67 65 72 20  rigger pTrigger 
7e50: 77 69 74 68 20 64 65 66 61 75 6c 74 20 4f 4e 20  with default ON 
7e60: 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72 69 74  CONFLICT algorit
7e70: 68 6d 20 6f 72 63 6f 6e 66 2e 20 49 66 20 6e 6f  hm orconf. If no
7e80: 20 73 75 63 68 0a 2a 2a 20 54 72 69 67 67 65 72   such.** Trigger
7e90: 50 72 67 20 6f 62 6a 65 63 74 20 65 78 69 73 74  Prg object exist
7ea0: 73 2c 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20  s, a new object 
7eb0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
7ec0: 20 70 6f 70 75 6c 61 74 65 64 20 62 65 66 6f 72   populated befor
7ed0: 65 0a 2a 2a 20 62 65 69 6e 67 20 72 65 74 75 72  e.** being retur
7ee0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  ned..*/.static T
7ef0: 72 69 67 67 65 72 50 72 67 20 2a 67 65 74 52 6f  riggerPrg *getRo
7f00: 77 54 72 69 67 67 65 72 28 0a 20 20 50 61 72 73  wTrigger(.  Pars
7f10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
7f20: 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 61 72 73   /* Current pars
7f30: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
7f40: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
7f50: 2c 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 74  ,   /* Trigger t
7f60: 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 54 61 62 6c  o code */.  Tabl
7f70: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
7f80: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 72   /* The table tr
7f90: 69 67 67 65 72 20 70 54 72 69 67 67 65 72 20 69  igger pTrigger i
7fa0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 2a 2f  s attached to */
7fb0: 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20  .  int orconf   
7fc0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f          /* ON CO
7fd0: 4e 46 4c 49 43 54 20 61 6c 67 6f 72 69 74 68 6d  NFLICT algorithm
7fe0: 2e 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  . */.){.  Parse 
7ff0: 2a 70 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33  *pRoot = sqlite3
8000: 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
8010: 61 72 73 65 29 3b 0a 20 20 54 72 69 67 67 65 72  arse);.  Trigger
8020: 50 72 67 20 2a 70 50 72 67 3b 0a 0a 20 20 61 73  Prg *pPrg;..  as
8030: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e  sert( pTrigger->
8040: 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 54 61 62  zName==0 || pTab
8050: 3d 3d 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72  ==tableOfTrigger
8060: 28 70 54 72 69 67 67 65 72 29 20 29 3b 0a 0a 20  (pTrigger) );.. 
8070: 20 2f 2a 20 49 74 20 6d 61 79 20 62 65 20 74 68   /* It may be th
8080: 61 74 20 74 68 69 73 20 74 72 69 67 67 65 72 20  at this trigger 
8090: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
80a0: 20 63 6f 64 65 64 20 28 6f 72 20 69 73 20 69 6e   coded (or is in
80b0: 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73   the.  ** proces
80c0: 73 20 6f 66 20 62 65 69 6e 67 20 63 6f 64 65 64  s of being coded
80d0: 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ). If this is th
80e0: 65 20 63 61 73 65 2c 20 74 68 65 6e 20 61 6e 20  e case, then an 
80f0: 65 6e 74 72 79 20 77 69 74 68 0a 20 20 2a 2a 20  entry with.  ** 
8100: 61 20 6d 61 74 63 68 69 6e 67 20 54 72 69 67 67  a matching Trigg
8110: 65 72 50 72 67 2e 70 54 72 69 67 67 65 72 20 66  erPrg.pTrigger f
8120: 69 65 6c 64 20 77 69 6c 6c 20 62 65 20 70 72 65  ield will be pre
8130: 73 65 6e 74 20 73 6f 6d 65 77 68 65 72 65 0a 20  sent somewhere. 
8140: 20 2a 2a 20 69 6e 20 74 68 65 20 50 61 72 73 65   ** in the Parse
8150: 2e 70 54 72 69 67 67 65 72 50 72 67 20 6c 69 73  .pTriggerPrg lis
8160: 74 2e 20 53 65 61 72 63 68 20 66 6f 72 20 73 75  t. Search for su
8170: 63 68 20 61 6e 20 65 6e 74 72 79 2e 20 20 2a 2f  ch an entry.  */
8180: 0a 20 20 66 6f 72 28 70 50 72 67 3d 70 52 6f 6f  .  for(pPrg=pRoo
8190: 74 2d 3e 70 54 72 69 67 67 65 72 50 72 67 3b 20  t->pTriggerPrg; 
81a0: 0a 20 20 20 20 20 20 70 50 72 67 20 26 26 20 28  .      pPrg && (
81b0: 70 50 72 67 2d 3e 70 54 72 69 67 67 65 72 21 3d  pPrg->pTrigger!=
81c0: 70 54 72 69 67 67 65 72 20 7c 7c 20 70 50 72 67  pTrigger || pPrg
81d0: 2d 3e 6f 72 63 6f 6e 66 21 3d 6f 72 63 6f 6e 66  ->orconf!=orconf
81e0: 29 3b 20 0a 20 20 20 20 20 20 70 50 72 67 3d 70  ); .      pPrg=p
81f0: 50 72 67 2d 3e 70 4e 65 78 74 0a 20 20 29 3b 0a  Prg->pNext.  );.
8200: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 69 73  .  /* If an exis
8210: 74 69 6e 67 20 54 72 69 67 67 65 72 50 72 67 20  ting TriggerPrg 
8220: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6c 6f 63  could not be loc
8230: 61 74 65 64 2c 20 63 72 65 61 74 65 20 61 20 6e  ated, create a n
8240: 65 77 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 28  ew one. */.  if(
8250: 20 21 70 50 72 67 20 29 7b 0a 20 20 20 20 70 50   !pPrg ){.    pP
8260: 72 67 20 3d 20 63 6f 64 65 52 6f 77 54 72 69 67  rg = codeRowTrig
8270: 67 65 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  ger(pParse, pTri
8280: 67 67 65 72 2c 20 70 54 61 62 2c 20 6f 72 63 6f  gger, pTab, orco
8290: 6e 66 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  nf);.  }..  retu
82a0: 72 6e 20 70 50 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pPrg;.}../*.*
82b0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
82c0: 66 6f 72 20 74 68 65 20 74 72 69 67 67 65 72 20  for the trigger 
82d0: 70 72 6f 67 72 61 6d 20 61 73 73 6f 63 69 61 74  program associat
82e0: 65 64 20 77 69 74 68 20 74 72 69 67 67 65 72 20  ed with trigger 
82f0: 70 20 6f 6e 20 0a 2a 2a 20 74 61 62 6c 65 20 70  p on .** table p
8300: 54 61 62 2e 20 54 68 65 20 72 65 67 2c 20 6f 72  Tab. The reg, or
8310: 63 6f 6e 66 20 61 6e 64 20 69 67 6e 6f 72 65 4a  conf and ignoreJ
8320: 75 6d 70 20 70 61 72 61 6d 65 74 65 72 73 20 70  ump parameters p
8330: 61 73 73 65 64 20 74 6f 20 74 68 69 73 0a 2a 2a  assed to this.**
8340: 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
8350: 65 20 73 61 6d 65 20 61 73 20 74 68 6f 73 65 20  e same as those 
8360: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
8370: 20 68 65 61 64 65 72 20 66 75 6e 63 74 69 6f 6e   header function
8380: 20 66 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 33 43   for.** sqlite3C
8390: 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 29 0a  odeRowTrigger().
83a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
83b0: 6f 64 65 52 6f 77 54 72 69 67 67 65 72 44 69 72  odeRowTriggerDir
83c0: 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
83d0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
83e0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
83f0: 20 20 54 72 69 67 67 65 72 20 2a 70 2c 20 20 20    Trigger *p,   
8400: 20 20 20 20 20 20 20 2f 2a 20 54 72 69 67 67 65         /* Trigge
8410: 72 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 54  r to code */.  T
8420: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
8430: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
8440: 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72   to code trigger
8450: 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
8460: 72 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  reg,            
8470: 20 2f 2a 20 52 65 67 20 61 72 72 61 79 20 63 6f   /* Reg array co
8480: 6e 74 61 69 6e 69 6e 67 20 4f 4c 44 2e 2a 20 61  ntaining OLD.* a
8490: 6e 64 20 4e 45 57 2e 2a 20 76 61 6c 75 65 73 20  nd NEW.* values 
84a0: 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 2c  */.  int orconf,
84b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20            /* ON 
84c0: 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20  CONFLICT policy 
84d0: 2a 2f 0a 20 20 69 6e 74 20 69 67 6e 6f 72 65 4a  */.  int ignoreJ
84e0: 75 6d 70 20 20 20 20 20 20 20 2f 2a 20 49 6e 73  ump       /* Ins
84f0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 6a 75 6d 70  truction to jump
8500: 20 74 6f 20 66 6f 72 20 52 41 49 53 45 28 49 47   to for RAISE(IG
8510: 4e 4f 52 45 29 20 2a 2f 0a 29 7b 0a 20 20 56 64  NORE) */.){.  Vd
8520: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
8530: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20  etVdbe(pParse); 
8540: 2f 2a 20 4d 61 69 6e 20 56 4d 20 2a 2f 0a 20 20  /* Main VM */.  
8550: 54 72 69 67 67 65 72 50 72 67 20 2a 70 50 72 67  TriggerPrg *pPrg
8560: 3b 0a 20 20 70 50 72 67 20 3d 20 67 65 74 52 6f  ;.  pPrg = getRo
8570: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
8580: 20 70 2c 20 70 54 61 62 2c 20 6f 72 63 6f 6e 66   p, pTab, orconf
8590: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  );.  assert( pPr
85a0: 67 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  g || pParse->nEr
85b0: 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
85c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
85d0: 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
85e0: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
85f0: 65 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  e in the parent 
8600: 56 44 42 45 2e 20 50 34 20 6f 66 20 74 68 65 20  VDBE. P4 of the 
8610: 4f 50 5f 50 72 6f 67 72 61 6d 20 0a 20 20 2a 2a  OP_Program .  **
8620: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
8630: 20 74 68 65 20 73 75 62 2d 76 64 62 65 20 63 6f   the sub-vdbe co
8640: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 72 69  ntaining the tri
8650: 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 20 2a  gger program.  *
8660: 2f 0a 20 20 69 66 28 20 70 50 72 67 20 29 7b 0a  /.  if( pPrg ){.
8670: 20 20 20 20 69 6e 74 20 62 52 65 63 75 72 73 69      int bRecursi
8680: 76 65 20 3d 20 28 70 2d 3e 7a 4e 61 6d 65 20 26  ve = (p->zName &
8690: 26 20 30 3d 3d 28 70 50 61 72 73 65 2d 3e 64 62  & 0==(pParse->db
86a0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
86b0: 65 63 54 72 69 67 67 65 72 73 29 29 3b 0a 0a 20  ecTriggers));.. 
86c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
86d0: 64 4f 70 34 28 76 2c 20 4f 50 5f 50 72 6f 67 72  dOp4(v, OP_Progr
86e0: 61 6d 2c 20 72 65 67 2c 20 69 67 6e 6f 72 65 4a  am, reg, ignoreJ
86f0: 75 6d 70 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ump, ++pParse->n
8700: 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
8710: 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
8720: 74 20 63 68 61 72 20 2a 29 70 50 72 67 2d 3e 70  t char *)pPrg->p
8730: 50 72 6f 67 72 61 6d 2c 20 50 34 5f 53 55 42 50  Program, P4_SUBP
8740: 52 4f 47 52 41 4d 29 3b 0a 20 20 20 20 56 64 62  ROGRAM);.    Vdb
8750: 65 43 6f 6d 6d 65 6e 74 28 0a 20 20 20 20 20 20  eComment(.      
8760: 20 20 28 76 2c 20 22 43 61 6c 6c 3a 20 25 73 2e    (v, "Call: %s.
8770: 25 73 22 2c 20 28 70 2d 3e 7a 4e 61 6d 65 3f 70  %s", (p->zName?p
8780: 2d 3e 7a 4e 61 6d 65 3a 22 66 6b 65 79 22 29 2c  ->zName:"fkey"),
8790: 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72 63   onErrorText(orc
87a0: 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  onf)));..    /* 
87b0: 53 65 74 20 74 68 65 20 50 35 20 6f 70 65 72 61  Set the P5 opera
87c0: 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f 50 72 6f  nd of the OP_Pro
87d0: 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e  gram instruction
87e0: 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a   to non-zero if.
87f0: 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
8800: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
8810: 68 69 73 20 74 72 69 67 67 65 72 20 70 72 6f 67  his trigger prog
8820: 72 61 6d 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ram is disallowe
8830: 64 2e 20 52 65 63 75 72 73 69 76 65 0a 20 20 20  d. Recursive.   
8840: 20 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 69   ** invocation i
8850: 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 69 66 20  s disallowed if 
8860: 28 61 29 20 74 68 65 20 73 75 62 2d 70 72 6f 67  (a) the sub-prog
8870: 72 61 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ram is really a 
8880: 74 72 69 67 67 65 72 2c 0a 20 20 20 20 2a 2a 20  trigger,.    ** 
8890: 6e 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b 65  not a foreign ke
88a0: 79 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 28 62  y action, and (b
88b0: 29 20 74 68 65 20 66 6c 61 67 20 74 6f 20 65 6e  ) the flag to en
88c0: 61 62 6c 65 20 72 65 63 75 72 73 69 76 65 20 74  able recursive t
88d0: 72 69 67 67 65 72 73 0a 20 20 20 20 2a 2a 20 69  riggers.    ** i
88e0: 73 20 63 6c 65 61 72 2e 20 20 2a 2f 0a 20 20 20  s clear.  */.   
88f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8900: 67 65 50 35 28 76 2c 20 28 75 38 29 62 52 65 63  geP5(v, (u8)bRec
8910: 75 72 73 69 76 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  ursive);.  }.}..
8920: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
8930: 6c 6c 65 64 20 74 6f 20 63 6f 64 65 20 74 68 65  lled to code the
8940: 20 72 65 71 75 69 72 65 64 20 46 4f 52 20 45 41   required FOR EA
8950: 43 48 20 52 4f 57 20 74 72 69 67 67 65 72 73 20  CH ROW triggers 
8960: 66 6f 72 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  for an operation
8970: 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 20 70 54 61  .** on table pTa
8980: 62 2e 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  b. The operation
8990: 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72   to code trigger
89a0: 73 20 66 6f 72 20 28 49 4e 53 45 52 54 2c 20 55  s for (INSERT, U
89b0: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 29  PDATE or DELETE)
89c0: 0a 2a 2a 20 69 73 20 67 69 76 65 6e 20 62 79 20  .** is given by 
89d0: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
89e0: 2e 20 54 68 65 20 74 72 5f 74 6d 20 70 61 72 61  . The tr_tm para
89f0: 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
8a00: 20 77 68 65 74 68 65 72 20 74 68 65 0a 2a 2a 20   whether the.** 
8a10: 42 45 46 4f 52 45 20 6f 72 20 41 46 54 45 52 20  BEFORE or AFTER 
8a20: 74 72 69 67 67 65 72 73 20 61 72 65 20 63 6f 64  triggers are cod
8a30: 65 64 2e 20 49 66 20 74 68 65 20 6f 70 65 72 61  ed. If the opera
8a40: 74 69 6f 6e 20 69 73 20 61 6e 20 55 50 44 41 54  tion is an UPDAT
8a50: 45 2c 20 74 68 65 6e 0a 2a 2a 20 70 61 72 61 6d  E, then.** param
8a60: 65 74 65 72 20 70 43 68 61 6e 67 65 73 20 69 73  eter pChanges is
8a70: 20 70 61 73 73 65 64 20 74 68 65 20 6c 69 73 74   passed the list
8a80: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 62 65 69 6e   of columns bein
8a90: 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  g modified..**.*
8aa0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
8ab0: 6f 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20  o triggers that 
8ac0: 66 69 72 65 20 61 74 20 74 68 65 20 73 70 65 63  fire at the spec
8ad0: 69 66 69 65 64 20 74 69 6d 65 20 66 6f 72 20 74  ified time for t
8ae0: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
8af0: 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 70 54 61  operation on pTa
8b00: 62 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  b, this function
8b10: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
8b20: 2a 2a 20 54 68 65 20 72 65 67 20 61 72 67 75 6d  ** The reg argum
8b30: 65 6e 74 20 69 73 20 74 68 65 20 61 64 64 72 65  ent is the addre
8b40: 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ss of the first 
8b50: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
8b60: 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61  egisters .** tha
8b70: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 76 61  t contain the va
8b80: 6c 75 65 73 20 73 75 62 73 74 69 74 75 74 65 64  lues substituted
8b90: 20 66 6f 72 20 74 68 65 20 6e 65 77 2e 2a 20 61   for the new.* a
8ba0: 6e 64 20 6f 6c 64 2e 2a 20 72 65 66 65 72 65 6e  nd old.* referen
8bb0: 63 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 74 72  ces.** in the tr
8bc0: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 49  igger program. I
8bd0: 66 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  f N is the numbe
8be0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
8bf0: 74 61 62 6c 65 20 70 54 61 62 0a 2a 2a 20 28 61  table pTab.** (a
8c00: 20 63 6f 70 79 20 6f 66 20 70 54 61 62 2d 3e 6e   copy of pTab->n
8c10: 43 6f 6c 29 2c 20 74 68 65 6e 20 72 65 67 69 73  Col), then regis
8c20: 74 65 72 73 20 61 72 65 20 70 6f 70 75 6c 61 74  ters are populat
8c30: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
8c40: 2a 0a 2a 2a 20 20 20 52 65 67 69 73 74 65 72 20  *.**   Register 
8c50: 20 20 20 20 20 20 43 6f 6e 74 61 69 6e 73 0a 2a        Contains.*
8c60: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
8c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
8ca0: 72 65 67 2b 30 20 20 20 20 20 20 20 20 20 20 4f  reg+0          O
8cb0: 4c 44 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72 65  LD.rowid.**   re
8cc0: 67 2b 31 20 20 20 20 20 20 20 20 20 20 4f 4c 44  g+1          OLD
8cd0: 2e 2a 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74  .* value of left
8ce0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
8cf0: 70 54 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20  pTab.**   ...   
8d00: 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
8d10: 20 20 72 65 67 2b 4e 20 20 20 20 20 20 20 20 20    reg+N         
8d20: 20 4f 4c 44 2e 2a 20 76 61 6c 75 65 20 6f 66 20   OLD.* value of 
8d30: 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
8d40: 6e 20 6f 66 20 70 54 61 62 0a 2a 2a 20 20 20 72  n of pTab.**   r
8d50: 65 67 2b 4e 2b 31 20 20 20 20 20 20 20 20 4e 45  eg+N+1        NE
8d60: 57 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72 65 67  W.rowid.**   reg
8d70: 2b 4e 2b 32 20 20 20 20 20 20 20 20 4f 4c 44 2e  +N+2        OLD.
8d80: 2a 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 2d  * value of left-
8d90: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  most column of p
8da0: 54 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20 20  Tab.**   ...    
8db0: 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
8dc0: 20 72 65 67 2b 4e 2b 4e 2b 31 20 20 20 20 20 20   reg+N+N+1      
8dd0: 4e 45 57 2e 2a 20 76 61 6c 75 65 20 6f 66 20 72  NEW.* value of r
8de0: 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
8df0: 20 6f 66 20 70 54 61 62 0a 2a 2a 0a 2a 2a 20 46   of pTab.**.** F
8e00: 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 74 72 69  or ON DELETE tri
8e10: 67 67 65 72 73 2c 20 74 68 65 20 72 65 67 69 73  ggers, the regis
8e20: 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ters containing 
8e30: 74 68 65 20 4e 45 57 2e 2a 20 76 61 6c 75 65 73  the NEW.* values
8e40: 20 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20 62   will.** never b
8e50: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
8e60: 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  e trigger progra
8e70: 6d 2c 20 73 6f 20 74 68 65 79 20 61 72 65 20 6e  m, so they are n
8e80: 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  ot allocated or 
8e90: 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 64 20 62 79  .** populated by
8ea0: 20 74 68 65 20 63 61 6c 6c 65 72 20 28 74 68 65   the caller (the
8eb0: 72 65 20 69 73 20 6e 6f 20 64 61 74 61 20 74 6f  re is no data to
8ec0: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 6d 20 77   populate them w
8ed0: 69 74 68 20 61 6e 79 77 61 79 29 2e 20 0a 2a 2a  ith anyway). .**
8ee0: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 66 6f 72 20   Similarly, for 
8ef0: 4f 4e 20 49 4e 53 45 52 54 20 74 72 69 67 67 65  ON INSERT trigge
8f00: 72 73 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  rs the values st
8f10: 6f 72 65 64 20 69 6e 20 74 68 65 20 4f 4c 44 2e  ored in the OLD.
8f20: 2a 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 61  * registers.** a
8f30: 72 65 20 6e 65 76 65 72 20 61 63 63 65 73 73 65  re never accesse
8f40: 64 2c 20 61 6e 64 20 73 6f 20 61 72 65 20 6e 6f  d, and so are no
8f50: 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  t allocated by t
8f60: 68 65 20 63 61 6c 6c 65 72 2e 20 53 6f 2c 20 66  he caller. So, f
8f70: 6f 72 20 61 6e 0a 2a 2a 20 4f 4e 20 49 4e 53 45  or an.** ON INSE
8f80: 52 54 20 74 72 69 67 67 65 72 2c 20 74 68 65 20  RT trigger, the 
8f90: 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  value passed to 
8fa0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
8fb0: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 0a 2a   parameter reg.*
8fc0: 2a 20 69 73 20 6e 6f 74 20 61 20 72 65 61 64 61  * is not a reada
8fd0: 62 6c 65 20 72 65 67 69 73 74 65 72 2c 20 61 6c  ble register, al
8fe0: 74 68 6f 75 67 68 20 72 65 67 69 73 74 65 72 73  though registers
8ff0: 20 28 72 65 67 2b 4e 29 20 74 68 72 6f 75 67 68   (reg+N) through
9000: 20 0a 2a 2a 20 28 72 65 67 2b 4e 2b 4e 2b 31 29   .** (reg+N+N+1)
9010: 20 61 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   are..**.** Para
9020: 6d 65 74 65 72 20 6f 72 63 6f 6e 66 20 69 73 20  meter orconf is 
9030: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 66  the default conf
9040: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
9050: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 74 68  algorithm for th
9060: 65 0a 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f  e.** trigger pro
9070: 67 72 61 6d 20 74 6f 20 75 73 65 20 28 52 45 50  gram to use (REP
9080: 4c 41 43 45 2c 20 49 47 4e 4f 52 45 20 65 74 63  LACE, IGNORE etc
9090: 2e 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69 67  .). Parameter ig
90a0: 6e 6f 72 65 4a 75 6d 70 0a 2a 2a 20 69 73 20 74  noreJump.** is t
90b0: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  he instruction t
90c0: 68 61 74 20 63 6f 6e 74 72 6f 6c 20 73 68 6f 75  hat control shou
90d0: 6c 64 20 6a 75 6d 70 20 74 6f 20 69 66 20 61 20  ld jump to if a 
90e0: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 0a  trigger program.
90f0: 2a 2a 20 72 61 69 73 65 73 20 61 6e 20 49 47 4e  ** raises an IGN
9100: 4f 52 45 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a  ORE exception..*
9110: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
9120: 64 65 52 6f 77 54 72 69 67 67 65 72 28 0a 20 20  deRowTrigger(.  
9130: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9140: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
9150: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67  ntext */.  Trigg
9160: 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20 20  er *pTrigger,   
9170: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67 67  /* List of trigg
9180: 65 72 73 20 6f 6e 20 74 61 62 6c 65 20 70 54 61  ers on table pTa
9190: 62 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  b */.  int op,  
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
91b0: 6e 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c  ne of TK_UPDATE,
91c0: 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 44   TK_INSERT, TK_D
91d0: 45 4c 45 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c  ELETE */.  ExprL
91e0: 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20  ist *pChanges,  
91f0: 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74 20  /* Changes list 
9200: 66 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20 4f  for any UPDATE O
9210: 46 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20  F triggers */.  
9220: 69 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20 20 20  int tr_tm,      
9230: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
9240: 52 49 47 47 45 52 5f 42 45 46 4f 52 45 2c 20 54  RIGGER_BEFORE, T
9250: 52 49 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a  RIGGER_AFTER */.
9260: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
9270: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
9280: 62 6c 65 20 74 6f 20 63 6f 64 65 20 74 72 69 67  ble to code trig
9290: 67 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  gers from */.  i
92a0: 6e 74 20 72 65 67 2c 20 20 20 20 20 20 20 20 20  nt reg,         
92b0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
92c0: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
92d0: 72 65 67 69 73 74 65 72 73 20 28 73 65 65 20 61  registers (see a
92e0: 62 6f 76 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  bove) */.  int o
92f0: 72 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20  rconf,          
9300: 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70  /* ON CONFLICT p
9310: 6f 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69  olicy */.  int i
9320: 67 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20 20 20  gnoreJump       
9330: 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74  /* Instruction t
9340: 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52 41  o jump to for RA
9350: 49 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 29  ISE(IGNORE) */.)
9360: 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 3b 20  {.  Trigger *p; 
9370: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
9380: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
9390: 75 67 68 20 70 54 72 69 67 67 65 72 20 6c 69 73  ugh pTrigger lis
93a0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
93b0: 6f 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c  op==TK_UPDATE ||
93c0: 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 7c   op==TK_INSERT |
93d0: 7c 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20  | op==TK_DELETE 
93e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 5f  );.  assert( tr_
93f0: 74 6d 3d 3d 54 52 49 47 47 45 52 5f 42 45 46 4f  tm==TRIGGER_BEFO
9400: 52 45 20 7c 7c 20 74 72 5f 74 6d 3d 3d 54 52 49  RE || tr_tm==TRI
9410: 47 47 45 52 5f 41 46 54 45 52 20 29 3b 0a 20 20  GGER_AFTER );.  
9420: 61 73 73 65 72 74 28 20 28 6f 70 3d 3d 54 4b 5f  assert( (op==TK_
9430: 55 50 44 41 54 45 29 3d 3d 28 70 43 68 61 6e 67  UPDATE)==(pChang
9440: 65 73 21 3d 30 29 20 29 3b 0a 0a 20 20 66 6f 72  es!=0) );..  for
9450: 28 70 3d 70 54 72 69 67 67 65 72 3b 20 70 3b 20  (p=pTrigger; p; 
9460: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 0a 20 20  p=p->pNext){..  
9470: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
9480: 6b 69 6e 67 3a 20 20 54 68 65 20 73 63 68 65 6d  king:  The schem
9490: 61 20 66 6f 72 20 74 68 65 20 74 72 69 67 67 65  a for the trigge
94a0: 72 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 61  r and for the ta
94b0: 62 6c 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ble are.    ** a
94c0: 6c 77 61 79 73 20 64 65 66 69 6e 65 64 2e 20 20  lways defined.  
94d0: 54 68 65 20 74 72 69 67 67 65 72 20 6d 75 73 74  The trigger must
94e0: 20 62 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20   be in the same 
94f0: 73 63 68 65 6d 61 20 61 73 20 74 68 65 20 74 61  schema as the ta
9500: 62 6c 65 0a 20 20 20 20 2a 2a 20 6f 72 20 65 6c  ble.    ** or el
9510: 73 65 20 69 74 20 6d 75 73 74 20 62 65 20 61 20  se it must be a 
9520: 54 45 4d 50 20 74 72 69 67 67 65 72 2e 20 2a 2f  TEMP trigger. */
9530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9540: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
9550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61    assert( p->pTa
9560: 62 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  bSchema!=0 );.  
9570: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63    assert( p->pSc
9580: 68 65 6d 61 3d 3d 70 2d 3e 70 54 61 62 53 63 68  hema==p->pTabSch
9590: 65 6d 61 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ema .         ||
95a0: 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 50 61   p->pSchema==pPa
95b0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e  rse->db->aDb[1].
95c0: 70 53 63 68 65 6d 61 20 29 3b 0a 0a 20 20 20 20  pSchema );..    
95d0: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  /* Determine whe
95e0: 74 68 65 72 20 77 65 20 73 68 6f 75 6c 64 20 63  ther we should c
95f0: 6f 64 65 20 74 68 69 73 20 74 72 69 67 67 65 72  ode this trigger
9600: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   */.    if( p->o
9610: 70 3d 3d 6f 70 20 0a 20 20 20 20 20 26 26 20 70  p==op .     && p
9620: 2d 3e 74 72 5f 74 6d 3d 3d 74 72 5f 74 6d 20 0a  ->tr_tm==tr_tm .
9630: 20 20 20 20 20 26 26 20 63 68 65 63 6b 43 6f 6c       && checkCol
9640: 75 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43  umnOverlap(p->pC
9650: 6f 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67 65 73  olumns, pChanges
9660: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
9670: 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69  qlite3CodeRowTri
9680: 67 67 65 72 44 69 72 65 63 74 28 70 50 61 72 73  ggerDirect(pPars
9690: 65 2c 20 70 2c 20 70 54 61 62 2c 20 72 65 67 2c  e, p, pTab, reg,
96a0: 20 6f 72 63 6f 6e 66 2c 20 69 67 6e 6f 72 65 4a   orconf, ignoreJ
96b0: 75 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ump);.    }.  }.
96c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 69 67 67 65 72  }../*.** Trigger
96d0: 73 20 6d 61 79 20 61 63 63 65 73 73 20 76 61 6c  s may access val
96e0: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
96f0: 65 20 6f 6c 64 2e 2a 20 6f 72 20 6e 65 77 2e 2a  e old.* or new.*
9700: 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 0a   pseudo-table. .
9710: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9720: 20 72 65 74 75 72 6e 73 20 61 20 33 32 2d 62 69   returns a 32-bi
9730: 74 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61  t bitmask indica
9740: 74 69 6e 67 20 77 68 69 63 68 20 63 6f 6c 75 6d  ting which colum
9750: 6e 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 6c  ns of the .** ol
9760: 64 2e 2a 20 6f 72 20 6e 65 77 2e 2a 20 74 61 62  d.* or new.* tab
9770: 6c 65 73 20 61 63 74 75 61 6c 6c 79 20 61 72 65  les actually are
9780: 20 75 73 65 64 20 62 79 20 74 72 69 67 67 65 72   used by trigger
9790: 73 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  s. This informat
97a0: 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 75  ion .** may be u
97b0: 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
97c0: 72 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  r, for example, 
97d0: 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
97e0: 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 6e 74 69  to load the enti
97f0: 72 65 0a 2a 2a 20 6f 6c 64 2e 2a 20 72 65 63 6f  re.** old.* reco
9800: 72 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 77  rd into memory w
9810: 68 65 6e 20 65 78 65 63 75 74 69 6e 67 20 61 6e  hen executing an
9820: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
9830: 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
9840: 20 42 69 74 20 30 20 6f 66 20 74 68 65 20 72 65   Bit 0 of the re
9850: 74 75 72 6e 65 64 20 6d 61 73 6b 20 69 73 20 73  turned mask is s
9860: 65 74 20 69 66 20 74 68 65 20 6c 65 66 74 2d 6d  et if the left-m
9870: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
9880: 65 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 62  e.** table may b
9890: 65 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67  e accessed using
98a0: 20 61 6e 20 5b 6f 6c 64 7c 6e 65 77 5d 2e 3c 63   an [old|new].<c
98b0: 6f 6c 3e 20 72 65 66 65 72 65 6e 63 65 2e 20 42  ol> reference. B
98c0: 69 74 20 31 20 69 73 20 73 65 74 20 69 66 0a 2a  it 1 is set if.*
98d0: 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66  * the second lef
98e0: 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 76 61 6c  tmost column val
98f0: 75 65 20 69 73 20 72 65 71 75 69 72 65 64 2c 20  ue is required, 
9900: 61 6e 64 20 73 6f 20 6f 6e 2e 20 49 66 20 74 68  and so on. If th
9910: 65 72 65 0a 2a 2a 20 61 72 65 20 6d 6f 72 65 20  ere.** are more 
9920: 74 68 61 6e 20 33 32 20 63 6f 6c 75 6d 6e 73 20  than 32 columns 
9930: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e  in the table, an
9940: 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  d at least one o
9950: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  f the columns.**
9960: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67   with an index g
9970: 72 65 61 74 65 72 20 74 68 61 6e 20 33 32 20 6d  reater than 32 m
9980: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 2c 20  ay be accessed, 
9990: 30 78 66 66 66 66 66 66 66 66 20 69 73 20 72 65  0xffffffff is re
99a0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74  turned..**.** It
99b0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
99c0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
99d0: 20 74 68 65 20 6f 6c 64 2e 72 6f 77 69 64 20 6f   the old.rowid o
99e0: 72 20 6e 65 77 2e 72 6f 77 69 64 20 63 6f 6c 75  r new.rowid colu
99f0: 6d 6e 20 69 73 20 0a 2a 2a 20 61 63 63 65 73 73  mn is .** access
9a00: 65 64 20 62 79 20 74 72 69 67 67 65 72 73 2e 20  ed by triggers. 
9a10: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
9a20: 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74 68  always assume th
9a30: 61 74 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  at it is..**.** 
9a40: 50 61 72 61 6d 65 74 65 72 20 69 73 4e 65 77 20  Parameter isNew 
9a50: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 31  must be either 1
9a60: 20 6f 72 20 30 2e 20 49 66 20 69 74 20 69 73 20   or 0. If it is 
9a70: 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 73 6b  0, then the mask
9a80: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 70 70   returned.** app
9a90: 6c 69 65 73 20 74 6f 20 74 68 65 20 6f 6c 64 2e  lies to the old.
9aa0: 2a 20 74 61 62 6c 65 2e 20 49 66 20 31 2c 20 74  * table. If 1, t
9ab0: 68 65 20 6e 65 77 2e 2a 20 74 61 62 6c 65 2e 0a  he new.* table..
9ac0: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
9ad0: 74 72 5f 74 6d 20 6d 75 73 74 20 62 65 20 61 20  tr_tm must be a 
9ae0: 6d 61 73 6b 20 77 69 74 68 20 6f 6e 65 20 6f 72  mask with one or
9af0: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 54 52 49   both of the TRI
9b00: 47 47 45 52 5f 42 45 46 4f 52 45 0a 2a 2a 20 61  GGER_BEFORE.** a
9b10: 6e 64 20 54 52 49 47 47 45 52 5f 41 46 54 45 52  nd TRIGGER_AFTER
9b20: 20 62 69 74 73 20 73 65 74 2e 20 56 61 6c 75 65   bits set. Value
9b30: 73 20 61 63 63 65 73 73 65 64 20 62 79 20 42 45  s accessed by BE
9b40: 46 4f 52 45 20 74 72 69 67 67 65 72 73 20 61 72  FORE triggers ar
9b50: 65 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63 6c 75 64  e only.** includ
9b60: 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
9b70: 65 64 20 6d 61 73 6b 20 69 66 20 74 68 65 20 54  ed mask if the T
9b80: 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 62 69  RIGGER_BEFORE bi
9b90: 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 0a  t is set in the.
9ba0: 2a 2a 20 74 72 5f 74 6d 20 70 61 72 61 6d 65 74  ** tr_tm paramet
9bb0: 65 72 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 76  er. Similarly, v
9bc0: 61 6c 75 65 73 20 61 63 63 65 73 73 65 64 20 62  alues accessed b
9bd0: 79 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73  y AFTER triggers
9be0: 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63   are only.** inc
9bf0: 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
9c00: 75 72 6e 65 64 20 6d 61 73 6b 20 69 66 20 74 68  urned mask if th
9c10: 65 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20  e TRIGGER_AFTER 
9c20: 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 72  bit is set in tr
9c30: 5f 74 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  _tm..*/.u32 sqli
9c40: 74 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61 73  te3TriggerColmas
9c50: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
9c60: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
9c70: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
9c80: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
9c90: 72 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  r,   /* List of 
9ca0: 74 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c  triggers on tabl
9cb0: 65 20 70 54 61 62 20 2a 2f 0a 20 20 45 78 70 72  e pTab */.  Expr
9cc0: 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20  List *pChanges, 
9cd0: 20 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74   /* Changes list
9ce0: 20 66 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20   for any UPDATE 
9cf0: 4f 46 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20  OF triggers */. 
9d00: 20 69 6e 74 20 69 73 4e 65 77 2c 20 20 20 20 20   int isNew,     
9d10: 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 6e        /* 1 for n
9d20: 65 77 2e 2a 20 72 65 66 20 6d 61 73 6b 2c 20 30  ew.* ref mask, 0
9d30: 20 66 6f 72 20 6f 6c 64 2e 2a 20 72 65 66 20 6d   for old.* ref m
9d40: 61 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f  ask */.  int tr_
9d50: 74 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tm,           /*
9d60: 20 4d 61 73 6b 20 6f 66 20 54 52 49 47 47 45 52   Mask of TRIGGER
9d70: 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52 5f  _BEFORE|TRIGGER_
9d80: 41 46 54 45 52 20 2a 2f 0a 20 20 54 61 62 6c 65  AFTER */.  Table
9d90: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
9da0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20  /* The table to 
9db0: 63 6f 64 65 20 74 72 69 67 67 65 72 73 20 66 72  code triggers fr
9dc0: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f  om */.  int orco
9dd0: 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nf           /* 
9de0: 44 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c  Default ON CONFL
9df0: 49 43 54 20 70 6f 6c 69 63 79 20 66 6f 72 20 74  ICT policy for t
9e00: 72 69 67 67 65 72 20 73 74 65 70 73 20 2a 2f 0a  rigger steps */.
9e10: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f  ){.  const int o
9e20: 70 20 3d 20 70 43 68 61 6e 67 65 73 20 3f 20 54  p = pChanges ? T
9e30: 4b 5f 55 50 44 41 54 45 20 3a 20 54 4b 5f 44 45  K_UPDATE : TK_DE
9e40: 4c 45 54 45 3b 0a 20 20 75 33 32 20 6d 61 73 6b  LETE;.  u32 mask
9e50: 20 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72 20   = 0;.  Trigger 
9e60: 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  *p;..  assert( i
9e70: 73 4e 65 77 3d 3d 31 20 7c 7c 20 69 73 4e 65 77  sNew==1 || isNew
9e80: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ==0 );.  for(p=p
9e90: 54 72 69 67 67 65 72 3b 20 70 3b 20 70 3d 70 2d  Trigger; p; p=p-
9ea0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
9eb0: 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 28 74   p->op==op && (t
9ec0: 72 5f 74 6d 26 70 2d 3e 74 72 5f 74 6d 29 0a 20  r_tm&p->tr_tm). 
9ed0: 20 20 20 20 26 26 20 63 68 65 63 6b 43 6f 6c 75      && checkColu
9ee0: 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f  mnOverlap(p->pCo
9ef0: 6c 75 6d 6e 73 2c 70 43 68 61 6e 67 65 73 29 0a  lumns,pChanges).
9f00: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 54 72 69      ){.      Tri
9f10: 67 67 65 72 50 72 67 20 2a 70 50 72 67 3b 0a 20  ggerPrg *pPrg;. 
9f20: 20 20 20 20 20 70 50 72 67 20 3d 20 67 65 74 52       pPrg = getR
9f30: 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65  owTrigger(pParse
9f40: 2c 20 70 2c 20 70 54 61 62 2c 20 6f 72 63 6f 6e  , p, pTab, orcon
9f50: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  f);.      if( pP
9f60: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  rg ){.        ma
9f70: 73 6b 20 7c 3d 20 70 50 72 67 2d 3e 61 43 6f 6c  sk |= pPrg->aCol
9f80: 6d 61 73 6b 5b 69 73 4e 65 77 5d 3b 0a 20 20 20  mask[isNew];.   
9f90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
9fa0: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
9fb0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ..#endif /* !def
9fc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9fd0: 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a           _TRIGGER) */.