/ Hex Artifact Content
Login

Artifact e14840ee0c3e549e758ec9bf3e4146e166002280:


0000: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  /*.**.** The aut
0010: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0020: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0030: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0040: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0050: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0060: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0070: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0080: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0090: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00a0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00b0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00c0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00d0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00e0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
00f0: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0100: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0110: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0170: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
0180: 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 54  ementation for T
0190: 52 49 47 47 45 52 73 0a 2a 2f 0a 23 69 6e 63 6c  RIGGERs.*/.#incl
01a0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
01b0: 22 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  "..#ifndef SQLIT
01c0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f  E_OMIT_TRIGGER./
01d0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 6c 69  *.** Delete a li
01e0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 54 72 69  nked list of Tri
01f0: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
0200: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0210: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
0220: 72 53 74 65 70 28 73 71 6c 69 74 65 33 20 2a 64  rStep(sqlite3 *d
0230: 62 2c 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  b, TriggerStep *
0240: 70 54 72 69 67 67 65 72 53 74 65 70 29 7b 0a 20  pTriggerStep){. 
0250: 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
0260: 53 74 65 70 20 29 7b 0a 20 20 20 20 54 72 69 67  Step ){.    Trig
0270: 67 65 72 53 74 65 70 20 2a 20 70 54 6d 70 20 3d  gerStep * pTmp =
0280: 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 20   pTriggerStep;. 
0290: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 20     pTriggerStep 
02a0: 3d 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  = pTriggerStep->
02b0: 70 4e 65 78 74 3b 0a 0a 20 20 20 20 73 71 6c 69  pNext;..    sqli
02c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
02d0: 2c 20 70 54 6d 70 2d 3e 70 57 68 65 72 65 29 3b  , pTmp->pWhere);
02e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
02f0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0300: 54 6d 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b  Tmp->pExprList);
0310: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
0320: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6d  ctDelete(db, pTm
0330: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  p->pSelect);.   
0340: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
0350: 6c 65 74 65 28 64 62 2c 20 70 54 6d 70 2d 3e 70  lete(db, pTmp->p
0360: 49 64 4c 69 73 74 29 3b 0a 0a 20 20 20 20 73 71  IdList);..    sq
0370: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0380: 70 54 6d 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pTmp);.  }.}../*
0390: 0a 2a 2a 20 47 69 76 65 6e 20 74 61 62 6c 65 20  .** Given table 
03a0: 70 54 61 62 2c 20 72 65 74 75 72 6e 20 61 20 6c  pTab, return a l
03b0: 69 73 74 20 6f 66 20 61 6c 6c 20 74 68 65 20 74  ist of all the t
03c0: 72 69 67 67 65 72 73 20 61 74 74 61 63 68 65 64  riggers attached
03d0: 20 74 6f 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   to .** the tabl
03e0: 65 2e 20 54 68 65 20 6c 69 73 74 20 69 73 20 63  e. The list is c
03f0: 6f 6e 6e 65 63 74 65 64 20 62 79 20 54 72 69 67  onnected by Trig
0400: 67 65 72 2e 70 4e 65 78 74 20 70 6f 69 6e 74 65  ger.pNext pointe
0410: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  rs..**.** All of
0420: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 6f 6e   the triggers on
0430: 20 70 54 61 62 20 74 68 61 74 20 61 72 65 20 69   pTab that are i
0440: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
0450: 61 73 65 20 61 73 20 70 54 61 62 0a 2a 2a 20 61  ase as pTab.** a
0460: 72 65 20 61 6c 72 65 61 64 79 20 61 74 74 61 63  re already attac
0470: 68 65 64 20 74 6f 20 70 54 61 62 2d 3e 70 54 72  hed to pTab->pTr
0480: 69 67 67 65 72 2e 20 20 42 75 74 20 74 68 65 72  igger.  But ther
0490: 65 20 6d 69 67 68 74 20 62 65 20 61 64 64 69 74  e might be addit
04a0: 69 6f 6e 61 6c 0a 2a 2a 20 74 72 69 67 67 65 72  ional.** trigger
04b0: 73 20 6f 6e 20 70 54 61 62 20 69 6e 20 74 68 65  s on pTab in the
04c0: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20 54   TEMP schema.  T
04d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 65 70  his routine prep
04e0: 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 54 45 4d 50  ends all.** TEMP
04f0: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 70 54 61   triggers on pTa
0500: 62 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  b to the beginni
0510: 6e 67 20 6f 66 20 74 68 65 20 70 54 61 62 2d 3e  ng of the pTab->
0520: 70 54 72 69 67 67 65 72 20 6c 69 73 74 0a 2a 2a  pTrigger list.**
0530: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
0540: 20 63 6f 6d 62 69 6e 65 64 20 6c 69 73 74 2e 0a   combined list..
0550: 2a 2a 0a 2a 2a 20 54 6f 20 73 74 61 74 65 20 69  **.** To state i
0560: 74 20 61 6e 6f 74 68 65 72 20 77 61 79 3a 20 20  t another way:  
0570: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
0580: 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 61  urns a list of a
0590: 6c 6c 20 74 72 69 67 67 65 72 73 0a 2a 2a 20 74  ll triggers.** t
05a0: 68 61 74 20 66 69 72 65 20 6f 66 66 20 6f 66 20  hat fire off of 
05b0: 70 54 61 62 2e 20 20 54 68 65 20 6c 69 73 74 20  pTab.  The list 
05c0: 77 69 6c 6c 20 69 6e 63 6c 75 64 65 20 61 6e 79  will include any
05d0: 20 54 45 4d 50 20 74 72 69 67 67 65 72 73 20 6f   TEMP triggers o
05e0: 6e 0a 2a 2a 20 70 54 61 62 20 61 73 20 77 65 6c  n.** pTab as wel
05f0: 6c 20 61 73 20 74 68 65 20 74 72 69 67 67 65 72  l as the trigger
0600: 73 20 6c 69 73 65 64 20 69 6e 20 70 54 61 62 2d  s lised in pTab-
0610: 3e 70 54 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72  >pTrigger..*/.Tr
0620: 69 67 67 65 72 20 2a 73 71 6c 69 74 65 33 54 72  igger *sqlite3Tr
0630: 69 67 67 65 72 4c 69 73 74 28 50 61 72 73 65 20  iggerList(Parse 
0640: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
0650: 70 54 61 62 29 7b 0a 20 20 53 63 68 65 6d 61 20  pTab){.  Schema 
0660: 2a 20 63 6f 6e 73 74 20 70 54 6d 70 53 63 68 65  * const pTmpSche
0670: 6d 61 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ma = pParse->db-
0680: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[1].pSchema;
0690: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 73  .  Trigger *pLis
06a0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
06b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
06c0: 6f 66 20 74 72 69 67 67 65 72 73 20 74 6f 20 72  of triggers to r
06d0: 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  eturn */..  if( 
06e0: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 54  pParse->disableT
06f0: 72 69 67 67 65 72 73 20 29 7b 0a 20 20 20 20 72  riggers ){.    r
0700: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
0710: 69 66 28 20 70 54 6d 70 53 63 68 65 6d 61 21 3d  if( pTmpSchema!=
0720: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
0730: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
0740: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
0750: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
0760: 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  Held(pParse->db,
0770: 20 30 2c 20 70 54 6d 70 53 63 68 65 6d 61 29 20   0, pTmpSchema) 
0780: 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  );.    for(p=sql
0790: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 54  iteHashFirst(&pT
07a0: 6d 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  mpSchema->trigHa
07b0: 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  sh); p; p=sqlite
07c0: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
07d0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
07e0: 69 67 20 3d 20 28 54 72 69 67 67 65 72 20 2a 29  ig = (Trigger *)
07f0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
0800: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72  );.      if( pTr
0810: 69 67 2d 3e 70 54 61 62 53 63 68 65 6d 61 3d 3d  ig->pTabSchema==
0820: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 0a 20 20  pTab->pSchema.  
0830: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
0840: 65 33 53 74 72 49 43 6d 70 28 70 54 72 69 67 2d  e3StrICmp(pTrig-
0850: 3e 74 61 62 6c 65 2c 20 70 54 61 62 2d 3e 7a 4e  >table, pTab->zN
0860: 61 6d 65 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  ame) .      ){. 
0870: 20 20 20 20 20 20 20 70 54 72 69 67 2d 3e 70 4e         pTrig->pN
0880: 65 78 74 20 3d 20 28 70 4c 69 73 74 20 3f 20 70  ext = (pList ? p
0890: 4c 69 73 74 20 3a 20 70 54 61 62 2d 3e 70 54 72  List : pTab->pTr
08a0: 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  igger);.        
08b0: 70 4c 69 73 74 20 3d 20 70 54 72 69 67 3b 0a 20  pList = pTrig;. 
08c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
08d0: 0a 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73  ..  return (pLis
08e0: 74 20 3f 20 70 4c 69 73 74 20 3a 20 70 54 61 62  t ? pList : pTab
08f0: 2d 3e 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a  ->pTrigger);.}..
0900: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
0910: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
0920: 65 72 20 77 68 65 6e 20 69 74 20 73 65 65 73 20  er when it sees 
0930: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  a CREATE TRIGGER
0940: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 75 70   statement.** up
0950: 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20 6f 66   to the point of
0960: 20 74 68 65 20 42 45 47 49 4e 20 62 65 66 6f 72   the BEGIN befor
0970: 65 20 74 68 65 20 74 72 69 67 67 65 72 20 61 63  e the trigger ac
0980: 74 69 6f 6e 73 2e 20 20 41 20 54 72 69 67 67 65  tions.  A Trigge
0990: 72 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69  r.** structure i
09a0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 61 73 65  s generated base
09b0: 64 20 6f 6e 20 74 68 65 20 69 6e 66 6f 72 6d 61  d on the informa
09c0: 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65 20 61  tion available a
09d0: 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  nd stored.** in 
09e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
09f0: 67 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ger.  After the 
0a00: 74 72 69 67 67 65 72 20 61 63 74 69 6f 6e 73 20  trigger actions 
0a10: 68 61 76 65 20 62 65 65 6e 20 70 61 72 73 65 64  have been parsed
0a20: 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  , the.** sqlite3
0a30: 46 69 6e 69 73 68 54 72 69 67 67 65 72 28 29 20  FinishTrigger() 
0a40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
0a50: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
0a60: 68 65 20 74 72 69 67 67 65 72 0a 2a 2a 20 63 6f  he trigger.** co
0a70: 6e 73 74 72 75 63 74 69 6f 6e 20 70 72 6f 63 65  nstruction proce
0a80: 73 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ss..*/.void sqli
0a90: 74 65 33 42 65 67 69 6e 54 72 69 67 67 65 72 28  te3BeginTrigger(
0aa0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0ab0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
0ac0: 72 73 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  rse context of t
0ad0: 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45  he CREATE TRIGGE
0ae0: 52 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  R statement */. 
0af0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
0b00: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65       /* The name
0b10: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
0b20: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
0b30: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
0b40: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67  name of the trig
0b50: 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f  ger */.  int tr_
0b60: 74 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tm,          /* 
0b70: 4f 6e 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45  One of TK_BEFORE
0b80: 2c 20 54 4b 5f 41 46 54 45 52 2c 20 54 4b 5f 49  , TK_AFTER, TK_I
0b90: 4e 53 54 45 41 44 20 2a 2f 0a 20 20 69 6e 74 20  NSTEAD */.  int 
0ba0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
0bb0: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e 53  /* One of TK_INS
0bc0: 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20  ERT, TK_UPDATE, 
0bd0: 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 49  TK_DELETE */.  I
0be0: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c  dList *pColumns,
0bf0: 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73     /* column lis
0c00: 74 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  t if this is an 
0c10: 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67 65  UPDATE OF trigge
0c20: 72 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  r */.  SrcList *
0c30: 70 54 61 62 6c 65 4e 61 6d 65 2c 2f 2a 20 54 68  pTableName,/* Th
0c40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0c50: 62 6c 65 2f 76 69 65 77 20 74 68 65 20 74 72 69  ble/view the tri
0c60: 67 67 65 72 20 61 70 70 6c 69 65 73 20 74 6f 20  gger applies to 
0c70: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 6e  */.  Expr *pWhen
0c80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 4e  ,        /* WHEN
0c90: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
0ca0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
0cb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
0cc0: 54 45 4d 50 4f 52 41 52 59 20 6b 65 79 77 6f 72  TEMPORARY keywor
0cd0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0ce0: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
0cf0: 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73        /* Suppres
0d00: 73 20 65 72 72 6f 72 73 20 69 66 20 74 68 65 20  s errors if the 
0d10: 74 72 69 67 67 65 72 20 61 6c 72 65 61 64 79 20  trigger already 
0d20: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
0d30: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
0d40: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6e 65   = 0;  /* The ne
0d50: 77 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 54  w trigger */.  T
0d60: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
0d70: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
0d80: 74 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72  that the trigger
0d90: 20 66 69 72 65 73 20 6f 66 66 20 6f 66 20 2a 2f   fires off of */
0da0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
0db0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61   0;        /* Na
0dc0: 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  me of the trigge
0dd0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
0de0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0df0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
0e00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
0e10: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
0e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0e30: 20 64 61 74 61 62 61 73 65 20 74 6f 20 73 74 6f   database to sto
0e40: 72 65 20 74 68 65 20 74 72 69 67 67 65 72 20 69  re the trigger i
0e50: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
0e60: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
0e70: 2a 20 54 68 65 20 75 6e 71 75 61 6c 69 66 69 65  * The unqualifie
0e80: 64 20 64 62 20 6e 61 6d 65 20 2a 2f 0a 20 20 44  d db name */.  D
0e90: 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
0ea0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20         /* State 
0eb0: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 44  vector for the D
0ec0: 42 20 66 69 78 65 72 20 2a 2f 0a 20 20 69 6e 74  B fixer */.  int
0ed0: 20 69 54 61 62 44 62 3b 20 20 20 20 20 20 20 20   iTabDb;        
0ee0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
0ef0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
0f00: 6c 64 69 6e 67 20 70 54 61 62 20 2a 2f 0a 0a 20  lding pTab */.. 
0f10: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 21   assert( pName1!
0f20: 3d 30 20 29 3b 20 20 20 2f 2a 20 70 4e 61 6d 65  =0 );   /* pName
0f30: 31 2d 3e 7a 20 6d 69 67 68 74 20 62 65 20 4e 55  1->z might be NU
0f40: 4c 4c 2c 20 62 75 74 20 6e 6f 74 20 70 4e 61 6d  LL, but not pNam
0f50: 65 31 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 61  e1 itself */.  a
0f60: 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30  ssert( pName2!=0
0f70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
0f80: 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  ==TK_INSERT || o
0f90: 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20  p==TK_UPDATE || 
0fa0: 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 29 3b  op==TK_DELETE );
0fb0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0fc0: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0fd0: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
0fe0: 20 20 2f 2a 20 49 66 20 54 45 4d 50 20 77 61 73    /* If TEMP was
0ff0: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
1000: 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d   the trigger nam
1010: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
1020: 6c 69 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 69  lified. */.    i
1030: 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  f( pName2->n>0 )
1040: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1050: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1060: 22 74 65 6d 70 6f 72 61 72 79 20 74 72 69 67 67  "temporary trigg
1070: 65 72 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  er may not have 
1080: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 22 29  qualified name")
1090: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69  ;.      goto tri
10a0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
10b0: 20 20 7d 0a 20 20 20 20 69 44 62 20 3d 20 31 3b    }.    iDb = 1;
10c0: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61  .    pName = pNa
10d0: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me1;.  }else{.  
10e0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
10f0: 74 68 65 20 64 62 20 74 68 61 74 20 74 68 65 20  the db that the 
1100: 74 72 69 67 67 65 72 20 77 69 6c 6c 20 62 65 20  trigger will be 
1110: 63 72 65 61 74 65 64 20 69 6e 20 2a 2f 0a 20 20  created in */.  
1120: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
1130: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
1140: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
1150: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
1160: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
1170: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
1180: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
1190: 20 7d 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65   }.  if( !pTable
11a0: 4e 61 6d 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Name || db->mall
11b0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11c0: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
11d0: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
11e0: 41 20 6c 6f 6e 67 2d 73 74 61 6e 64 69 6e 67 20  A long-standing 
11f0: 70 61 72 73 65 72 20 62 75 67 20 69 73 20 74 68  parser bug is th
1200: 61 74 20 74 68 69 73 20 73 79 6e 74 61 78 20 77  at this syntax w
1210: 61 73 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  as allowed:.  **
1220: 0a 20 20 2a 2a 20 20 20 20 43 52 45 41 54 45 20  .  **    CREATE 
1230: 54 52 49 47 47 45 52 20 61 74 74 61 63 68 65 64  TRIGGER attached
1240: 2e 64 65 6d 6f 20 41 46 54 45 52 20 49 4e 53 45  .demo AFTER INSE
1250: 52 54 20 4f 4e 20 61 74 74 61 63 68 65 64 2e 74  RT ON attached.t
1260: 61 62 20 2e 2e 2e 2e 0a 20 20 2a 2a 20 20 20 20  ab .....  **    
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e               ^^^
12a0: 5e 5e 5e 5e 5e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ^^^^^.  **.  ** 
12b0: 54 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  To maintain back
12c0: 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
12d0: 69 74 79 2c 20 69 67 6e 6f 72 65 20 74 68 65 20  ity, ignore the 
12e0: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 6e 61  database.  ** na
12f0: 6d 65 20 6f 6e 20 70 54 61 62 6c 65 4e 61 6d 65  me on pTableName
1300: 20 69 66 20 77 65 20 61 72 65 20 72 65 70 61 72   if we are repar
1310: 73 69 6e 67 20 6f 75 74 20 6f 66 20 53 51 4c 49  sing out of SQLI
1320: 54 45 5f 4d 41 53 54 45 52 2e 0a 20 20 2a 2f 0a  TE_MASTER..  */.
1330: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1340: 75 73 79 20 26 26 20 69 44 62 21 3d 31 20 29 7b  usy && iDb!=1 ){
1350: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1360: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d  ee(db, pTableNam
1370: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1380: 65 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 4e 61  e);.    pTableNa
1390: 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
13a0: 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  se = 0;.  }..  /
13b0: 2a 20 49 66 20 74 68 65 20 74 72 69 67 67 65 72  * If the trigger
13c0: 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
13d0: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 74  ified, and the t
13e0: 61 62 6c 65 20 69 73 20 61 20 74 65 6d 70 20 74  able is a temp t
13f0: 61 62 6c 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  able,.  ** then 
1400: 73 65 74 20 69 44 62 20 74 6f 20 31 20 74 6f 20  set iDb to 1 to 
1410: 63 72 65 61 74 65 20 74 68 65 20 74 72 69 67 67  create the trigg
1420: 65 72 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  er in the tempor
1430: 61 72 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ary database..  
1440: 2a 2a 20 49 66 20 73 71 6c 69 74 65 33 53 72 63  ** If sqlite3Src
1450: 4c 69 73 74 4c 6f 6f 6b 75 70 28 29 20 72 65 74  ListLookup() ret
1460: 75 72 6e 73 20 30 2c 20 69 6e 64 69 63 61 74 69  urns 0, indicati
1470: 6e 67 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65  ng the table doe
1480: 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 78 69 73 74  s not.  ** exist
1490: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 63  , the error is c
14a0: 61 75 67 68 74 20 62 79 20 74 68 65 20 62 6c 6f  aught by the blo
14b0: 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  ck below..  */. 
14c0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
14d0: 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
14e0: 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  rse, pTableName)
14f0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ;.  if( db->init
1500: 2e 62 75 73 79 3d 3d 30 20 26 26 20 70 4e 61 6d  .busy==0 && pNam
1510: 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
1520: 0a 20 20 20 20 20 20 20 20 26 26 20 70 54 61 62  .        && pTab
1530: 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
1540: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
1550: 0a 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20  .    iDb = 1;.  
1560: 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74  }..  /* Ensure t
1570: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 61  he table name ma
1580: 74 63 68 65 73 20 64 61 74 61 62 61 73 65 20 6e  tches database n
1590: 61 6d 65 20 61 6e 64 20 74 68 61 74 20 74 68 65  ame and that the
15a0: 20 74 61 62 6c 65 20 65 78 69 73 74 73 20 2a 2f   table exists */
15b0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
15c0: 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 74  cFailed ) goto t
15d0: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
15e0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
15f0: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
1600: 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  .  sqlite3FixIni
1610: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
1620: 20 69 44 62 2c 20 22 74 72 69 67 67 65 72 22 2c   iDb, "trigger",
1630: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73   pName);.  if( s
1640: 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
1650: 28 26 73 46 69 78 2c 20 70 54 61 62 6c 65 4e 61  (&sFix, pTableNa
1660: 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  me) ){.    goto 
1670: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
1680: 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71  .  }.  pTab = sq
1690: 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
16a0: 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  up(pParse, pTabl
16b0: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70  eName);.  if( !p
16c0: 54 61 62 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Tab ){.    /* Th
16d0: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
16e0: 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69   exist. */.    i
16f0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
1700: 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =1 ){.      /* T
1710: 69 63 6b 65 74 20 23 33 38 31 30 2e 0a 20 20 20  icket #3810..   
1720: 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
1730: 77 68 65 6e 65 76 65 72 20 61 20 74 61 62 6c 65  whenever a table
1740: 20 69 73 20 64 72 6f 70 70 65 64 2c 20 61 6c 6c   is dropped, all
1750: 20 61 73 73 6f 63 69 61 74 65 64 20 74 72 69 67   associated trig
1760: 67 65 72 73 20 61 72 65 0a 20 20 20 20 20 20 2a  gers are.      *
1770: 2a 20 64 72 6f 70 70 65 64 20 74 6f 6f 2e 20 20  * dropped too.  
1780: 42 75 74 20 69 66 20 61 20 54 45 4d 50 20 74 72  But if a TEMP tr
1790: 69 67 67 65 72 20 69 73 20 63 72 65 61 74 65 64  igger is created
17a0: 20 6f 6e 20 61 20 6e 6f 6e 2d 54 45 4d 50 20 74   on a non-TEMP t
17b0: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  able.      ** an
17c0: 64 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  d the table is d
17d0: 72 6f 70 70 65 64 20 62 79 20 61 20 64 69 66 66  ropped by a diff
17e0: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63  erent database c
17f0: 6f 6e 6e 65 63 74 69 6f 6e 2c 20 74 68 65 0a 20  onnection, the. 
1800: 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
1810: 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 20 74  is not visible t
1820: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  o the database c
1830: 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 64  onnection that d
1840: 6f 65 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  oes the.      **
1850: 20 64 72 6f 70 20 73 6f 20 74 68 65 20 74 72 69   drop so the tri
1860: 67 67 65 72 20 63 61 6e 6e 6f 74 20 62 65 20 64  gger cannot be d
1870: 72 6f 70 70 65 64 2e 20 20 54 68 69 73 20 72 65  ropped.  This re
1880: 73 75 6c 74 73 20 69 6e 20 61 6e 0a 20 20 20 20  sults in an.    
1890: 20 20 2a 2a 20 22 6f 72 70 68 61 6e 65 64 20 74    ** "orphaned t
18a0: 72 69 67 67 65 72 22 20 2d 20 61 20 74 72 69 67  rigger" - a trig
18b0: 67 65 72 20 77 68 6f 73 65 20 61 73 73 6f 63 69  ger whose associ
18c0: 61 74 65 64 20 74 61 62 6c 65 20 69 73 20 6d 69  ated table is mi
18d0: 73 73 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ssing..      */.
18e0: 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6f        db->init.o
18f0: 72 70 68 61 6e 54 72 69 67 67 65 72 20 3d 20 31  rphanTrigger = 1
1900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f  ;.    }.    goto
1910: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1920: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
1930: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1940: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1950: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
1960: 6f 74 20 63 72 65 61 74 65 20 74 72 69 67 67 65  ot create trigge
1970: 72 73 20 6f 6e 20 76 69 72 74 75 61 6c 20 74 61  rs on virtual ta
1980: 62 6c 65 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f  bles");.    goto
1990: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
19a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
19b0: 6b 20 74 68 61 74 20 74 68 65 20 74 72 69 67 67  k that the trigg
19c0: 65 72 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 72  er name is not r
19d0: 65 73 65 72 76 65 64 20 61 6e 64 20 74 68 61 74  eserved and that
19e0: 20 6e 6f 20 74 72 69 67 67 65 72 20 6f 66 20 74   no trigger of t
19f0: 68 65 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  he.  ** specifie
1a00: 64 20 6e 61 6d 65 20 65 78 69 73 74 73 20 2a 2f  d name exists */
1a10: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
1a20: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1a30: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
1a40: 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 53 51 4c 49  ( !zName || SQLI
1a50: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
1a60: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
1a70: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
1a80: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
1a90: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
1aa0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1ab0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1ac0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
1ad0: 69 66 28 20 73 71 6c 69 74 65 33 48 61 73 68 46  if( sqlite3HashF
1ae0: 69 6e 64 28 26 28 64 62 2d 3e 61 44 62 5b 69 44  ind(&(db->aDb[iD
1af0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67  b].pSchema->trig
1b00: 48 61 73 68 29 2c 7a 4e 61 6d 65 29 20 29 7b 0a  Hash),zName) ){.
1b10: 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29      if( !noErr )
1b20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1b30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b40: 22 74 72 69 67 67 65 72 20 25 54 20 61 6c 72 65  "trigger %T alre
1b50: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
1b60: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
1b70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
1b80: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
1b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1ba0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
1bb0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1bc0: 7d 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  }.    goto trigg
1bd0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
1be0: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 63 72 65  .  /* Do not cre
1bf0: 61 74 65 20 61 20 74 72 69 67 67 65 72 20 6f 6e  ate a trigger on
1c00: 20 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20   a system table 
1c10: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1c20: 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
1c30: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
1c40: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71   7)==0 ){.    sq
1c50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c60: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72  arse, "cannot cr
1c70: 65 61 74 65 20 74 72 69 67 67 65 72 20 6f 6e 20  eate trigger on 
1c80: 73 79 73 74 65 6d 20 74 61 62 6c 65 22 29 3b 0a  system table");.
1c90: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
1ca0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
1cb0: 20 2f 2a 20 49 4e 53 54 45 41 44 20 6f 66 20 74   /* INSTEAD of t
1cc0: 72 69 67 67 65 72 73 20 61 72 65 20 6f 6e 6c 79  riggers are only
1cd0: 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 76   for views and v
1ce0: 69 65 77 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  iews only suppor
1cf0: 74 20 49 4e 53 54 45 41 44 0a 20 20 2a 2a 20 6f  t INSTEAD.  ** o
1d00: 66 20 74 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f  f triggers..  */
1d10: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
1d20: 6c 65 63 74 20 26 26 20 74 72 5f 74 6d 21 3d 54  lect && tr_tm!=T
1d30: 4b 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20  K_INSTEAD ){.   
1d40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d50: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
1d60: 20 63 72 65 61 74 65 20 25 73 20 74 72 69 67 67   create %s trigg
1d70: 65 72 20 6f 6e 20 76 69 65 77 3a 20 25 53 22 2c  er on view: %S",
1d80: 20 0a 20 20 20 20 20 20 20 20 28 74 72 5f 74 6d   .        (tr_tm
1d90: 20 3d 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f 22   == TK_BEFORE)?"
1da0: 42 45 46 4f 52 45 22 3a 22 41 46 54 45 52 22 2c  BEFORE":"AFTER",
1db0: 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b   pTableName, 0);
1dc0: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
1dd0: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  r_cleanup;.  }. 
1de0: 20 69 66 28 20 21 70 54 61 62 2d 3e 70 53 65 6c   if( !pTab->pSel
1df0: 65 63 74 20 26 26 20 74 72 5f 74 6d 3d 3d 54 4b  ect && tr_tm==TK
1e00: 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20  _INSTEAD ){.    
1e10: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1e20: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
1e30: 63 72 65 61 74 65 20 49 4e 53 54 45 41 44 20 4f  create INSTEAD O
1e40: 46 22 0a 20 20 20 20 20 20 20 20 22 20 74 72 69  F".        " tri
1e50: 67 67 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20 25  gger on table: %
1e60: 53 22 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20  S", pTableName, 
1e70: 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69  0);.    goto tri
1e80: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
1e90: 7d 0a 20 20 69 54 61 62 44 62 20 3d 20 73 71 6c  }.  iTabDb = sql
1ea0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1eb0: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
1ec0: 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
1ed0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1ee0: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
1ef0: 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
1f00: 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45  TE_CREATE_TRIGGE
1f10: 52 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  R;.    const cha
1f20: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
1f30: 5b 69 54 61 62 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  [iTabDb].zName;.
1f40: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f50: 7a 44 62 54 72 69 67 20 3d 20 69 73 54 65 6d 70  zDbTrig = isTemp
1f60: 20 3f 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e   ? db->aDb[1].zN
1f70: 61 6d 65 20 3a 20 7a 44 62 3b 0a 20 20 20 20 69  ame : zDb;.    i
1f80: 66 28 20 69 54 61 62 44 62 3d 3d 31 20 7c 7c 20  f( iTabDb==1 || 
1f90: 69 73 54 65 6d 70 20 29 20 63 6f 64 65 20 3d 20  isTemp ) code = 
1fa0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
1fb0: 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20  MP_TRIGGER;.    
1fc0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1fd0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
1fe0: 65 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  e, zName, pTab->
1ff0: 7a 4e 61 6d 65 2c 20 7a 44 62 54 72 69 67 29 20  zName, zDbTrig) 
2000: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72  ){.      goto tr
2010: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
2020: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
2030: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2040: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
2050: 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
2060: 45 28 69 54 61 62 44 62 29 2c 30 2c 7a 44 62 29  E(iTabDb),0,zDb)
2070: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72  ){.      goto tr
2080: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
2090: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
20a0: 0a 20 20 2f 2a 20 49 4e 53 54 45 41 44 20 4f 46  .  /* INSTEAD OF
20b0: 20 74 72 69 67 67 65 72 73 20 63 61 6e 20 6f 6e   triggers can on
20c0: 6c 79 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65  ly appear on vie
20d0: 77 73 20 61 6e 64 20 42 45 46 4f 52 45 20 74 72  ws and BEFORE tr
20e0: 69 67 67 65 72 73 0a 20 20 2a 2a 20 63 61 6e 6e  iggers.  ** cann
20f0: 6f 74 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65  ot appear on vie
2100: 77 73 2e 20 20 53 6f 20 77 65 20 6d 69 67 68 74  ws.  So we might
2110: 20 61 73 20 77 65 6c 6c 20 74 72 61 6e 73 6c 61   as well transla
2120: 74 65 20 65 76 65 72 79 0a 20 20 2a 2a 20 49 4e  te every.  ** IN
2130: 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65 72  STEAD OF trigger
2140: 20 69 6e 74 6f 20 61 20 42 45 46 4f 52 45 20 74   into a BEFORE t
2150: 72 69 67 67 65 72 2e 20 20 49 74 20 73 69 6d 70  rigger.  It simp
2160: 6c 69 66 69 65 73 20 63 6f 64 65 0a 20 20 2a 2a  lifies code.  **
2170: 20 65 6c 73 65 77 68 65 72 65 2e 0a 20 20 2a 2f   elsewhere..  */
2180: 0a 20 20 69 66 20 28 74 72 5f 74 6d 20 3d 3d 20  .  if (tr_tm == 
2190: 54 4b 5f 49 4e 53 54 45 41 44 29 7b 0a 20 20 20  TK_INSTEAD){.   
21a0: 20 74 72 5f 74 6d 20 3d 20 54 4b 5f 42 45 46 4f   tr_tm = TK_BEFO
21b0: 52 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75  RE;.  }..  /* Bu
21c0: 69 6c 64 20 74 68 65 20 54 72 69 67 67 65 72 20  ild the Trigger 
21d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 54 72 69  object */.  pTri
21e0: 67 67 65 72 20 3d 20 28 54 72 69 67 67 65 72 2a  gger = (Trigger*
21f0: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
2200: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
2210: 54 72 69 67 67 65 72 29 29 3b 0a 20 20 69 66 28  Trigger));.  if(
2220: 20 70 54 72 69 67 67 65 72 3d 3d 30 20 29 20 67   pTrigger==0 ) g
2230: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
2240: 6e 75 70 3b 0a 20 20 70 54 72 69 67 67 65 72 2d  nup;.  pTrigger-
2250: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
2260: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70    zName = 0;.  p
2270: 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 20 3d  Trigger->table =
2280: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2290: 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d  (db, pTableName-
22a0: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[0].zName);.  
22b0: 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
22c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
22d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 72 69  .pSchema;.  pTri
22e0: 67 67 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61  gger->pTabSchema
22f0: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
2300: 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 6f 70  ;.  pTrigger->op
2310: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 54 72   = (u8)op;.  pTr
2320: 69 67 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 20 74  igger->tr_tm = t
2330: 72 5f 74 6d 3d 3d 54 4b 5f 42 45 46 4f 52 45 20  r_tm==TK_BEFORE 
2340: 3f 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45  ? TRIGGER_BEFORE
2350: 20 3a 20 54 52 49 47 47 45 52 5f 41 46 54 45 52   : TRIGGER_AFTER
2360: 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70 57  ;.  pTrigger->pW
2370: 68 65 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  hen = sqlite3Exp
2380: 72 44 75 70 28 64 62 2c 20 70 57 68 65 6e 2c 20  rDup(db, pWhen, 
2390: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
23a0: 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70 43 6f  .  pTrigger->pCo
23b0: 6c 75 6d 6e 73 20 3d 20 73 71 6c 69 74 65 33 49  lumns = sqlite3I
23c0: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 6f  dListDup(db, pCo
23d0: 6c 75 6d 6e 73 29 3b 0a 20 20 61 73 73 65 72 74  lumns);.  assert
23e0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72  ( pParse->pNewTr
23f0: 69 67 67 65 72 3d 3d 30 20 29 3b 0a 20 20 70 50  igger==0 );.  pP
2400: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
2410: 72 20 3d 20 70 54 72 69 67 67 65 72 3b 0a 0a 74  r = pTrigger;..t
2420: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a  rigger_cleanup:.
2430: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2440: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
2450: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
2460: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d  te(db, pTableNam
2470: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  e);.  sqlite3IdL
2480: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
2490: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74  olumns);.  sqlit
24a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
24b0: 20 70 57 68 65 6e 29 3b 0a 20 20 69 66 28 20 21   pWhen);.  if( !
24c0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
24d0: 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ger ){.    sqlit
24e0: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 28  e3DeleteTrigger(
24f0: 64 62 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  db, pTrigger);. 
2500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2510: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
2520: 54 72 69 67 67 65 72 3d 3d 70 54 72 69 67 67 65  Trigger==pTrigge
2530: 72 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r );.  }.}../*.*
2540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2550: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
2560: 6c 6c 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  ll of the trigge
2570: 72 20 61 63 74 69 6f 6e 73 20 68 61 76 65 20 62  r actions have b
2580: 65 65 6e 20 70 61 72 73 65 64 0a 2a 2a 20 69 6e  een parsed.** in
2590: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
25a0: 74 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  te the process o
25b0: 66 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 74  f building the t
25c0: 72 69 67 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  rigger..*/.void 
25d0: 73 71 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69  sqlite3FinishTri
25e0: 67 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  gger(.  Parse *p
25f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
2600: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
2610: 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74  t */.  TriggerSt
2620: 65 70 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 2f  ep *pStepList, /
2630: 2a 20 54 68 65 20 74 72 69 67 67 65 72 65 64 20  * The triggered 
2640: 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 54 6f 6b  program */.  Tok
2650: 65 6e 20 2a 70 41 6c 6c 20 20 20 20 20 20 20 20  en *pAll        
2660: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 68       /* Token th
2670: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
2680: 20 63 6f 6d 70 6c 65 74 65 20 43 52 45 41 54 45   complete CREATE
2690: 20 54 52 49 47 47 45 52 20 2a 2f 0a 29 7b 0a 20   TRIGGER */.){. 
26a0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 20   Trigger *pTrig 
26b0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72  = pParse->pNewTr
26c0: 69 67 67 65 72 3b 20 20 20 2f 2a 20 54 72 69 67  igger;   /* Trig
26d0: 67 65 72 20 62 65 69 6e 67 20 66 69 6e 69 73 68  ger being finish
26e0: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
26f0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67  /* Name of trigg
2720: 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
2730: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
2740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2750: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
2760: 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  */.  DbFixer sFi
2770: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2790: 46 69 78 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Fixer object */.
27a0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
27d0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
27e0: 20 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a   the trigger */.
27f0: 20 20 54 6f 6b 65 6e 20 6e 61 6d 65 54 6f 6b 65    Token nameToke
2800: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 69            /* Tri
2820: 67 67 65 72 20 6e 61 6d 65 20 66 6f 72 20 65 72  gger name for er
2830: 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 20 2a 2f  ror reporting */
2840: 0a 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ..  pParse->pNew
2850: 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 69  Trigger = 0;.  i
2860: 66 28 20 4e 45 56 45 52 28 70 50 61 72 73 65 2d  f( NEVER(pParse-
2870: 3e 6e 45 72 72 29 20 7c 7c 20 21 70 54 72 69 67  >nErr) || !pTrig
2880: 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66   ) goto triggerf
2890: 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20  inish_cleanup;. 
28a0: 20 7a 4e 61 6d 65 20 3d 20 70 54 72 69 67 2d 3e   zName = pTrig->
28b0: 7a 4e 61 6d 65 3b 0a 20 20 69 44 62 20 3d 20 73  zName;.  iDb = s
28c0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
28d0: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
28e0: 70 54 72 69 67 2d 3e 70 53 63 68 65 6d 61 29 3b  pTrig->pSchema);
28f0: 0a 20 20 70 54 72 69 67 2d 3e 73 74 65 70 5f 6c  .  pTrig->step_l
2900: 69 73 74 20 3d 20 70 53 74 65 70 4c 69 73 74 3b  ist = pStepList;
2910: 0a 20 20 77 68 69 6c 65 28 20 70 53 74 65 70 4c  .  while( pStepL
2920: 69 73 74 20 29 7b 0a 20 20 20 20 70 53 74 65 70  ist ){.    pStep
2930: 4c 69 73 74 2d 3e 70 54 72 69 67 20 3d 20 70 54  List->pTrig = pT
2940: 72 69 67 3b 0a 20 20 20 20 70 53 74 65 70 4c 69  rig;.    pStepLi
2950: 73 74 20 3d 20 70 53 74 65 70 4c 69 73 74 2d 3e  st = pStepList->
2960: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  pNext;.  }.  sql
2970: 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 6e  ite3TokenInit(&n
2980: 61 6d 65 54 6f 6b 65 6e 2c 20 70 54 72 69 67 2d  ameToken, pTrig-
2990: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
29a0: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
29b0: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74   pParse, iDb, "t
29c0: 72 69 67 67 65 72 22 2c 20 26 6e 61 6d 65 54 6f  rigger", &nameTo
29d0: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ken);.  if( sqli
29e0: 74 65 33 46 69 78 54 72 69 67 67 65 72 53 74 65  te3FixTriggerSte
29f0: 70 28 26 73 46 69 78 2c 20 70 54 72 69 67 2d 3e  p(&sFix, pTrig->
2a00: 73 74 65 70 5f 6c 69 73 74 29 20 0a 20 20 20 7c  step_list) .   |
2a10: 7c 20 73 71 6c 69 74 65 33 46 69 78 45 78 70 72  | sqlite3FixExpr
2a20: 28 26 73 46 69 78 2c 20 70 54 72 69 67 2d 3e 70  (&sFix, pTrig->p
2a30: 57 68 65 6e 29 20 0a 20 20 29 7b 0a 20 20 20 20  When) .  ){.    
2a40: 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69  goto triggerfini
2a50: 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  sh_cleanup;.  }.
2a60: 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 72 65 20  .  /* if we are 
2a70: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
2a80: 2c 0a 20 20 2a 2a 20 62 75 69 6c 64 20 74 68 65  ,.  ** build the
2a90: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 65   sqlite_master e
2aa0: 6e 74 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ntry.  */.  if( 
2ab0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
2ac0: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  {.    Vdbe *v;. 
2ad0: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20     char *z;..   
2ae0: 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   /* Make an entr
2af0: 79 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  y in the sqlite_
2b00: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
2b10: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
2b20: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
2b30: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
2b40: 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69 73  oto triggerfinis
2b50: 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 73  h_cleanup;.    s
2b60: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
2b70: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
2b80: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 7a  , 0, iDb);.    z
2b90: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
2ba0: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
2bb0: 41 6c 6c 2d 3e 7a 2c 20 70 41 6c 6c 2d 3e 6e 29  All->z, pAll->n)
2bc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  ;.    sqlite3Nes
2bd0: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
2be0: 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20  .       "INSERT 
2bf0: 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45  INTO %Q.%s VALUE
2c00: 53 28 27 74 72 69 67 67 65 72 27 2c 25 51 2c 25  S('trigger',%Q,%
2c10: 51 2c 30 2c 27 43 52 45 41 54 45 20 54 52 49 47  Q,0,'CREATE TRIG
2c20: 47 45 52 20 25 71 27 29 22 2c 0a 20 20 20 20 20  GER %q')",.     
2c30: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
2c40: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
2c50: 4c 45 28 69 44 62 29 2c 20 7a 4e 61 6d 65 2c 0a  LE(iDb), zName,.
2c60: 20 20 20 20 20 20 20 70 54 72 69 67 2d 3e 74 61         pTrig->ta
2c70: 62 6c 65 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  ble, z);.    sql
2c80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2c90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
2ca0: 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
2cb0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
2cc0: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
2cd0: 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
2ce0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2cf0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74 79 70  MPrintf(db, "typ
2d00: 65 3d 27 74 72 69 67 67 65 72 27 20 41 4e 44 20  e='trigger' AND 
2d10: 6e 61 6d 65 3d 27 25 71 27 22 2c 20 7a 4e 61 6d  name='%q'", zNam
2d20: 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  e));.  }..  if( 
2d30: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
2d40: 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 4c  .    Trigger *pL
2d50: 69 6e 6b 20 3d 20 70 54 72 69 67 3b 0a 20 20 20  ink = pTrig;.   
2d60: 20 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26   Hash *pHash = &
2d70: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
2d80: 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 3b 0a  hema->trigHash;.
2d90: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2da0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2db0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
2dc0: 3b 0a 20 20 20 20 70 54 72 69 67 20 3d 20 73 71  ;.    pTrig = sq
2dd0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
2de0: 70 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 70 54  pHash, zName, pT
2df0: 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 70 54  rig);.    if( pT
2e00: 72 69 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  rig ){.      sql
2e10: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
2e20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2e30: 70 4c 69 6e 6b 2d 3e 70 53 63 68 65 6d 61 3d 3d  pLink->pSchema==
2e40: 70 4c 69 6e 6b 2d 3e 70 54 61 62 53 63 68 65 6d  pLink->pTabSchem
2e50: 61 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  a ){.      Table
2e60: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 70 54   *pTab;.      pT
2e70: 61 62 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ab = sqlite3Hash
2e80: 46 69 6e 64 28 26 70 4c 69 6e 6b 2d 3e 70 54 61  Find(&pLink->pTa
2e90: 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  bSchema->tblHash
2ea0: 2c 20 70 4c 69 6e 6b 2d 3e 74 61 62 6c 65 29 3b  , pLink->table);
2eb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ec0: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
2ed0: 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70  pLink->pNext = p
2ee0: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  Tab->pTrigger;. 
2ef0: 20 20 20 20 20 70 54 61 62 2d 3e 70 54 72 69 67       pTab->pTrig
2f00: 67 65 72 20 3d 20 70 4c 69 6e 6b 3b 0a 20 20 20  ger = pLink;.   
2f10: 20 7d 0a 20 20 7d 0a 0a 74 72 69 67 67 65 72 66   }.  }..triggerf
2f20: 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3a 0a 20  inish_cleanup:. 
2f30: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72   sqlite3DeleteTr
2f40: 69 67 67 65 72 28 64 62 2c 20 70 54 72 69 67 29  igger(db, pTrig)
2f50: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
2f60: 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72  rse->pNewTrigger
2f70: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c   );.  sqlite3Del
2f80: 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28 64  eteTriggerStep(d
2f90: 62 2c 20 70 53 74 65 70 4c 69 73 74 29 3b 0a 7d  b, pStepList);.}
2fa0: 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 53  ../*.** Turn a S
2fb0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2fc0: 28 74 68 61 74 20 74 68 65 20 70 53 65 6c 65 63  (that the pSelec
2fd0: 74 20 70 61 72 61 6d 65 74 65 72 20 70 6f 69 6e  t parameter poin
2fe0: 74 73 20 74 6f 29 20 69 6e 74 6f 0a 2a 2a 20 61  ts to) into.** a
2ff0: 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20 20   trigger step.  
3000: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
3010: 20 74 6f 20 61 20 54 72 69 67 67 65 72 53 74 65   to a TriggerSte
3020: 70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  p structure..**.
3030: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
3040: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
3050: 20 77 68 65 6e 20 69 74 20 66 69 6e 64 73 20 61   when it finds a
3060: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3070: 74 20 69 6e 0a 2a 2a 20 62 6f 64 79 20 6f 66 20  t in.** body of 
3080: 61 20 54 52 49 47 47 45 52 2e 20 20 0a 2a 2f 0a  a TRIGGER.  .*/.
3090: 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c  TriggerStep *sql
30a0: 69 74 65 33 54 72 69 67 67 65 72 53 65 6c 65 63  ite3TriggerSelec
30b0: 74 53 74 65 70 28 73 71 6c 69 74 65 33 20 2a 64  tStep(sqlite3 *d
30c0: 62 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  b, Select *pSele
30d0: 63 74 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74  ct){.  TriggerSt
30e0: 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65 70  ep *pTriggerStep
30f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
3100: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
3110: 66 28 54 72 69 67 67 65 72 53 74 65 70 29 29 3b  f(TriggerStep));
3120: 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53  .  if( pTriggerS
3130: 74 65 70 3d 3d 30 20 29 20 7b 0a 20 20 20 20 73  tep==0 ) {.    s
3140: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
3150: 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
3160: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3170: 20 7d 0a 20 20 70 54 72 69 67 67 65 72 53 74 65   }.  pTriggerSte
3180: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
3190: 54 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  T;.  pTriggerSte
31a0: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65  p->pSelect = pSe
31b0: 6c 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65 72  lect;.  pTrigger
31c0: 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f  Step->orconf = O
31d0: 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 72 65 74  E_Default;.  ret
31e0: 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70  urn pTriggerStep
31f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
3200: 61 74 65 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  ate space to hol
3210: 64 20 61 20 6e 65 77 20 74 72 69 67 67 65 72 20  d a new trigger 
3220: 73 74 65 70 2e 20 20 54 68 65 20 61 6c 6c 6f 63  step.  The alloc
3230: 61 74 65 64 20 73 70 61 63 65 0a 2a 2a 20 68 6f  ated space.** ho
3240: 6c 64 73 20 62 6f 74 68 20 74 68 65 20 54 72 69  lds both the Tri
3250: 67 67 65 72 53 74 65 70 20 6f 62 6a 65 63 74 20  ggerStep object 
3260: 61 6e 64 20 74 68 65 20 54 72 69 67 67 65 72 53  and the TriggerS
3270: 74 65 70 2e 74 61 72 67 65 74 2e 7a 20 73 74 72  tep.target.z str
3280: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
3290: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
32a0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
32b0: 6e 65 64 20 61 6e 64 20 64 62 2d 3e 6d 61 6c 6c  ned and db->mall
32c0: 6f 63 46 61 69 6c 65 64 20 69 73 20 73 65 74 2e  ocFailed is set.
32d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67 67  .*/.static Trigg
32e0: 65 72 53 74 65 70 20 2a 74 72 69 67 67 65 72 53  erStep *triggerS
32f0: 74 65 70 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73  tepAllocate(.  s
3300: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
3310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
3320: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3330: 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20  n */.  u8 op,   
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 6f 70     /* Trigger op
3360: 63 6f 64 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  code */.  Token 
3370: 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *pName          
3380: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 72        /* The tar
3390: 67 65 74 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  get name */.){. 
33a0: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54   TriggerStep *pT
33b0: 72 69 67 67 65 72 53 74 65 70 3b 0a 0a 20 20 70  riggerStep;..  p
33c0: 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 73 71  TriggerStep = sq
33d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
33e0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72 69  o(db, sizeof(Tri
33f0: 67 67 65 72 53 74 65 70 29 20 2b 20 70 4e 61 6d  ggerStep) + pNam
3400: 65 2d 3e 6e 20 2b 20 31 29 3b 0a 20 20 69 66 28  e->n + 1);.  if(
3410: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b   pTriggerStep ){
3420: 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
3430: 63 68 61 72 2a 29 26 70 54 72 69 67 67 65 72 53  char*)&pTriggerS
3440: 74 65 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  tep[1];.    memc
3450: 70 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  py(z, pName->z, 
3460: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73  pName->n);.    s
3470: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29  qlite3Dequote(z)
3480: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
3490: 65 70 2d 3e 7a 54 61 72 67 65 74 20 3d 20 7a 3b  ep->zTarget = z;
34a0: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
34b0: 70 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 7d 0a  p->op = op;.  }.
34c0: 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65    return pTrigge
34d0: 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rStep;.}../*.** 
34e0: 42 75 69 6c 64 20 61 20 74 72 69 67 67 65 72 20  Build a trigger 
34f0: 73 74 65 70 20 6f 75 74 20 6f 66 20 61 6e 20 49  step out of an I
3500: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e  NSERT statement.
3510: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
3520: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 77  er.** to the new
3530: 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 0a 2a   trigger step..*
3540: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
3550: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
3560: 6e 65 20 77 68 65 6e 20 69 74 20 73 65 65 73 20  ne when it sees 
3570: 61 6e 20 49 4e 53 45 52 54 20 69 6e 73 69 64 65  an INSERT inside
3580: 20 74 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20   the.** body of 
3590: 61 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72  a trigger..*/.Tr
35a0: 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74  iggerStep *sqlit
35b0: 65 33 54 72 69 67 67 65 72 49 6e 73 65 72 74 53  e3TriggerInsertS
35c0: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  tep(.  sqlite3 *
35d0: 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  db,        /* Th
35e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
35f0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
3600: 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 2f   *pTableName,  /
3610: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
3620: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
3630: 65 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 49 64  e insert */.  Id
3640: 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20  List *pColumn,  
3650: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
3660: 75 6d 6e 73 20 69 6e 20 70 54 61 62 6c 65 4e 61  umns in pTableNa
3670: 6d 65 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  me to insert int
3680: 6f 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  o */.  Select *p
3690: 53 65 6c 65 63 74 2c 20 20 20 20 2f 2a 20 41 20  Select,    /* A 
36a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
36b0: 20 74 68 61 74 20 73 75 70 70 6c 69 65 73 20 76   that supplies v
36c0: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 6f 72  alues */.  u8 or
36d0: 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f  conf           /
36e0: 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61  * The conflict a
36f0: 6c 67 6f 72 69 74 68 6d 20 28 4f 45 5f 41 62 6f  lgorithm (OE_Abo
3700: 72 74 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  rt, OE_Replace, 
3710: 65 74 63 2e 29 20 2a 2f 0a 29 7b 0a 20 20 54 72  etc.) */.){.  Tr
3720: 69 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67  iggerStep *pTrig
3730: 67 65 72 53 74 65 70 3b 0a 0a 20 20 61 73 73 65  gerStep;..  asse
3740: 72 74 28 70 53 65 6c 65 63 74 20 21 3d 20 30 20  rt(pSelect != 0 
3750: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
3760: 6c 65 64 29 3b 0a 0a 20 20 70 54 72 69 67 67 65  led);..  pTrigge
3770: 72 53 74 65 70 20 3d 20 74 72 69 67 67 65 72 53  rStep = triggerS
3780: 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62 2c 20  tepAllocate(db, 
3790: 54 4b 5f 49 4e 53 45 52 54 2c 20 70 54 61 62 6c  TK_INSERT, pTabl
37a0: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  eName);.  if( pT
37b0: 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20  riggerStep ){.  
37c0: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
37d0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
37e0: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
37f0: 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f  Select, EXPRDUP_
3800: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 70 54 72  REDUCE);.    pTr
3810: 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c 69  iggerStep->pIdLi
3820: 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20  st = pColumn;.  
3830: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3840: 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b  orconf = orconf;
3850: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
3860: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
3870: 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b 0a  e(db, pColumn);.
3880: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
3890: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
38a0: 65 6c 65 63 74 29 3b 0a 0a 20 20 72 65 74 75 72  elect);..  retur
38b0: 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a  n pTriggerStep;.
38c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
38d0: 63 74 20 61 20 74 72 69 67 67 65 72 20 73 74 65  ct a trigger ste
38e0: 70 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  p that implement
38f0: 73 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  s an UPDATE stat
3900: 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  ement and return
3910: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
3920: 20 74 68 61 74 20 74 72 69 67 67 65 72 20 73 74   that trigger st
3930: 65 70 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ep.  The parser 
3940: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
3950: 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73 65  ne when it.** se
3960: 65 73 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  es an UPDATE sta
3970: 74 65 6d 65 6e 74 20 69 6e 73 69 64 65 20 74 68  tement inside th
3980: 65 20 62 6f 64 79 20 6f 66 20 61 20 43 52 45 41  e body of a CREA
3990: 54 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a 54  TE TRIGGER..*/.T
39a0: 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69  riggerStep *sqli
39b0: 74 65 33 54 72 69 67 67 65 72 55 70 64 61 74 65  te3TriggerUpdate
39c0: 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 20  Step(.  sqlite3 
39d0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
39e0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
39f0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  nection */.  Tok
3a00: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20  en *pTableName, 
3a10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3a20: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 75 70 64   table to be upd
3a30: 61 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ated */.  ExprLi
3a40: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f  st *pEList,    /
3a50: 2a 20 54 68 65 20 53 45 54 20 63 6c 61 75 73 65  * The SET clause
3a60: 3a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  : list of column
3a70: 20 61 6e 64 20 6e 65 77 20 76 61 6c 75 65 73 20   and new values 
3a80: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
3a90: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
3aa0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
3ab0: 0a 20 20 75 38 20 6f 72 63 6f 6e 66 20 20 20 20  .  u8 orconf    
3ac0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
3ad0: 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68  onflict algorith
3ae0: 6d 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45  m. (OE_Abort, OE
3af0: 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 20 2a 2f  _Ignore, etc) */
3b00: 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65  .){.  TriggerSte
3b10: 70 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b  p *pTriggerStep;
3b20: 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ..  pTriggerStep
3b30: 20 3d 20 74 72 69 67 67 65 72 53 74 65 70 41 6c   = triggerStepAl
3b40: 6c 6f 63 61 74 65 28 64 62 2c 20 54 4b 5f 55 50  locate(db, TK_UP
3b50: 44 41 54 45 2c 20 70 54 61 62 6c 65 4e 61 6d 65  DATE, pTableName
3b60: 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  );.  if( pTrigge
3b70: 72 53 74 65 70 20 29 7b 0a 20 20 20 20 70 54 72  rStep ){.    pTr
3b80: 69 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72  iggerStep->pExpr
3b90: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
3ba0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45  prListDup(db, pE
3bb0: 4c 69 73 74 2c 20 45 58 50 52 44 55 50 5f 52 45  List, EXPRDUP_RE
3bc0: 44 55 43 45 29 3b 0a 20 20 20 20 70 54 72 69 67  DUCE);.    pTrig
3bd0: 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65 20  gerStep->pWhere 
3be0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3bf0: 28 64 62 2c 20 70 57 68 65 72 65 2c 20 45 58 50  (db, pWhere, EXP
3c00: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
3c10: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3c20: 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b  orconf = orconf;
3c30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
3c40: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
3c50: 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69   pEList);.  sqli
3c60: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3c70: 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 72 65 74  , pWhere);.  ret
3c80: 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70  urn pTriggerStep
3c90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  ;.}../*.** Const
3ca0: 72 75 63 74 20 61 20 74 72 69 67 67 65 72 20 73  ruct a trigger s
3cb0: 74 65 70 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  tep that impleme
3cc0: 6e 74 73 20 61 20 44 45 4c 45 54 45 20 73 74 61  nts a DELETE sta
3cd0: 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72  tement and retur
3ce0: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
3cf0: 6f 20 74 68 61 74 20 74 72 69 67 67 65 72 20 73  o that trigger s
3d00: 74 65 70 2e 20 20 54 68 65 20 70 61 72 73 65 72  tep.  The parser
3d10: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
3d20: 69 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73  ine when it.** s
3d30: 65 65 73 20 61 20 44 45 4c 45 54 45 20 73 74 61  ees a DELETE sta
3d40: 74 65 6d 65 6e 74 20 69 6e 73 69 64 65 20 74 68  tement inside th
3d50: 65 20 62 6f 64 79 20 6f 66 20 61 20 43 52 45 41  e body of a CREA
3d60: 54 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a 54  TE TRIGGER..*/.T
3d70: 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69  riggerStep *sqli
3d80: 74 65 33 54 72 69 67 67 65 72 44 65 6c 65 74 65  te3TriggerDelete
3d90: 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 20  Step(.  sqlite3 
3da0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
3db0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
3dc0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
3dd0: 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20  n *pTableName,  
3de0: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
3df0: 20 66 72 6f 6d 20 77 68 69 63 68 20 72 6f 77 73   from which rows
3e00: 20 61 72 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a   are deleted */.
3e10: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 20    Expr *pWhere  
3e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3e30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
3e40: 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65  .){.  TriggerSte
3e50: 70 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b  p *pTriggerStep;
3e60: 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ..  pTriggerStep
3e70: 20 3d 20 74 72 69 67 67 65 72 53 74 65 70 41 6c   = triggerStepAl
3e80: 6c 6f 63 61 74 65 28 64 62 2c 20 54 4b 5f 44 45  locate(db, TK_DE
3e90: 4c 45 54 45 2c 20 70 54 61 62 6c 65 4e 61 6d 65  LETE, pTableName
3ea0: 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  );.  if( pTrigge
3eb0: 72 53 74 65 70 20 29 7b 0a 20 20 20 20 70 54 72  rStep ){.    pTr
3ec0: 69 67 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72  iggerStep->pWher
3ed0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
3ee0: 75 70 28 64 62 2c 20 70 57 68 65 72 65 2c 20 45  up(db, pWhere, E
3ef0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
3f00: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
3f10: 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44 65  ->orconf = OE_De
3f20: 66 61 75 6c 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  fault;.  }.  sql
3f30: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
3f40: 62 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 72 65  b, pWhere);.  re
3f50: 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65  turn pTriggerSte
3f60: 70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 63  p;.}../* .** Rec
3f70: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
3f80: 61 20 54 72 69 67 67 65 72 20 73 74 72 75 63 74  a Trigger struct
3f90: 75 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ure.*/.void sqli
3fa0: 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72  te3DeleteTrigger
3fb0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 72  (sqlite3 *db, Tr
3fc0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 29  igger *pTrigger)
3fd0: 7b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  {.  if( pTrigger
3fe0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3ff0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
4000: 67 67 65 72 53 74 65 70 28 64 62 2c 20 70 54 72  ggerStep(db, pTr
4010: 69 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69 73 74  igger->step_list
4020: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4030: 65 65 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d  ee(db, pTrigger-
4040: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
4050: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 72  e3DbFree(db, pTr
4060: 69 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20  igger->table);. 
4070: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4080: 74 65 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d  te(db, pTrigger-
4090: 3e 70 57 68 65 6e 29 3b 0a 20 20 73 71 6c 69 74  >pWhen);.  sqlit
40a0: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
40b0: 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 43 6f  b, pTrigger->pCo
40c0: 6c 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65  lumns);.  sqlite
40d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 72 69  3DbFree(db, pTri
40e0: 67 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  gger);.}../*.** 
40f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4100: 20 63 61 6c 6c 65 64 20 74 6f 20 64 72 6f 70 20   called to drop 
4110: 61 20 74 72 69 67 67 65 72 20 66 72 6f 6d 20 74  a trigger from t
4120: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
4130: 6d 61 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ma. .**.** This 
4140: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 64 69  may be called di
4150: 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
4160: 70 61 72 73 65 72 20 61 6e 64 20 74 68 65 72 65  parser and there
4170: 66 6f 72 65 20 69 64 65 6e 74 69 66 69 65 73 0a  fore identifies.
4180: 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 62  ** the trigger b
4190: 79 20 6e 61 6d 65 2e 20 20 54 68 65 20 73 71 6c  y name.  The sql
41a0: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
41b0: 74 72 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  tr() routine doe
41c0: 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 6a 6f  s the.** same jo
41d0: 62 20 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e  b as this routin
41e0: 65 20 65 78 63 65 70 74 20 69 74 20 74 61 6b 65  e except it take
41f0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
4200: 68 65 20 74 72 69 67 67 65 72 0a 2a 2a 20 69 6e  he trigger.** in
4210: 73 74 65 61 64 20 6f 66 20 74 68 65 20 74 72 69  stead of the tri
4220: 67 67 65 72 20 6e 61 6d 65 2e 0a 2a 2a 2f 0a 76  gger name..**/.v
4230: 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
4240: 72 69 67 67 65 72 28 50 61 72 73 65 20 2a 70 50  rigger(Parse *pP
4250: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
4260: 4e 61 6d 65 2c 20 69 6e 74 20 6e 6f 45 72 72 29  Name, int noErr)
4270: 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  {.  Trigger *pTr
4280: 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  igger = 0;.  int
4290: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
42a0: 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63   *zDb;.  const c
42b0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71  har *zName;.  sq
42c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
42d0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64  se->db;..  if( d
42e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
42f0: 29 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67  ) goto drop_trig
4300: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69  ger_cleanup;.  i
4310: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
4320: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
4330: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
4340: 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67 65 72  oto drop_trigger
4350: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
4360: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
4370: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 7a 44 62  nSrc==1 );.  zDb
4380: 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a   = pName->a[0].z
4390: 44 61 74 61 62 61 73 65 3b 0a 20 20 7a 4e 61 6d  Database;.  zNam
43a0: 65 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  e = pName->a[0].
43b0: 7a 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  zName;.  assert(
43c0: 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74   zDb!=0 || sqlit
43d0: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
43e0: 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20  utexes(db) );.  
43f0: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
4400: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
4410: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
4420: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
4430: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
4440: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
4450: 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73      if( zDb && s
4460: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62  qlite3StrICmp(db
4470: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  ->aDb[j].zName, 
4480: 7a 44 62 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  zDb) ) continue;
4490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
44a0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
44b0: 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b  eld(db, j, 0) );
44c0: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
44d0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
44e0: 26 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  &(db->aDb[j].pSc
44f0: 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 29 2c  hema->trigHash),
4500: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
4510: 20 70 54 72 69 67 67 65 72 20 29 20 62 72 65 61   pTrigger ) brea
4520: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 54  k;.  }.  if( !pT
4530: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 69 66  rigger ){.    if
4540: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
4550: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4560: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
4570: 63 68 20 74 72 69 67 67 65 72 3a 20 25 53 22 2c  ch trigger: %S",
4580: 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
4590: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
45a0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
45b0: 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  medSchema(pParse
45c0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20  , zDb);.    }.  
45d0: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
45e0: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67  chema = 1;.    g
45f0: 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67 65 72  oto drop_trigger
4600: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
4610: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
4620: 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
4630: 72 69 67 67 65 72 29 3b 0a 0a 64 72 6f 70 5f 74  rigger);..drop_t
4640: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a  rigger_cleanup:.
4650: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
4660: 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
4670: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
4680: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
4690: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
46a0: 75 72 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ure for the tabl
46b0: 65 20 74 68 61 74 20 61 20 74 72 69 67 67 65 72  e that a trigger
46c0: 0a 2a 2a 20 69 73 20 73 65 74 20 6f 6e 2e 0a 2a  .** is set on..*
46d0: 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
46e0: 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28 54  tableOfTrigger(T
46f0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
4700: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
4710: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 72  te3HashFind(&pTr
4720: 69 67 67 65 72 2d 3e 70 54 61 62 53 63 68 65 6d  igger->pTabSchem
4730: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 54 72 69  a->tblHash, pTri
4740: 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 7d 0a  gger->table);.}.
4750: 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 74  ../*.** Drop a t
4760: 72 69 67 67 65 72 20 67 69 76 65 6e 20 61 20 70  rigger given a p
4770: 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 74  ointer to that t
4780: 72 69 67 67 65 72 2e 20 0a 2a 2f 0a 76 6f 69 64  rigger. .*/.void
4790: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
47a0: 67 65 72 50 74 72 28 50 61 72 73 65 20 2a 70 50  gerPtr(Parse *pP
47b0: 61 72 73 65 2c 20 54 72 69 67 67 65 72 20 2a 70  arse, Trigger *p
47c0: 54 72 69 67 67 65 72 29 7b 0a 20 20 54 61 62 6c  Trigger){.  Tabl
47d0: 65 20 20 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56  e   *pTable;.  V
47e0: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
47f0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
4800: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
4810: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
4820: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
4830: 72 73 65 2d 3e 64 62 2c 20 70 54 72 69 67 67 65  rse->db, pTrigge
4840: 72 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  r->pSchema);.  a
4850: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
4860: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
4870: 20 20 70 54 61 62 6c 65 20 3d 20 74 61 62 6c 65    pTable = table
4880: 4f 66 54 72 69 67 67 65 72 28 70 54 72 69 67 67  OfTrigger(pTrigg
4890: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
48a0: 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  Table );.  asser
48b0: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  t( pTable->pSche
48c0: 6d 61 3d 3d 70 54 72 69 67 67 65 72 2d 3e 70 53  ma==pTrigger->pS
48d0: 63 68 65 6d 61 20 7c 7c 20 69 44 62 3d 3d 31 20  chema || iDb==1 
48e0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
48f0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
4900: 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
4910: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
4920: 52 4f 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20  ROP_TRIGGER;.   
4930: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
4940: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
4950: 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
4960: 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
4970: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
4980: 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20  .    if( iDb==1 
4990: 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
49a0: 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45  DROP_TEMP_TRIGGE
49b0: 52 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  R;.    if( sqlit
49c0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
49d0: 73 65 2c 20 63 6f 64 65 2c 20 70 54 72 69 67 67  se, code, pTrigg
49e0: 65 72 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 6c  er->zName, pTabl
49f0: 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 7c  e->zName, zDb) |
4a00: 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  |.      sqlite3A
4a10: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
4a20: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
4a30: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
4a40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
4a50: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
4a60: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
4a70: 6f 64 65 20 74 6f 20 64 65 73 74 72 6f 79 20 74  ode to destroy t
4a80: 68 65 20 64 61 74 61 62 61 73 65 20 72 65 63 6f  he database reco
4a90: 72 64 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  rd of the trigge
4aa0: 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  r..  */.  assert
4ab0: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20  ( pTable!=0 );. 
4ac0: 20 69 66 28 20 28 76 20 3d 20 73 71 6c 69 74 65   if( (v = sqlite
4ad0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
4ae0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
4af0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
4b00: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
4b10: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
4b20: 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41   WHERE name=%Q A
4b30: 4e 44 20 74 79 70 65 3d 27 74 72 69 67 67 65 72  ND type='trigger
4b40: 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  '",.       db->a
4b50: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
4b60: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
4b70: 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d  , pTrigger->zNam
4b80: 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
4b90: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
4ba0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
4bb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4bc0: 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54  dOp4(v, OP_DropT
4bd0: 72 69 67 67 65 72 2c 20 69 44 62 2c 20 30 2c 20  rigger, iDb, 0, 
4be0: 30 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61  0, pTrigger->zNa
4bf0: 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  me, 0);.  }.}../
4c00: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 20 74 72  *.** Remove a tr
4c10: 69 67 67 65 72 20 66 72 6f 6d 20 74 68 65 20 68  igger from the h
4c20: 61 73 68 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ash tables of th
4c30: 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65  e sqlite* pointe
4c40: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
4c50: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
4c60: 65 54 72 69 67 67 65 72 28 73 71 6c 69 74 65 33  eTrigger(sqlite3
4c70: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
4c80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4c90: 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54  ){.  Trigger *pT
4ca0: 72 69 67 67 65 72 3b 0a 20 20 48 61 73 68 20 2a  rigger;.  Hash *
4cb0: 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74  pHash;..  assert
4cc0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
4cd0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
4ce0: 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20  , 0) );.  pHash 
4cf0: 3d 20 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  = &(db->aDb[iDb]
4d00: 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  .pSchema->trigHa
4d10: 73 68 29 3b 0a 20 20 70 54 72 69 67 67 65 72 20  sh);.  pTrigger 
4d20: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
4d30: 65 72 74 28 70 48 61 73 68 2c 20 7a 4e 61 6d 65  ert(pHash, zName
4d40: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  , 0);.  if( ALWA
4d50: 59 53 28 70 54 72 69 67 67 65 72 29 20 29 7b 0a  YS(pTrigger) ){.
4d60: 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72      if( pTrigger
4d70: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 72 69 67  ->pSchema==pTrig
4d80: 67 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20  ger->pTabSchema 
4d90: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
4da0: 70 54 61 62 20 3d 20 74 61 62 6c 65 4f 66 54 72  pTab = tableOfTr
4db0: 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b  igger(pTrigger);
4dc0: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a  .      Trigger *
4dd0: 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  *pp;.      for(p
4de0: 70 3d 26 70 54 61 62 2d 3e 70 54 72 69 67 67 65  p=&pTab->pTrigge
4df0: 72 3b 20 2a 70 70 21 3d 70 54 72 69 67 67 65 72  r; *pp!=pTrigger
4e00: 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e  ; pp=&((*pp)->pN
4e10: 65 78 74 29 29 3b 0a 20 20 20 20 20 20 2a 70 70  ext));.      *pp
4e20: 20 3d 20 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b   = (*pp)->pNext;
4e30: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4e40: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 28  e3DeleteTrigger(
4e50: 64 62 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  db, pTrigger);. 
4e60: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
4e70: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
4e80: 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nges;.  }.}../*.
4e90: 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 74 68 65  ** pEList is the
4ea0: 20 53 45 54 20 63 6c 61 75 73 65 20 6f 66 20 61   SET clause of a
4eb0: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
4ec0: 6e 74 2e 20 20 45 61 63 68 20 65 6e 74 72 79 0a  nt.  Each entry.
4ed0: 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 69 73 20  ** in pEList is 
4ee0: 6f 66 20 74 68 65 20 66 6f 72 6d 61 74 20 3c 69  of the format <i
4ef0: 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49 66 20 61  d>=<expr>.  If a
4f00: 6e 79 20 6f 66 20 74 68 65 20 65 6e 74 72 69 65  ny of the entrie
4f10: 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 68  s.** in pEList h
4f20: 61 76 65 20 61 6e 20 3c 69 64 3e 20 77 68 69 63  ave an <id> whic
4f30: 68 20 6d 61 74 63 68 65 73 20 61 6e 20 69 64 65  h matches an ide
4f40: 6e 74 69 66 69 65 72 20 69 6e 20 70 49 64 4c 69  ntifier in pIdLi
4f50: 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  st,.** then retu
4f60: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 70 49 64  rn TRUE.  If pId
4f70: 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  List==NULL, then
4f80: 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65   it is considere
4f90: 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61 72 64 20  d a.** wildcard 
4fa0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79  that matches any
4fb0: 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77 69 73 65  thing.  Likewise
4fc0: 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55 4c 4c   if pEList==NULL
4fd0: 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d 61 74 63   then.** it matc
4fe0: 68 65 73 20 61 6e 79 74 68 69 6e 67 20 73 6f 20  hes anything so 
4ff0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 72  always return tr
5000: 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ue.  Return fals
5010: 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 65  e only.** if the
5020: 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2e 0a  re is no match..
5030: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
5040: 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70  eckColumnOverlap
5050: 28 49 64 4c 69 73 74 20 2a 70 49 64 4c 69 73 74  (IdList *pIdList
5060: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
5070: 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b 0a 20 20  st){.  int e;.  
5080: 69 66 28 20 70 49 64 4c 69 73 74 3d 3d 30 20 7c  if( pIdList==0 |
5090: 7c 20 4e 45 56 45 52 28 70 45 4c 69 73 74 3d 3d  | NEVER(pEList==
50a0: 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
50b0: 20 66 6f 72 28 65 3d 30 3b 20 65 3c 70 45 4c 69   for(e=0; e<pELi
50c0: 73 74 2d 3e 6e 45 78 70 72 3b 20 65 2b 2b 29 7b  st->nExpr; e++){
50d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
50e0: 49 64 4c 69 73 74 49 6e 64 65 78 28 70 49 64 4c  IdListIndex(pIdL
50f0: 69 73 74 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 65  ist, pEList->a[e
5100: 5d 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 20 72 65  ].zName)>=0 ) re
5110: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
5120: 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  turn 0; .}../*.*
5130: 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  * Return a list 
5140: 6f 66 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  of all triggers 
5150: 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 20 69 66  on table pTab if
5160: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 74   there exists at
5170: 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 74 72   least.** one tr
5180: 69 67 67 65 72 20 74 68 61 74 20 6d 75 73 74 20  igger that must 
5190: 62 65 20 66 69 72 65 64 20 77 68 65 6e 20 61 6e  be fired when an
51a0: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 79   operation of ty
51b0: 70 65 20 27 6f 70 27 20 69 73 20 0a 2a 2a 20 70  pe 'op' is .** p
51c0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
51d0: 74 61 62 6c 65 2c 20 61 6e 64 2c 20 69 66 20 74  table, and, if t
51e0: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  hat operation is
51f0: 20 61 6e 20 55 50 44 41 54 45 2c 20 69 66 20 61   an UPDATE, if a
5200: 74 0a 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20 6f  t.** least one o
5210: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
5220: 20 70 43 68 61 6e 67 65 73 20 69 73 20 62 65 69   pChanges is bei
5230: 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a  ng modified..*/.
5240: 54 72 69 67 67 65 72 20 2a 73 71 6c 69 74 65 33  Trigger *sqlite3
5250: 54 72 69 67 67 65 72 73 45 78 69 73 74 28 0a 20  TriggersExist(. 
5260: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5270: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
5280: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
5290: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
52a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
52b0: 62 6c 65 20 74 68 65 20 63 6f 6e 74 61 69 6e 73  ble the contains
52c0: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 2a 2f   the triggers */
52d0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
52e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e             /* on
52f0: 65 20 6f 66 20 54 4b 5f 44 45 4c 45 54 45 2c 20  e of TK_DELETE, 
5300: 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50  TK_INSERT, TK_UP
5310: 44 41 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69  DATE */.  ExprLi
5320: 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 20  st *pChanges,   
5330: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74 68 61    /* Columns tha
5340: 74 20 63 68 61 6e 67 65 20 69 6e 20 61 6e 20 55  t change in an U
5350: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
5360: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4d 61 73 6b 20  */.  int *pMask 
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5380: 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 54 52 49  OUT: Mask of TRI
5390: 47 47 45 52 5f 42 45 46 4f 52 45 7c 54 52 49 47  GGER_BEFORE|TRIG
53a0: 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 29 7b 0a  GER_AFTER */.){.
53b0: 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a    int mask = 0;.
53c0: 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 73 74    Trigger *pList
53d0: 20 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72 20   = 0;.  Trigger 
53e0: 2a 70 3b 0a 0a 20 20 69 66 28 20 28 70 50 61 72  *p;..  if( (pPar
53f0: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
5400: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
5410: 67 67 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  gger)!=0 ){.    
5420: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 54  pList = sqlite3T
5430: 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73  riggerList(pPars
5440: 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20  e, pTab);.  }.  
5450: 61 73 73 65 72 74 28 20 70 4c 69 73 74 3d 3d 30  assert( pList==0
5460: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54   || IsVirtual(pT
5470: 61 62 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ab)==0 );.  for(
5480: 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
5490: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
54a0: 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 63 68   p->op==op && ch
54b0: 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70  eckColumnOverlap
54c0: 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70 43  (p->pColumns, pC
54d0: 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20 20 20  hanges) ){.     
54e0: 20 6d 61 73 6b 20 7c 3d 20 70 2d 3e 74 72 5f 74   mask |= p->tr_t
54f0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  m;.    }.  }.  i
5500: 66 28 20 70 4d 61 73 6b 20 29 7b 0a 20 20 20 20  f( pMask ){.    
5510: 2a 70 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 20  *pMask = mask;. 
5520: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 6d 61 73   }.  return (mas
5530: 6b 20 3f 20 70 4c 69 73 74 20 3a 20 30 29 3b 0a  k ? pList : 0);.
5540: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
5550: 20 74 68 65 20 70 53 74 65 70 2d 3e 7a 54 61 72   the pStep->zTar
5560: 67 65 74 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  get string into 
5570: 61 20 53 72 63 4c 69 73 74 20 61 6e 64 20 72 65  a SrcList and re
5580: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
5590: 2a 20 74 6f 20 74 68 61 74 20 53 72 63 4c 69 73  * to that SrcLis
55a0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
55b0: 75 74 69 6e 65 20 61 64 64 73 20 61 20 73 70 65  utine adds a spe
55c0: 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20 6e  cific database n
55d0: 61 6d 65 2c 20 69 66 20 6e 65 65 64 65 64 2c 20  ame, if needed, 
55e0: 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 77 68  to the target wh
55f0: 65 6e 0a 2a 2a 20 66 6f 72 6d 69 6e 67 20 74 68  en.** forming th
5600: 65 20 53 72 63 4c 69 73 74 2e 20 20 54 68 69 73  e SrcList.  This
5610: 20 70 72 65 76 65 6e 74 73 20 61 20 74 72 69 67   prevents a trig
5620: 67 65 72 20 69 6e 20 6f 6e 65 20 64 61 74 61 62  ger in one datab
5630: 61 73 65 20 66 72 6f 6d 0a 2a 2a 20 72 65 66 65  ase from.** refe
5640: 72 72 69 6e 67 20 74 6f 20 61 20 74 61 72 67 65  rring to a targe
5650: 74 20 69 6e 20 61 6e 6f 74 68 65 72 20 64 61 74  t in another dat
5660: 61 62 61 73 65 2e 20 20 41 6e 20 65 78 63 65 70  abase.  An excep
5670: 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 74 68 65  tion is when the
5680: 0a 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20 69  .** trigger is i
5690: 6e 20 54 45 4d 50 20 69 6e 20 77 68 69 63 68 20  n TEMP in which 
56a0: 63 61 73 65 20 69 74 20 63 61 6e 20 72 65 66 65  case it can refe
56b0: 72 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 64  r to any other d
56c0: 61 74 61 62 61 73 65 20 69 74 0a 2a 2a 20 77 61  atabase it.** wa
56d0: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  nts..*/.static S
56e0: 72 63 4c 69 73 74 20 2a 74 61 72 67 65 74 53 72  rcList *targetSr
56f0: 63 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  cList(.  Parse *
5700: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
5710: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
5720: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
5730: 72 53 74 65 70 20 2a 70 53 74 65 70 20 20 20 2f  rStep *pStep   /
5740: 2a 20 54 68 65 20 74 72 69 67 67 65 72 20 63 6f  * The trigger co
5750: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 72  ntaining the tar
5760: 67 65 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  get token */.){.
5770: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5780: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
5790: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
57a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
57b0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 75  he database to u
57c0: 73 65 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  se */.  SrcList 
57d0: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 2f 2a 20  *pSrc;       /* 
57e0: 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 72 65  SrcList to be re
57f0: 74 75 72 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  turned */..  pSr
5800: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
5810: 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
5820: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 72  0, 0);.  if( pSr
5830: 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
5840: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 30 20 29 3b   pSrc->nSrc>0 );
5850: 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 70 53 72  .    pSrc->a[pSr
5860: 63 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 4e 61 6d 65  c->nSrc-1].zName
5870: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
5880: 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 7a 54  up(db, pStep->zT
5890: 61 72 67 65 74 29 3b 0a 20 20 20 20 69 44 62 20  arget);.    iDb 
58a0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
58b0: 6f 49 6e 64 65 78 28 64 62 2c 20 70 53 74 65 70  oIndex(db, pStep
58c0: 2d 3e 70 54 72 69 67 2d 3e 70 53 63 68 65 6d 61  ->pTrig->pSchema
58d0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  );.    if( iDb==
58e0: 30 20 7c 7c 20 69 44 62 3e 3d 32 20 29 7b 0a 20  0 || iDb>=2 ){. 
58f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
5900: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
5910: 20 20 70 53 72 63 2d 3e 61 5b 70 53 72 63 2d 3e    pSrc->a[pSrc->
5920: 6e 53 72 63 2d 31 5d 2e 7a 44 61 74 61 62 61 73  nSrc-1].zDatabas
5930: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
5940: 44 75 70 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  Dup(db, db->aDb[
5950: 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  iDb].zName);.   
5960: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5970: 70 53 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pSrc;.}../*.** G
5980: 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
5990: 65 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  e for the statem
59a0: 65 6e 74 73 20 69 6e 73 69 64 65 20 74 68 65 20  ents inside the 
59b0: 62 6f 64 79 20 6f 66 20 61 20 73 69 6e 67 6c 65  body of a single
59c0: 20 0a 2a 2a 20 74 72 69 67 67 65 72 2e 0a 2a 2f   .** trigger..*/
59d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
59e0: 54 72 69 67 67 65 72 50 72 6f 67 72 61 6d 28 0a  TriggerProgram(.
59f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5a10: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
5a20: 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74  t */.  TriggerSt
5a30: 65 70 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 20  ep *pStepList,  
5a40: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 73 74 61 74   /* List of stat
5a50: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 20 74 68  ements inside th
5a60: 65 20 74 72 69 67 67 65 72 20 62 6f 64 79 20 2a  e trigger body *
5a70: 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20  /.  int orconf  
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a90: 20 43 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69   Conflict algori
5aa0: 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20  thm. (OE_Abort, 
5ab0: 65 74 63 29 20 2a 2f 20 20 0a 29 7b 0a 20 20 54  etc) */  .){.  T
5ac0: 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65  riggerStep *pSte
5ad0: 70 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  p;.  Vdbe *v = p
5ae0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5af0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5b00: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
5b10: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 54 72  ert( pParse->pTr
5b20: 69 67 67 65 72 54 61 62 20 26 26 20 70 50 61 72  iggerTab && pPar
5b30: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 20 29 3b  se->pToplevel );
5b40: 0a 20 20 61 73 73 65 72 74 28 20 70 53 74 65 70  .  assert( pStep
5b50: 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74  List );.  assert
5b60: 28 20 76 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ( v!=0 );.  for(
5b70: 70 53 74 65 70 3d 70 53 74 65 70 4c 69 73 74 3b  pStep=pStepList;
5b80: 20 70 53 74 65 70 3b 20 70 53 74 65 70 3d 70 53   pStep; pStep=pS
5b90: 74 65 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  tep->pNext){.   
5ba0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
5bb0: 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70  he ON CONFLICT p
5bc0: 6f 6c 69 63 79 20 74 68 61 74 20 77 69 6c 6c 20  olicy that will 
5bd0: 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  be used for this
5be0: 20 73 74 65 70 0a 20 20 20 20 2a 2a 20 6f 66 20   step.    ** of 
5bf0: 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
5c00: 72 61 6d 2e 20 49 66 20 74 68 65 20 73 74 61 74  ram. If the stat
5c10: 65 6d 65 6e 74 20 74 68 61 74 20 63 61 75 73 65  ement that cause
5c20: 64 20 74 68 69 73 20 74 72 69 67 67 65 72 0a 20  d this trigger. 
5c30: 20 20 20 2a 2a 20 74 6f 20 66 69 72 65 20 68 61     ** to fire ha
5c40: 64 20 61 6e 20 65 78 70 6c 69 63 69 74 20 4f 4e  d an explicit ON
5c50: 20 43 4f 4e 46 4c 49 43 54 2c 20 74 68 65 6e 20   CONFLICT, then 
5c60: 75 73 65 20 69 74 2e 20 4f 74 68 65 72 77 69 73  use it. Otherwis
5c70: 65 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  e, use.    ** th
5c80: 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f  e ON CONFLICT po
5c90: 6c 69 63 79 20 74 68 61 74 20 77 61 73 20 73 70  licy that was sp
5ca0: 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
5cb0: 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 0a 20  of the trigger. 
5cc0: 20 20 20 2a 2a 20 73 74 65 70 20 73 74 61 74 65     ** step state
5cd0: 6d 65 6e 74 2e 20 45 78 61 6d 70 6c 65 3a 0a 20  ment. Example:. 
5ce0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43     **.    **   C
5cf0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 41 46  REATE TRIGGER AF
5d00: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
5d10: 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20   BEGIN;.    **  
5d20: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50     INSERT OR REP
5d30: 4c 41 43 45 20 49 4e 54 4f 20 74 32 20 56 41 4c  LACE INTO t2 VAL
5d40: 55 45 53 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62  UES(new.a, new.b
5d50: 29 3b 0a 20 20 20 20 2a 2a 20 20 20 45 4e 44 3b  );.    **   END;
5d60: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
5d70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5d80: 2e 2e 2e 20 3b 20 20 20 20 20 20 20 20 20 20 20  ... ;           
5d90: 20 2d 2d 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   -- insert into 
5da0: 74 32 20 75 73 65 73 20 52 45 50 4c 41 43 45 20  t2 uses REPLACE 
5db0: 70 6f 6c 69 63 79 0a 20 20 20 20 2a 2a 20 20 20  policy.    **   
5dc0: 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
5dd0: 20 49 4e 54 4f 20 74 31 20 2e 2e 2e 20 3b 20 20   INTO t1 ... ;  
5de0: 2d 2d 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74  -- insert into t
5df0: 32 20 75 73 65 73 20 49 47 4e 4f 52 45 20 70 6f  2 uses IGNORE po
5e00: 6c 69 63 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  licy.    */.    
5e10: 70 50 61 72 73 65 2d 3e 65 4f 72 63 6f 6e 66 20  pParse->eOrconf 
5e20: 3d 20 28 6f 72 63 6f 6e 66 3d 3d 4f 45 5f 44 65  = (orconf==OE_De
5e30: 66 61 75 6c 74 29 3f 70 53 74 65 70 2d 3e 6f 72  fault)?pStep->or
5e40: 63 6f 6e 66 3a 28 75 38 29 6f 72 63 6f 6e 66 3b  conf:(u8)orconf;
5e50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
5e60: 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
5e70: 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 73 77  or==0 );..    sw
5e80: 69 74 63 68 28 20 70 53 74 65 70 2d 3e 6f 70 20  itch( pStep->op 
5e90: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  ){.      case TK
5ea0: 5f 55 50 44 41 54 45 3a 20 7b 0a 20 20 20 20 20  _UPDATE: {.     
5eb0: 20 20 20 73 71 6c 69 74 65 33 55 70 64 61 74 65     sqlite3Update
5ec0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
5ed0: 20 20 20 20 74 61 72 67 65 74 53 72 63 4c 69 73      targetSrcLis
5ee0: 74 28 70 50 61 72 73 65 2c 20 70 53 74 65 70 29  t(pParse, pStep)
5ef0: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
5f00: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
5f10: 62 2c 20 70 53 74 65 70 2d 3e 70 45 78 70 72 4c  b, pStep->pExprL
5f20: 69 73 74 2c 20 30 29 2c 20 0a 20 20 20 20 20 20  ist, 0), .      
5f30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5f40: 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 57  up(db, pStep->pW
5f50: 68 65 72 65 2c 20 30 29 2c 20 0a 20 20 20 20 20  here, 0), .     
5f60: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 65 4f 72       pParse->eOr
5f70: 63 6f 6e 66 0a 20 20 20 20 20 20 20 20 29 3b 0a  conf.        );.
5f80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5f90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
5fa0: 65 20 54 4b 5f 49 4e 53 45 52 54 3a 20 7b 0a 20  e TK_INSERT: {. 
5fb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e         sqlite3In
5fc0: 73 65 72 74 28 70 50 61 72 73 65 2c 20 0a 20 20  sert(pParse, .  
5fd0: 20 20 20 20 20 20 20 20 74 61 72 67 65 74 53 72          targetSr
5fe0: 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  cList(pParse, pS
5ff0: 74 65 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20  tep),.          
6000: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
6010: 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 53 65 6c  (db, pStep->pSel
6020: 65 63 74 2c 20 30 29 2c 20 0a 20 20 20 20 20 20  ect, 0), .      
6030: 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
6040: 74 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e  tDup(db, pStep->
6050: 70 49 64 4c 69 73 74 29 2c 20 0a 20 20 20 20 20  pIdList), .     
6060: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 65 4f 72       pParse->eOr
6070: 63 6f 6e 66 0a 20 20 20 20 20 20 20 20 29 3b 0a  conf.        );.
6080: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
60a0: 65 20 54 4b 5f 44 45 4c 45 54 45 3a 20 7b 0a 20  e TK_DELETE: {. 
60b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
60c0: 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c  leteFrom(pParse,
60d0: 20 0a 20 20 20 20 20 20 20 20 20 20 74 61 72 67   .          targ
60e0: 65 74 53 72 63 4c 69 73 74 28 70 50 61 72 73 65  etSrcList(pParse
60f0: 2c 20 70 53 74 65 70 29 2c 0a 20 20 20 20 20 20  , pStep),.      
6100: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6110: 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 57  up(db, pStep->pW
6120: 68 65 72 65 2c 20 30 29 0a 20 20 20 20 20 20 20  here, 0).       
6130: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
6140: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
6150: 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
6160: 28 20 70 53 74 65 70 2d 3e 6f 70 3d 3d 54 4b 5f  ( pStep->op==TK_
6170: 53 45 4c 45 43 54 20 29 3b 20 7b 0a 20 20 20 20  SELECT ); {.    
6180: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 73      SelectDest s
6190: 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20 53 65  Dest;.        Se
61a0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20  lect *pSelect = 
61b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
61c0: 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 53 65 6c  (db, pStep->pSel
61d0: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
61e0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
61f0: 73 74 49 6e 69 74 28 26 73 44 65 73 74 2c 20 53  stInit(&sDest, S
6200: 52 54 5f 44 69 73 63 61 72 64 2c 20 30 29 3b 0a  RT_Discard, 0);.
6210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
6220: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
6230: 65 6c 65 63 74 2c 20 26 73 44 65 73 74 29 3b 0a  elect, &sDest);.
6240: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
6250: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
6260: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
6270: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6280: 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
6290: 70 53 74 65 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45  pStep->op!=TK_SE
62a0: 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71  LECT ){.      sq
62b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
62c0: 76 2c 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74  v, OP_ResetCount
62d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
62e0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
62f0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6300: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
6310: 54 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  TS./*.** This fu
6320: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
6330: 6f 20 61 64 64 20 56 64 62 65 43 6f 6d 6d 65 6e  o add VdbeCommen
6340: 74 28 29 20 61 6e 6e 6f 74 61 74 69 6f 6e 73 20  t() annotations 
6350: 74 6f 20 61 20 56 44 42 45 0a 2a 2a 20 70 72 6f  to a VDBE.** pro
6360: 67 72 61 6d 2e 20 49 74 20 69 73 20 6e 6f 74 20  gram. It is not 
6370: 75 73 65 64 20 69 6e 20 70 72 6f 64 75 63 74 69  used in producti
6380: 6f 6e 20 63 6f 64 65 2c 20 6f 6e 6c 79 20 66 6f  on code, only fo
6390: 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a  r debugging..*/.
63a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
63b0: 72 20 2a 6f 6e 45 72 72 6f 72 54 65 78 74 28 69  r *onErrorText(i
63c0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 73  nt onError){.  s
63d0: 77 69 74 63 68 28 20 6f 6e 45 72 72 6f 72 20 29  witch( onError )
63e0: 7b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62  {.    case OE_Ab
63f0: 6f 72 74 3a 20 20 20 20 72 65 74 75 72 6e 20 22  ort:    return "
6400: 61 62 6f 72 74 22 3b 0a 20 20 20 20 63 61 73 65  abort";.    case
6410: 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 72 65   OE_Rollback: re
6420: 74 75 72 6e 20 22 72 6f 6c 6c 62 61 63 6b 22 3b  turn "rollback";
6430: 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69  .    case OE_Fai
6440: 6c 3a 20 20 20 20 20 72 65 74 75 72 6e 20 22 66  l:     return "f
6450: 61 69 6c 22 3b 0a 20 20 20 20 63 61 73 65 20 4f  ail";.    case O
6460: 45 5f 52 65 70 6c 61 63 65 3a 20 20 72 65 74 75  E_Replace:  retu
6470: 72 6e 20 22 72 65 70 6c 61 63 65 22 3b 0a 20 20  rn "replace";.  
6480: 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65    case OE_Ignore
6490: 3a 20 20 20 72 65 74 75 72 6e 20 22 69 67 6e 6f  :   return "igno
64a0: 72 65 22 3b 0a 20 20 20 20 63 61 73 65 20 4f 45  re";.    case OE
64b0: 5f 44 65 66 61 75 6c 74 3a 20 20 72 65 74 75 72  _Default:  retur
64c0: 6e 20 22 64 65 66 61 75 6c 74 22 3b 0a 20 20 7d  n "default";.  }
64d0: 0a 20 20 72 65 74 75 72 6e 20 22 6e 2f 61 22 3b  .  return "n/a";
64e0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
64f0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 73   Parse context s
6500: 74 72 75 63 74 75 72 65 20 70 46 72 6f 6d 20 68  tructure pFrom h
6510: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 75 73 65  as just been use
6520: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 75  d to create a su
6530: 62 2d 76 64 62 65 0a 2a 2a 20 28 74 72 69 67 67  b-vdbe.** (trigg
6540: 65 72 20 70 72 6f 67 72 61 6d 29 2e 20 49 66 20  er program). If 
6550: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
6560: 75 72 72 65 64 2c 20 74 72 61 6e 73 66 65 72 20  urred, transfer 
6570: 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
6580: 6e 0a 2a 2a 20 66 72 6f 6d 20 70 46 72 6f 6d 20  n.** from pFrom 
6590: 74 6f 20 70 54 6f 2e 0a 2a 2f 0a 73 74 61 74 69  to pTo..*/.stati
65a0: 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 50  c void transferP
65b0: 61 72 73 65 45 72 72 6f 72 28 50 61 72 73 65 20  arseError(Parse 
65c0: 2a 70 54 6f 2c 20 50 61 72 73 65 20 2a 70 46 72  *pTo, Parse *pFr
65d0: 6f 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  om){.  assert( p
65e0: 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30  From->zErrMsg==0
65f0: 20 7c 7c 20 70 46 72 6f 6d 2d 3e 6e 45 72 72 20   || pFrom->nErr 
6600: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  );.  assert( pTo
6610: 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30 20 7c 7c 20  ->zErrMsg==0 || 
6620: 70 54 6f 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 69  pTo->nErr );.  i
6630: 66 28 20 70 54 6f 2d 3e 6e 45 72 72 3d 3d 30 20  f( pTo->nErr==0 
6640: 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 45 72 72  ){.    pTo->zErr
6650: 4d 73 67 20 3d 20 70 46 72 6f 6d 2d 3e 7a 45 72  Msg = pFrom->zEr
6660: 72 4d 73 67 3b 0a 20 20 20 20 70 54 6f 2d 3e 6e  rMsg;.    pTo->n
6670: 45 72 72 20 3d 20 70 46 72 6f 6d 2d 3e 6e 45 72  Err = pFrom->nEr
6680: 72 3b 0a 20 20 20 20 70 54 6f 2d 3e 72 63 20 3d  r;.    pTo->rc =
6690: 20 70 46 72 6f 6d 2d 3e 72 63 3b 0a 20 20 7d 65   pFrom->rc;.  }e
66a0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
66b0: 44 62 46 72 65 65 28 70 46 72 6f 6d 2d 3e 64 62  DbFree(pFrom->db
66c0: 2c 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67  , pFrom->zErrMsg
66d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
66e0: 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  Create and popul
66f0: 61 74 65 20 61 20 6e 65 77 20 54 72 69 67 67 65  ate a new Trigge
6700: 72 50 72 67 20 6f 62 6a 65 63 74 20 77 69 74 68  rPrg object with
6710: 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 0a   a sub-program .
6720: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  ** implementing 
6730: 74 72 69 67 67 65 72 20 70 54 72 69 67 67 65 72  trigger pTrigger
6740: 20 77 69 74 68 20 4f 4e 20 43 4f 4e 46 4c 49 43   with ON CONFLIC
6750: 54 20 70 6f 6c 69 63 79 20 6f 72 63 6f 6e 66 2e  T policy orconf.
6760: 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67 67  .*/.static Trigg
6770: 65 72 50 72 67 20 2a 63 6f 64 65 52 6f 77 54 72  erPrg *codeRowTr
6780: 69 67 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a  igger(.  Parse *
6790: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
67a0: 20 43 75 72 72 65 6e 74 20 70 61 72 73 65 20 63   Current parse c
67b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67  ontext */.  Trig
67c0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20  ger *pTrigger,  
67d0: 20 2f 2a 20 54 72 69 67 67 65 72 20 74 6f 20 63   /* Trigger to c
67e0: 6f 64 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ode */.  Table *
67f0: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  pTab,         /*
6800: 20 54 68 65 20 74 61 62 6c 65 20 70 54 72 69 67   The table pTrig
6810: 67 65 72 20 69 73 20 61 74 74 61 63 68 65 64 20  ger is attached 
6820: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f  to */.  int orco
6830: 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nf           /* 
6840: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69  ON CONFLICT poli
6850: 63 79 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67  cy to code trigg
6860: 65 72 20 70 72 6f 67 72 61 6d 20 77 69 74 68 20  er program with 
6870: 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  */.){.  Parse *p
6880: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 50 61 72  Top = sqlite3Par
6890: 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
68a0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
68b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
68c0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
68d0: 6e 64 6c 65 20 2a 2f 0a 20 20 54 72 69 67 67 65  ndle */.  Trigge
68e0: 72 50 72 67 20 2a 70 50 72 67 3b 20 20 20 20 20  rPrg *pPrg;     
68f0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
6900: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 45 78  o return */.  Ex
6910: 70 72 20 2a 70 57 68 65 6e 20 3d 20 30 3b 20 20  pr *pWhen = 0;  
6920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 70            /* Dup
6930: 6c 69 63 61 74 65 20 6f 66 20 74 72 69 67 67 65  licate of trigge
6940: 72 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f  r WHEN expressio
6950: 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  n */.  Vdbe *v; 
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6970: 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
6980: 56 4d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  VM */.  NameCont
6990: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
69a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
69b0: 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64 62 65  ext for sub-vdbe
69c0: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
69d0: 20 2a 70 50 72 6f 67 72 61 6d 20 3d 20 30 3b 20   *pProgram = 0; 
69e0: 20 20 2f 2a 20 53 75 62 2d 76 64 62 65 20 66 6f    /* Sub-vdbe fo
69f0: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
6a00: 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 53  m */.  Parse *pS
6a10: 75 62 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  ubParse;        
6a20: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
6a30: 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64 62 65  ext for sub-vdbe
6a40: 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 54 72   */.  int iEndTr
6a50: 69 67 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  igger = 0;      
6a60: 20 20 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 6a 75    /* Label to ju
6a70: 6d 70 20 74 6f 20 69 66 20 57 48 45 4e 20 69 73  mp to if WHEN is
6a80: 20 66 61 6c 73 65 20 2a 2f 0a 0a 20 20 61 73 73   false */..  ass
6a90: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 7a  ert( pTrigger->z
6aa0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 54 61 62 3d  Name==0 || pTab=
6ab0: 3d 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28  =tableOfTrigger(
6ac0: 70 54 72 69 67 67 65 72 29 20 29 3b 0a 20 20 61  pTrigger) );.  a
6ad0: 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 70 56 64  ssert( pTop->pVd
6ae0: 62 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  be );..  /* Allo
6af0: 63 61 74 65 20 74 68 65 20 54 72 69 67 67 65 72  cate the Trigger
6b00: 50 72 67 20 61 6e 64 20 53 75 62 50 72 6f 67 72  Prg and SubProgr
6b10: 61 6d 20 6f 62 6a 65 63 74 73 2e 20 54 6f 20 65  am objects. To e
6b20: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 79 0a  nsure that they.
6b30: 20 20 2a 2a 20 61 72 65 20 66 72 65 65 64 20 69    ** are freed i
6b40: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6b50: 73 2c 20 6c 69 6e 6b 20 74 68 65 6d 20 69 6e 74  s, link them int
6b60: 6f 20 74 68 65 20 50 61 72 73 65 2e 70 54 72 69  o the Parse.pTri
6b70: 67 67 65 72 50 72 67 20 0a 20 20 2a 2a 20 6c 69  ggerPrg .  ** li
6b80: 73 74 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  st of the top-le
6b90: 76 65 6c 20 50 61 72 73 65 20 6f 62 6a 65 63 74  vel Parse object
6ba0: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
6bb0: 68 61 6e 20 6c 61 74 65 72 2e 20 20 2a 2f 0a 20  han later.  */. 
6bc0: 20 70 50 72 67 20 3d 20 73 71 6c 69 74 65 33 44   pPrg = sqlite3D
6bd0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
6be0: 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 50 72  sizeof(TriggerPr
6bf0: 67 29 29 3b 0a 20 20 69 66 28 20 21 70 50 72 67  g));.  if( !pPrg
6c00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
6c10: 50 72 67 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6f  Prg->pNext = pTo
6c20: 70 2d 3e 70 54 72 69 67 67 65 72 50 72 67 3b 0a  p->pTriggerPrg;.
6c30: 20 20 70 54 6f 70 2d 3e 70 54 72 69 67 67 65 72    pTop->pTrigger
6c40: 50 72 67 20 3d 20 70 50 72 67 3b 0a 20 20 70 50  Prg = pPrg;.  pP
6c50: 72 67 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70  rg->pProgram = p
6c60: 50 72 6f 67 72 61 6d 20 3d 20 73 71 6c 69 74 65  Program = sqlite
6c70: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
6c80: 2c 20 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  , sizeof(SubProg
6c90: 72 61 6d 29 29 3b 0a 20 20 69 66 28 20 21 70 50  ram));.  if( !pP
6ca0: 72 6f 67 72 61 6d 20 29 20 72 65 74 75 72 6e 20  rogram ) return 
6cb0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
6cc0: 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 70  LinkSubProgram(p
6cd0: 54 6f 70 2d 3e 70 56 64 62 65 2c 20 70 50 72 6f  Top->pVdbe, pPro
6ce0: 67 72 61 6d 29 3b 0a 20 20 70 50 72 67 2d 3e 70  gram);.  pPrg->p
6cf0: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
6d00: 65 72 3b 0a 20 20 70 50 72 67 2d 3e 6f 72 63 6f  er;.  pPrg->orco
6d10: 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 70  nf = orconf;.  p
6d20: 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b 30 5d  Prg->aColmask[0]
6d30: 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
6d40: 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b   pPrg->aColmask[
6d50: 31 5d 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  1] = 0xffffffff;
6d60: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
6d70: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 20 6e  and populate a n
6d80: 65 77 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  ew Parse context
6d90: 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f 64 69   to use for codi
6da0: 6e 67 20 74 68 65 20 0a 20 20 2a 2a 20 74 72 69  ng the .  ** tri
6db0: 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d  gger sub-program
6dc0: 2e 20 20 2a 2f 0a 20 20 70 53 75 62 50 61 72 73  .  */.  pSubPars
6dd0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  e = sqlite3Stack
6de0: 41 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  AllocZero(db, si
6df0: 7a 65 6f 66 28 50 61 72 73 65 29 29 3b 0a 20 20  zeof(Parse));.  
6e00: 69 66 28 20 21 70 53 75 62 50 61 72 73 65 20 29  if( !pSubParse )
6e10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d   return 0;.  mem
6e20: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
6e30: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
6e40: 2e 70 50 61 72 73 65 20 3d 20 70 53 75 62 50 61  .pParse = pSubPa
6e50: 72 73 65 3b 0a 20 20 70 53 75 62 50 61 72 73 65  rse;.  pSubParse
6e60: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 53 75  ->db = db;.  pSu
6e70: 62 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  bParse->pTrigger
6e80: 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 70 53  Tab = pTab;.  pS
6e90: 75 62 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76  ubParse->pToplev
6ea0: 65 6c 20 3d 20 70 54 6f 70 3b 0a 20 20 70 53 75  el = pTop;.  pSu
6eb0: 62 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  bParse->zAuthCon
6ec0: 74 65 78 74 20 3d 20 70 54 72 69 67 67 65 72 2d  text = pTrigger-
6ed0: 3e 7a 4e 61 6d 65 3b 0a 20 20 70 53 75 62 50 61  >zName;.  pSubPa
6ee0: 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f 70 20  rse->eTriggerOp 
6ef0: 3d 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 3b 0a  = pTrigger->op;.
6f00: 20 20 70 53 75 62 50 61 72 73 65 2d 3e 6e 51 75    pSubParse->nQu
6f10: 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
6f20: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 0a 20  ->nQueryLoop;.. 
6f30: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
6f40: 64 62 65 28 70 53 75 62 50 61 72 73 65 29 3b 0a  dbe(pSubParse);.
6f50: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 56    if( v ){.    V
6f60: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
6f70: 53 74 61 72 74 3a 20 25 73 2e 25 73 20 28 25 73  Start: %s.%s (%s
6f80: 20 25 73 25 73 25 73 20 4f 4e 20 25 73 29 22 2c   %s%s%s ON %s)",
6f90: 20 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72   .      pTrigger
6fa0: 2d 3e 7a 4e 61 6d 65 2c 20 6f 6e 45 72 72 6f 72  ->zName, onError
6fb0: 54 65 78 74 28 6f 72 63 6f 6e 66 29 2c 0a 20 20  Text(orconf),.  
6fc0: 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e 74      (pTrigger->t
6fd0: 72 5f 74 6d 3d 3d 54 52 49 47 47 45 52 5f 42 45  r_tm==TRIGGER_BE
6fe0: 46 4f 52 45 20 3f 20 22 42 45 46 4f 52 45 22 20  FORE ? "BEFORE" 
6ff0: 3a 20 22 41 46 54 45 52 22 29 2c 0a 20 20 20 20  : "AFTER"),.    
7000: 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e 6f      (pTrigger->o
7010: 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 3f 20 22  p==TK_UPDATE ? "
7020: 55 50 44 41 54 45 22 20 3a 20 22 22 29 2c 0a 20  UPDATE" : ""),. 
7030: 20 20 20 20 20 20 20 28 70 54 72 69 67 67 65 72         (pTrigger
7040: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20  ->op==TK_INSERT 
7050: 3f 20 22 49 4e 53 45 52 54 22 20 3a 20 22 22 29  ? "INSERT" : "")
7060: 2c 0a 20 20 20 20 20 20 20 20 28 70 54 72 69 67  ,.        (pTrig
7070: 67 65 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 45 4c 45  ger->op==TK_DELE
7080: 54 45 20 3f 20 22 44 45 4c 45 54 45 22 20 3a 20  TE ? "DELETE" : 
7090: 22 22 29 2c 0a 20 20 20 20 20 20 70 54 61 62 2d  ""),.      pTab-
70a0: 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 23  >zName.    ));.#
70b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
70c0: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 73 71 6c  IT_TRACE.    sql
70d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
70e0: 28 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 73  (v, -1, .      s
70f0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
7100: 2c 20 22 2d 2d 20 54 52 49 47 47 45 52 20 25 73  , "-- TRIGGER %s
7110: 22 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61  ", pTrigger->zNa
7120: 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  me), P4_DYNAMIC.
7130: 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20      );.#endif.. 
7140: 20 20 20 2f 2a 20 49 66 20 6f 6e 65 20 77 61 73     /* If one was
7150: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 64 65   specified, code
7160: 20 74 68 65 20 57 48 45 4e 20 63 6c 61 75 73 65   the WHEN clause
7170: 2e 20 49 66 20 69 74 20 65 76 61 6c 75 61 74 65  . If it evaluate
7180: 73 20 74 6f 20 66 61 6c 73 65 0a 20 20 20 20 2a  s to false.    *
7190: 2a 20 28 6f 72 20 4e 55 4c 4c 29 20 74 68 65 20  * (or NULL) the 
71a0: 73 75 62 2d 76 64 62 65 20 69 73 20 69 6d 6d 65  sub-vdbe is imme
71b0: 64 69 61 74 65 6c 79 20 68 61 6c 74 65 64 20 62  diately halted b
71c0: 79 20 6a 75 6d 70 69 6e 67 20 74 6f 20 74 68 65  y jumping to the
71d0: 20 0a 20 20 20 20 2a 2a 20 4f 50 5f 48 61 6c 74   .    ** OP_Halt
71e0: 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 68 65   inserted at the
71f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
7200: 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ram.  */.    if(
7210: 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e   pTrigger->pWhen
7220: 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 6e 20   ){.      pWhen 
7230: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7240: 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70  (db, pTrigger->p
7250: 57 68 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  When, 0);.      
7260: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73  if( SQLITE_OK==s
7270: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
7280: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 57 68  rNames(&sNC, pWh
7290: 65 6e 29 20 0a 20 20 20 20 20 20 20 26 26 20 64  en) .       && d
72a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
72b0: 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =0 .      ){.   
72c0: 20 20 20 20 20 69 45 6e 64 54 72 69 67 67 65 72       iEndTrigger
72d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
72e0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
72f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
7300: 66 46 61 6c 73 65 28 70 53 75 62 50 61 72 73 65  fFalse(pSubParse
7310: 2c 20 70 57 68 65 6e 2c 20 69 45 6e 64 54 72 69  , pWhen, iEndTri
7320: 67 67 65 72 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  gger, SQLITE_JUM
7330: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
7340: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
7350: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57  xprDelete(db, pW
7360: 68 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  hen);.    }..   
7370: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 74 72 69   /* Code the tri
7380: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 69 6e 74  gger program int
7390: 6f 20 74 68 65 20 73 75 62 2d 76 64 62 65 2e 20  o the sub-vdbe. 
73a0: 2a 2f 0a 20 20 20 20 63 6f 64 65 54 72 69 67 67  */.    codeTrigg
73b0: 65 72 50 72 6f 67 72 61 6d 28 70 53 75 62 50 61  erProgram(pSubPa
73c0: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 73  rse, pTrigger->s
73d0: 74 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e 66  tep_list, orconf
73e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
73f0: 74 20 61 6e 20 4f 50 5f 48 61 6c 74 20 61 74 20  t an OP_Halt at 
7400: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
7410: 75 62 2d 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20  ub-program. */. 
7420: 20 20 20 69 66 28 20 69 45 6e 64 54 72 69 67 67     if( iEndTrigg
7430: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
7440: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
7450: 62 65 6c 28 76 2c 20 69 45 6e 64 54 72 69 67 67  bel(v, iEndTrigg
7460: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
7470: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7480: 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 20 20  (v, OP_Halt);.  
7490: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
74a0: 2c 20 22 45 6e 64 3a 20 25 73 2e 25 73 22 2c 20  , "End: %s.%s", 
74b0: 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 2c  pTrigger->zName,
74c0: 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72 63   onErrorText(orc
74d0: 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 74 72 61  onf)));..    tra
74e0: 6e 73 66 65 72 50 61 72 73 65 45 72 72 6f 72 28  nsferParseError(
74f0: 70 50 61 72 73 65 2c 20 70 53 75 62 50 61 72 73  pParse, pSubPars
7500: 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  e);.    if( db->
7510: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
7520: 29 7b 0a 20 20 20 20 20 20 70 50 72 6f 67 72 61  ){.      pProgra
7530: 6d 2d 3e 61 4f 70 20 3d 20 73 71 6c 69 74 65 33  m->aOp = sqlite3
7540: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
7550: 76 2c 20 26 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f  v, &pProgram->nO
7560: 70 2c 20 26 70 54 6f 70 2d 3e 6e 4d 61 78 41 72  p, &pTop->nMaxAr
7570: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  g);.    }.    pP
7580: 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 3d 20 70  rogram->nMem = p
7590: 53 75 62 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  SubParse->nMem;.
75a0: 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43      pProgram->nC
75b0: 73 72 20 3d 20 70 53 75 62 50 61 72 73 65 2d 3e  sr = pSubParse->
75c0: 6e 54 61 62 3b 0a 20 20 20 20 70 50 72 6f 67 72  nTab;.    pProgr
75d0: 61 6d 2d 3e 6e 4f 6e 63 65 20 3d 20 70 53 75 62  am->nOnce = pSub
75e0: 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20  Parse->nOnce;.  
75f0: 20 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65    pProgram->toke
7600: 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 54 72 69  n = (void *)pTri
7610: 67 67 65 72 3b 0a 20 20 20 20 70 50 72 67 2d 3e  gger;.    pPrg->
7620: 61 43 6f 6c 6d 61 73 6b 5b 30 5d 20 3d 20 70 53  aColmask[0] = pS
7630: 75 62 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 73 6b  ubParse->oldmask
7640: 3b 0a 20 20 20 20 70 50 72 67 2d 3e 61 43 6f 6c  ;.    pPrg->aCol
7650: 6d 61 73 6b 5b 31 5d 20 3d 20 70 53 75 62 50 61  mask[1] = pSubPa
7660: 72 73 65 2d 3e 6e 65 77 6d 61 73 6b 3b 0a 20 20  rse->newmask;.  
7670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
7680: 65 74 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 61  ete(v);.  }..  a
7690: 73 73 65 72 74 28 20 21 70 53 75 62 50 61 72 73  ssert( !pSubPars
76a0: 65 2d 3e 70 41 69 6e 63 20 20 20 20 20 20 20 26  e->pAinc       &
76b0: 26 20 21 70 53 75 62 50 61 72 73 65 2d 3e 70 5a  & !pSubParse->pZ
76c0: 6f 6d 62 69 65 54 61 62 20 29 3b 0a 20 20 61 73  ombieTab );.  as
76d0: 73 65 72 74 28 20 21 70 53 75 62 50 61 72 73 65  sert( !pSubParse
76e0: 2d 3e 70 54 72 69 67 67 65 72 50 72 67 20 26 26  ->pTriggerPrg &&
76f0: 20 21 70 53 75 62 50 61 72 73 65 2d 3e 6e 4d 61   !pSubParse->nMa
7700: 78 41 72 67 20 29 3b 0a 20 20 73 71 6c 69 74 65  xArg );.  sqlite
7710: 33 50 61 72 73 65 72 52 65 73 65 74 28 70 53 75  3ParserReset(pSu
7720: 62 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  bParse);.  sqlit
7730: 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20  e3StackFree(db, 
7740: 70 53 75 62 50 61 72 73 65 29 3b 0a 0a 20 20 72  pSubParse);..  r
7750: 65 74 75 72 6e 20 70 50 72 67 3b 0a 7d 0a 20 20  eturn pPrg;.}.  
7760: 20 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20    ./*.** Return 
7770: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
7780: 72 69 67 67 65 72 50 72 67 20 6f 62 6a 65 63 74  riggerPrg object
7790: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
77a0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 66 6f 72 0a  sub-program for.
77b0: 2a 2a 20 74 72 69 67 67 65 72 20 70 54 72 69 67  ** trigger pTrig
77c0: 67 65 72 20 77 69 74 68 20 64 65 66 61 75 6c 74  ger with default
77d0: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c 67   ON CONFLICT alg
77e0: 6f 72 69 74 68 6d 20 6f 72 63 6f 6e 66 2e 20 49  orithm orconf. I
77f0: 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 54 72 69  f no such.** Tri
7800: 67 67 65 72 50 72 67 20 6f 62 6a 65 63 74 20 65  ggerPrg object e
7810: 78 69 73 74 73 2c 20 61 20 6e 65 77 20 6f 62 6a  xists, a new obj
7820: 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
7830: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 62   and populated b
7840: 65 66 6f 72 65 0a 2a 2a 20 62 65 69 6e 67 20 72  efore.** being r
7850: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
7860: 69 63 20 54 72 69 67 67 65 72 50 72 67 20 2a 67  ic TriggerPrg *g
7870: 65 74 52 6f 77 54 72 69 67 67 65 72 28 0a 20 20  etRowTrigger(.  
7880: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7890: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
78a0: 70 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  parse context */
78b0: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
78c0: 67 67 65 72 2c 20 20 20 2f 2a 20 54 72 69 67 67  gger,   /* Trigg
78d0: 65 72 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  er to code */.  
78e0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
78f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
7900: 65 20 74 72 69 67 67 65 72 20 70 54 72 69 67 67  e trigger pTrigg
7910: 65 72 20 69 73 20 61 74 74 61 63 68 65 64 20 74  er is attached t
7920: 6f 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e  o */.  int orcon
7930: 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  f           /* O
7940: 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72  N CONFLICT algor
7950: 69 74 68 6d 2e 20 2a 2f 0a 29 7b 0a 20 20 50 61  ithm. */.){.  Pa
7960: 72 73 65 20 2a 70 52 6f 6f 74 20 3d 20 73 71 6c  rse *pRoot = sql
7970: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
7980: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 54 72 69  l(pParse);.  Tri
7990: 67 67 65 72 50 72 67 20 2a 70 50 72 67 3b 0a 0a  ggerPrg *pPrg;..
79a0: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
79b0: 65 72 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20  er->zName==0 || 
79c0: 70 54 61 62 3d 3d 74 61 62 6c 65 4f 66 54 72 69  pTab==tableOfTri
79d0: 67 67 65 72 28 70 54 72 69 67 67 65 72 29 20 29  gger(pTrigger) )
79e0: 3b 0a 0a 20 20 2f 2a 20 49 74 20 6d 61 79 20 62  ;..  /* It may b
79f0: 65 20 74 68 61 74 20 74 68 69 73 20 74 72 69 67  e that this trig
7a00: 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
7a10: 62 65 65 6e 20 63 6f 64 65 64 20 28 6f 72 20 69  been coded (or i
7a20: 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72  s in the.  ** pr
7a30: 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 63  ocess of being c
7a40: 6f 64 65 64 29 2e 20 49 66 20 74 68 69 73 20 69  oded). If this i
7a50: 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
7a60: 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 0a 20   an entry with. 
7a70: 20 2a 2a 20 61 20 6d 61 74 63 68 69 6e 67 20 54   ** a matching T
7a80: 72 69 67 67 65 72 50 72 67 2e 70 54 72 69 67 67  riggerPrg.pTrigg
7a90: 65 72 20 66 69 65 6c 64 20 77 69 6c 6c 20 62 65  er field will be
7aa0: 20 70 72 65 73 65 6e 74 20 73 6f 6d 65 77 68 65   present somewhe
7ab0: 72 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 50  re.  ** in the P
7ac0: 61 72 73 65 2e 70 54 72 69 67 67 65 72 50 72 67  arse.pTriggerPrg
7ad0: 20 6c 69 73 74 2e 20 53 65 61 72 63 68 20 66 6f   list. Search fo
7ae0: 72 20 73 75 63 68 20 61 6e 20 65 6e 74 72 79 2e  r such an entry.
7af0: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 72 67 3d    */.  for(pPrg=
7b00: 70 52 6f 6f 74 2d 3e 70 54 72 69 67 67 65 72 50  pRoot->pTriggerP
7b10: 72 67 3b 20 0a 20 20 20 20 20 20 70 50 72 67 20  rg; .      pPrg 
7b20: 26 26 20 28 70 50 72 67 2d 3e 70 54 72 69 67 67  && (pPrg->pTrigg
7b30: 65 72 21 3d 70 54 72 69 67 67 65 72 20 7c 7c 20  er!=pTrigger || 
7b40: 70 50 72 67 2d 3e 6f 72 63 6f 6e 66 21 3d 6f 72  pPrg->orconf!=or
7b50: 63 6f 6e 66 29 3b 20 0a 20 20 20 20 20 20 70 50  conf); .      pP
7b60: 72 67 3d 70 50 72 67 2d 3e 70 4e 65 78 74 0a 20  rg=pPrg->pNext. 
7b70: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   );..  /* If an 
7b80: 65 78 69 73 74 69 6e 67 20 54 72 69 67 67 65 72  existing Trigger
7b90: 50 72 67 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  Prg could not be
7ba0: 20 6c 6f 63 61 74 65 64 2c 20 63 72 65 61 74 65   located, create
7bb0: 20 61 20 6e 65 77 20 6f 6e 65 2e 20 2a 2f 0a 20   a new one. */. 
7bc0: 20 69 66 28 20 21 70 50 72 67 20 29 7b 0a 20 20   if( !pPrg ){.  
7bd0: 20 20 70 50 72 67 20 3d 20 63 6f 64 65 52 6f 77    pPrg = codeRow
7be0: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20  Trigger(pParse, 
7bf0: 70 54 72 69 67 67 65 72 2c 20 70 54 61 62 2c 20  pTrigger, pTab, 
7c00: 6f 72 63 6f 6e 66 29 3b 0a 20 20 7d 0a 0a 20 20  orconf);.  }..  
7c10: 72 65 74 75 72 6e 20 70 50 72 67 3b 0a 7d 0a 0a  return pPrg;.}..
7c20: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
7c30: 6f 64 65 20 66 6f 72 20 74 68 65 20 74 72 69 67  ode for the trig
7c40: 67 65 72 20 70 72 6f 67 72 61 6d 20 61 73 73 6f  ger program asso
7c50: 63 69 61 74 65 64 20 77 69 74 68 20 74 72 69 67  ciated with trig
7c60: 67 65 72 20 70 20 6f 6e 20 0a 2a 2a 20 74 61 62  ger p on .** tab
7c70: 6c 65 20 70 54 61 62 2e 20 54 68 65 20 72 65 67  le pTab. The reg
7c80: 2c 20 6f 72 63 6f 6e 66 20 61 6e 64 20 69 67 6e  , orconf and ign
7c90: 6f 72 65 4a 75 6d 70 20 70 61 72 61 6d 65 74 65  oreJump paramete
7ca0: 72 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  rs passed to thi
7cb0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 72  s.** function ar
7cc0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
7cd0: 6f 73 65 20 64 65 73 63 72 69 62 65 64 20 69 6e  ose described in
7ce0: 20 74 68 65 20 68 65 61 64 65 72 20 66 75 6e 63   the header func
7cf0: 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 73 71 6c 69  tion for.** sqli
7d00: 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65  te3CodeRowTrigge
7d10: 72 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  r().*/.void sqli
7d20: 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65  te3CodeRowTrigge
7d30: 72 44 69 72 65 63 74 28 0a 20 20 50 61 72 73 65  rDirect(.  Parse
7d40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7d50: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
7d60: 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70   */.  Trigger *p
7d70: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ,          /* Tr
7d80: 69 67 67 65 72 20 74 6f 20 63 6f 64 65 20 2a 2f  igger to code */
7d90: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
7da0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
7db0: 61 62 6c 65 20 74 6f 20 63 6f 64 65 20 74 72 69  able to code tri
7dc0: 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20 20  ggers from */.  
7dd0: 69 6e 74 20 72 65 67 2c 20 20 20 20 20 20 20 20  int reg,        
7de0: 20 20 20 20 20 2f 2a 20 52 65 67 20 61 72 72 61       /* Reg arra
7df0: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4f 4c 44  y containing OLD
7e00: 2e 2a 20 61 6e 64 20 4e 45 57 2e 2a 20 76 61 6c  .* and NEW.* val
7e10: 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63  ues */.  int orc
7e20: 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  onf,          /*
7e30: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c   ON CONFLICT pol
7e40: 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67 6e  icy */.  int ign
7e50: 6f 72 65 4a 75 6d 70 20 20 20 20 20 20 20 2f 2a  oreJump       /*
7e60: 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   Instruction to 
7e70: 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52 41 49 53  jump to for RAIS
7e80: 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 29 7b 0a  E(IGNORE) */.){.
7e90: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
7ea0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
7eb0: 65 29 3b 20 2f 2a 20 4d 61 69 6e 20 56 4d 20 2a  e); /* Main VM *
7ec0: 2f 0a 20 20 54 72 69 67 67 65 72 50 72 67 20 2a  /.  TriggerPrg *
7ed0: 70 50 72 67 3b 0a 20 20 70 50 72 67 20 3d 20 67  pPrg;.  pPrg = g
7ee0: 65 74 52 6f 77 54 72 69 67 67 65 72 28 70 50 61  etRowTrigger(pPa
7ef0: 72 73 65 2c 20 70 2c 20 70 54 61 62 2c 20 6f 72  rse, p, pTab, or
7f00: 63 6f 6e 66 29 3b 0a 20 20 61 73 73 65 72 74 28  conf);.  assert(
7f10: 20 70 50 72 67 20 7c 7c 20 70 50 61 72 73 65 2d   pPrg || pParse-
7f20: 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
7f30: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
7f40: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  d );..  /* Code 
7f50: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f  the OP_Program o
7f60: 70 63 6f 64 65 20 69 6e 20 74 68 65 20 70 61 72  pcode in the par
7f70: 65 6e 74 20 56 44 42 45 2e 20 50 34 20 6f 66 20  ent VDBE. P4 of 
7f80: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 0a  the OP_Program .
7f90: 20 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65    ** is a pointe
7fa0: 72 20 74 6f 20 74 68 65 20 73 75 62 2d 76 64 62  r to the sub-vdb
7fb0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7fc0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
7fd0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 72 67  .  */.  if( pPrg
7fe0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 52 65 63   ){.    int bRec
7ff0: 75 72 73 69 76 65 20 3d 20 28 70 2d 3e 7a 4e 61  ursive = (p->zNa
8000: 6d 65 20 26 26 20 30 3d 3d 28 70 50 61 72 73 65  me && 0==(pParse
8010: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
8020: 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 29 29  TE_RecTriggers))
8030: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
8040: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
8050: 72 6f 67 72 61 6d 2c 20 72 65 67 2c 20 69 67 6e  rogram, reg, ign
8060: 6f 72 65 4a 75 6d 70 2c 20 2b 2b 70 50 61 72 73  oreJump, ++pPars
8070: 65 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20  e->nMem,.       
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
8090: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 72  const char *)pPr
80a0: 67 2d 3e 70 50 72 6f 67 72 61 6d 2c 20 50 34 5f  g->pProgram, P4_
80b0: 53 55 42 50 52 4f 47 52 41 4d 29 3b 0a 20 20 20  SUBPROGRAM);.   
80c0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 0a 20 20   VdbeComment(.  
80d0: 20 20 20 20 20 20 28 76 2c 20 22 43 61 6c 6c 3a        (v, "Call:
80e0: 20 25 73 2e 25 73 22 2c 20 28 70 2d 3e 7a 4e 61   %s.%s", (p->zNa
80f0: 6d 65 3f 70 2d 3e 7a 4e 61 6d 65 3a 22 66 6b 65  me?p->zName:"fke
8100: 79 22 29 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74  y"), onErrorText
8110: 28 6f 72 63 6f 6e 66 29 29 29 3b 0a 0a 20 20 20  (orconf)));..   
8120: 20 2f 2a 20 53 65 74 20 74 68 65 20 50 35 20 6f   /* Set the P5 o
8130: 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50  perand of the OP
8140: 5f 50 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63  _Program instruc
8150: 74 69 6f 6e 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f  tion to non-zero
8160: 20 69 66 0a 20 20 20 20 2a 2a 20 72 65 63 75 72   if.    ** recur
8170: 73 69 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20  sive invocation 
8180: 6f 66 20 74 68 69 73 20 74 72 69 67 67 65 72 20  of this trigger 
8190: 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 61 6c  program is disal
81a0: 6c 6f 77 65 64 2e 20 52 65 63 75 72 73 69 76 65  lowed. Recursive
81b0: 0a 20 20 20 20 2a 2a 20 69 6e 76 6f 63 61 74 69  .    ** invocati
81c0: 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  on is disallowed
81d0: 20 69 66 20 28 61 29 20 74 68 65 20 73 75 62 2d   if (a) the sub-
81e0: 70 72 6f 67 72 61 6d 20 69 73 20 72 65 61 6c 6c  program is reall
81f0: 79 20 61 20 74 72 69 67 67 65 72 2c 0a 20 20 20  y a trigger,.   
8200: 20 2a 2a 20 6e 6f 74 20 61 20 66 6f 72 65 69 67   ** not a foreig
8210: 6e 20 6b 65 79 20 61 63 74 69 6f 6e 2c 20 61 6e  n key action, an
8220: 64 20 28 62 29 20 74 68 65 20 66 6c 61 67 20 74  d (b) the flag t
8230: 6f 20 65 6e 61 62 6c 65 20 72 65 63 75 72 73 69  o enable recursi
8240: 76 65 20 74 72 69 67 67 65 72 73 0a 20 20 20 20  ve triggers.    
8250: 2a 2a 20 69 73 20 63 6c 65 61 72 2e 20 20 2a 2f  ** is clear.  */
8260: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8270: 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
8280: 62 52 65 63 75 72 73 69 76 65 29 3b 0a 20 20 7d  bRecursive);.  }
8290: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
82a0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 64 65  s called to code
82b0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 46 4f   the required FO
82c0: 52 20 45 41 43 48 20 52 4f 57 20 74 72 69 67 67  R EACH ROW trigg
82d0: 65 72 73 20 66 6f 72 20 61 6e 20 6f 70 65 72 61  ers for an opera
82e0: 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65  tion.** on table
82f0: 20 70 54 61 62 2e 20 54 68 65 20 6f 70 65 72 61   pTab. The opera
8300: 74 69 6f 6e 20 74 6f 20 63 6f 64 65 20 74 72 69  tion to code tri
8310: 67 67 65 72 73 20 66 6f 72 20 28 49 4e 53 45 52  ggers for (INSER
8320: 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
8330: 45 54 45 29 0a 2a 2a 20 69 73 20 67 69 76 65 6e  ETE).** is given
8340: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
8350: 65 74 65 72 2e 20 54 68 65 20 74 72 5f 74 6d 20  eter. The tr_tm 
8360: 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
8370: 69 6e 65 73 20 77 68 65 74 68 65 72 20 74 68 65  ines whether the
8380: 0a 2a 2a 20 42 45 46 4f 52 45 20 6f 72 20 41 46  .** BEFORE or AF
8390: 54 45 52 20 74 72 69 67 67 65 72 73 20 61 72 65  TER triggers are
83a0: 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65 20 6f   coded. If the o
83b0: 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 55  peration is an U
83c0: 50 44 41 54 45 2c 20 74 68 65 6e 0a 2a 2a 20 70  PDATE, then.** p
83d0: 61 72 61 6d 65 74 65 72 20 70 43 68 61 6e 67 65  arameter pChange
83e0: 73 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20  s is passed the 
83f0: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
8400: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a  being modified..
8410: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
8420: 72 65 20 6e 6f 20 74 72 69 67 67 65 72 73 20 74  re no triggers t
8430: 68 61 74 20 66 69 72 65 20 61 74 20 74 68 65 20  hat fire at the 
8440: 73 70 65 63 69 66 69 65 64 20 74 69 6d 65 20 66  specified time f
8450: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
8460: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  .** operation on
8470: 20 70 54 61 62 2c 20 74 68 69 73 20 66 75 6e 63   pTab, this func
8480: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
8490: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 20 61  .**.** The reg a
84a0: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61  rgument is the a
84b0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69  ddress of the fi
84c0: 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rst in an array 
84d0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a  of registers .**
84e0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68   that contain th
84f0: 65 20 76 61 6c 75 65 73 20 73 75 62 73 74 69 74  e values substit
8500: 75 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77  uted for the new
8510: 2e 2a 20 61 6e 64 20 6f 6c 64 2e 2a 20 72 65 66  .* and old.* ref
8520: 65 72 65 6e 63 65 73 0a 2a 2a 20 69 6e 20 74 68  erences.** in th
8530: 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  e trigger progra
8540: 6d 2e 20 49 66 20 4e 20 69 73 20 74 68 65 20 6e  m. If N is the n
8550: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
8560: 20 69 6e 20 74 61 62 6c 65 20 70 54 61 62 0a 2a   in table pTab.*
8570: 2a 20 28 61 20 63 6f 70 79 20 6f 66 20 70 54 61  * (a copy of pTa
8580: 62 2d 3e 6e 43 6f 6c 29 2c 20 74 68 65 6e 20 72  b->nCol), then r
8590: 65 67 69 73 74 65 72 73 20 61 72 65 20 70 6f 70  egisters are pop
85a0: 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  ulated as follow
85b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 65 67 69 73  s:.**.**   Regis
85c0: 74 65 72 20 20 20 20 20 20 20 43 6f 6e 74 61 69  ter       Contai
85d0: 6e 73 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ns.**   --------
85e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
8610: 2a 20 20 20 72 65 67 2b 30 20 20 20 20 20 20 20  *   reg+0       
8620: 20 20 20 4f 4c 44 2e 72 6f 77 69 64 0a 2a 2a 20     OLD.rowid.** 
8630: 20 20 72 65 67 2b 31 20 20 20 20 20 20 20 20 20    reg+1         
8640: 20 4f 4c 44 2e 2a 20 76 61 6c 75 65 20 6f 66 20   OLD.* value of 
8650: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
8660: 20 6f 66 20 70 54 61 62 0a 2a 2a 20 20 20 2e 2e   of pTab.**   ..
8670: 2e 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .            ...
8680: 0a 2a 2a 20 20 20 72 65 67 2b 4e 20 20 20 20 20  .**   reg+N     
8690: 20 20 20 20 20 4f 4c 44 2e 2a 20 76 61 6c 75 65       OLD.* value
86a0: 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
86b0: 6f 6c 75 6d 6e 20 6f 66 20 70 54 61 62 0a 2a 2a  olumn of pTab.**
86c0: 20 20 20 72 65 67 2b 4e 2b 31 20 20 20 20 20 20     reg+N+1      
86d0: 20 20 4e 45 57 2e 72 6f 77 69 64 0a 2a 2a 20 20    NEW.rowid.**  
86e0: 20 72 65 67 2b 4e 2b 32 20 20 20 20 20 20 20 20   reg+N+2        
86f0: 4f 4c 44 2e 2a 20 76 61 6c 75 65 20 6f 66 20 6c  OLD.* value of l
8700: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
8710: 6f 66 20 70 54 61 62 0a 2a 2a 20 20 20 2e 2e 2e  of pTab.**   ...
8720: 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
8730: 2a 2a 20 20 20 72 65 67 2b 4e 2b 4e 2b 31 20 20  **   reg+N+N+1  
8740: 20 20 20 20 4e 45 57 2e 2a 20 76 61 6c 75 65 20      NEW.* value 
8750: 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f  of right-most co
8760: 6c 75 6d 6e 20 6f 66 20 70 54 61 62 0a 2a 2a 0a  lumn of pTab.**.
8770: 2a 2a 20 46 6f 72 20 4f 4e 20 44 45 4c 45 54 45  ** For ON DELETE
8780: 20 74 72 69 67 67 65 72 73 2c 20 74 68 65 20 72   triggers, the r
8790: 65 67 69 73 74 65 72 73 20 63 6f 6e 74 61 69 6e  egisters contain
87a0: 69 6e 67 20 74 68 65 20 4e 45 57 2e 2a 20 76 61  ing the NEW.* va
87b0: 6c 75 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 65 76  lues will.** nev
87c0: 65 72 20 62 65 20 61 63 63 65 73 73 65 64 20 62  er be accessed b
87d0: 79 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72  y the trigger pr
87e0: 6f 67 72 61 6d 2c 20 73 6f 20 74 68 65 79 20 61  ogram, so they a
87f0: 72 65 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  re not allocated
8800: 20 6f 72 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65   or .** populate
8810: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
8820: 28 74 68 65 72 65 20 69 73 20 6e 6f 20 64 61 74  (there is no dat
8830: 61 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  a to populate th
8840: 65 6d 20 77 69 74 68 20 61 6e 79 77 61 79 29 2e  em with anyway).
8850: 20 0a 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20   .** Similarly, 
8860: 66 6f 72 20 4f 4e 20 49 4e 53 45 52 54 20 74 72  for ON INSERT tr
8870: 69 67 67 65 72 73 20 74 68 65 20 76 61 6c 75 65  iggers the value
8880: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
8890: 4f 4c 44 2e 2a 20 72 65 67 69 73 74 65 72 73 0a  OLD.* registers.
88a0: 2a 2a 20 61 72 65 20 6e 65 76 65 72 20 61 63 63  ** are never acc
88b0: 65 73 73 65 64 2c 20 61 6e 64 20 73 6f 20 61 72  essed, and so ar
88c0: 65 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  e not allocated 
88d0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
88e0: 6f 2c 20 66 6f 72 20 61 6e 0a 2a 2a 20 4f 4e 20  o, for an.** ON 
88f0: 49 4e 53 45 52 54 20 74 72 69 67 67 65 72 2c 20  INSERT trigger, 
8900: 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
8910: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
8920: 6e 20 61 73 20 70 61 72 61 6d 65 74 65 72 20 72  n as parameter r
8930: 65 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 72  eg.** is not a r
8940: 65 61 64 61 62 6c 65 20 72 65 67 69 73 74 65 72  eadable register
8950: 2c 20 61 6c 74 68 6f 75 67 68 20 72 65 67 69 73  , although regis
8960: 74 65 72 73 20 28 72 65 67 2b 4e 29 20 74 68 72  ters (reg+N) thr
8970: 6f 75 67 68 20 0a 2a 2a 20 28 72 65 67 2b 4e 2b  ough .** (reg+N+
8980: 4e 2b 31 29 20 61 72 65 2e 0a 2a 2a 0a 2a 2a 20  N+1) are..**.** 
8990: 50 61 72 61 6d 65 74 65 72 20 6f 72 63 6f 6e 66  Parameter orconf
89a0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
89b0: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
89c0: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  ion algorithm fo
89d0: 72 20 74 68 65 0a 2a 2a 20 74 72 69 67 67 65 72  r the.** trigger
89e0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 75 73 65 20   program to use 
89f0: 28 52 45 50 4c 41 43 45 2c 20 49 47 4e 4f 52 45  (REPLACE, IGNORE
8a00: 20 65 74 63 2e 29 2e 20 50 61 72 61 6d 65 74 65   etc.). Paramete
8a10: 72 20 69 67 6e 6f 72 65 4a 75 6d 70 0a 2a 2a 20  r ignoreJump.** 
8a20: 69 73 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  is the instructi
8a30: 6f 6e 20 74 68 61 74 20 63 6f 6e 74 72 6f 6c 20  on that control 
8a40: 73 68 6f 75 6c 64 20 6a 75 6d 70 20 74 6f 20 69  should jump to i
8a50: 66 20 61 20 74 72 69 67 67 65 72 20 70 72 6f 67  f a trigger prog
8a60: 72 61 6d 0a 2a 2a 20 72 61 69 73 65 73 20 61 6e  ram.** raises an
8a70: 20 49 47 4e 4f 52 45 20 65 78 63 65 70 74 69 6f   IGNORE exceptio
8a80: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8a90: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
8aa0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8ab0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
8ac0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
8ad0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
8ae0: 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  ,   /* List of t
8af0: 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65  riggers on table
8b00: 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 6f   pTab */.  int o
8b10: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
8b20: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 50 44  /* One of TK_UPD
8b30: 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20  ATE, TK_INSERT, 
8b40: 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 45  TK_DELETE */.  E
8b50: 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65  xprList *pChange
8b60: 73 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 6c  s,  /* Changes l
8b70: 69 73 74 20 66 6f 72 20 61 6e 79 20 55 50 44 41  ist for any UPDA
8b80: 54 45 20 4f 46 20 74 72 69 67 67 65 72 73 20 2a  TE OF triggers *
8b90: 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20  /.  int tr_tm,  
8ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
8bb0: 6f 66 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52  of TRIGGER_BEFOR
8bc0: 45 2c 20 54 52 49 47 47 45 52 5f 41 46 54 45 52  E, TRIGGER_AFTER
8bd0: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
8be0: 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  b,         /* Th
8bf0: 65 20 74 61 62 6c 65 20 74 6f 20 63 6f 64 65 20  e table to code 
8c00: 74 72 69 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f  triggers from */
8c10: 0a 20 20 69 6e 74 20 72 65 67 2c 20 20 20 20 20  .  int reg,     
8c20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
8c30: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
8c40: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 28 73   of registers (s
8c50: 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20 69  ee above) */.  i
8c60: 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20 20 20 20  nt orconf,      
8c70: 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49      /* ON CONFLI
8c80: 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 20 20 69  CT policy */.  i
8c90: 6e 74 20 69 67 6e 6f 72 65 4a 75 6d 70 20 20 20  nt ignoreJump   
8ca0: 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
8cb0: 6f 6e 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f  on to jump to fo
8cc0: 72 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29 20  r RAISE(IGNORE) 
8cd0: 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 20  */.){.  Trigger 
8ce0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *p;          /* 
8cf0: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
8d00: 74 68 72 6f 75 67 68 20 70 54 72 69 67 67 65 72  through pTrigger
8d10: 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65   list */..  asse
8d20: 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 50 44 41 54  rt( op==TK_UPDAT
8d30: 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45  E || op==TK_INSE
8d40: 52 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 44 45 4c  RT || op==TK_DEL
8d50: 45 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ETE );.  assert(
8d60: 20 74 72 5f 74 6d 3d 3d 54 52 49 47 47 45 52 5f   tr_tm==TRIGGER_
8d70: 42 45 46 4f 52 45 20 7c 7c 20 74 72 5f 74 6d 3d  BEFORE || tr_tm=
8d80: 3d 54 52 49 47 47 45 52 5f 41 46 54 45 52 20 29  =TRIGGER_AFTER )
8d90: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 70 3d  ;.  assert( (op=
8da0: 3d 54 4b 5f 55 50 44 41 54 45 29 3d 3d 28 70 43  =TK_UPDATE)==(pC
8db0: 68 61 6e 67 65 73 21 3d 30 29 20 29 3b 0a 0a 20  hanges!=0) );.. 
8dc0: 20 66 6f 72 28 70 3d 70 54 72 69 67 67 65 72 3b   for(p=pTrigger;
8dd0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
8de0: 0a 0a 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20  ..    /* Sanity 
8df0: 63 68 65 63 6b 69 6e 67 3a 20 20 54 68 65 20 73  checking:  The s
8e00: 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 74 72  chema for the tr
8e10: 69 67 67 65 72 20 61 6e 64 20 66 6f 72 20 74 68  igger and for th
8e20: 65 20 74 61 62 6c 65 20 61 72 65 0a 20 20 20 20  e table are.    
8e30: 2a 2a 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65  ** always define
8e40: 64 2e 20 20 54 68 65 20 74 72 69 67 67 65 72 20  d.  The trigger 
8e50: 6d 75 73 74 20 62 65 20 69 6e 20 74 68 65 20 73  must be in the s
8e60: 61 6d 65 20 73 63 68 65 6d 61 20 61 73 20 74 68  ame schema as th
8e70: 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6f  e table.    ** o
8e80: 72 20 65 6c 73 65 20 69 74 20 6d 75 73 74 20 62  r else it must b
8e90: 65 20 61 20 54 45 4d 50 20 74 72 69 67 67 65 72  e a TEMP trigger
8ea0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
8eb0: 20 70 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29   p->pSchema!=0 )
8ec0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
8ed0: 3e 70 54 61 62 53 63 68 65 6d 61 21 3d 30 20 29  >pTabSchema!=0 )
8ee0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
8ef0: 3e 70 53 63 68 65 6d 61 3d 3d 70 2d 3e 70 54 61  >pSchema==p->pTa
8f00: 62 53 63 68 65 6d 61 20 0a 20 20 20 20 20 20 20  bSchema .       
8f10: 20 20 7c 7c 20 70 2d 3e 70 53 63 68 65 6d 61 3d    || p->pSchema=
8f20: 3d 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  =pParse->db->aDb
8f30: 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 0a  [1].pSchema );..
8f40: 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65      /* Determine
8f50: 20 77 68 65 74 68 65 72 20 77 65 20 73 68 6f 75   whether we shou
8f60: 6c 64 20 63 6f 64 65 20 74 68 69 73 20 74 72 69  ld code this tri
8f70: 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  gger */.    if( 
8f80: 70 2d 3e 6f 70 3d 3d 6f 70 20 0a 20 20 20 20 20  p->op==op .     
8f90: 26 26 20 70 2d 3e 74 72 5f 74 6d 3d 3d 74 72 5f  && p->tr_tm==tr_
8fa0: 74 6d 20 0a 20 20 20 20 20 26 26 20 63 68 65 63  tm .     && chec
8fb0: 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 70  kColumnOverlap(p
8fc0: 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70 43 68 61  ->pColumns, pCha
8fd0: 6e 67 65 73 29 0a 20 20 20 20 29 7b 0a 20 20 20  nges).    ){.   
8fe0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f     sqlite3CodeRo
8ff0: 77 54 72 69 67 67 65 72 44 69 72 65 63 74 28 70  wTriggerDirect(p
9000: 50 61 72 73 65 2c 20 70 2c 20 70 54 61 62 2c 20  Parse, p, pTab, 
9010: 72 65 67 2c 20 6f 72 63 6f 6e 66 2c 20 69 67 6e  reg, orconf, ign
9020: 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 7d 0a  oreJump);.    }.
9030: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 69    }.}../*.** Tri
9040: 67 67 65 72 73 20 6d 61 79 20 61 63 63 65 73 73  ggers may access
9050: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
9060: 6e 20 74 68 65 20 6f 6c 64 2e 2a 20 6f 72 20 6e  n the old.* or n
9070: 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
9080: 65 2e 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  e. .** This func
9090: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 33  tion returns a 3
90a0: 32 2d 62 69 74 20 62 69 74 6d 61 73 6b 20 69 6e  2-bit bitmask in
90b0: 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 63  dicating which c
90c0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 0a 2a  olumns of the .*
90d0: 2a 20 6f 6c 64 2e 2a 20 6f 72 20 6e 65 77 2e 2a  * old.* or new.*
90e0: 20 74 61 62 6c 65 73 20 61 63 74 75 61 6c 6c 79   tables actually
90f0: 20 61 72 65 20 75 73 65 64 20 62 79 20 74 72 69   are used by tri
9100: 67 67 65 72 73 2e 20 54 68 69 73 20 69 6e 66 6f  ggers. This info
9110: 72 6d 61 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20  rmation .** may 
9120: 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  be used by the c
9130: 61 6c 6c 65 72 2c 20 66 6f 72 20 65 78 61 6d 70  aller, for examp
9140: 6c 65 2c 20 74 6f 20 61 76 6f 69 64 20 68 61 76  le, to avoid hav
9150: 69 6e 67 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  ing to load the 
9160: 65 6e 74 69 72 65 0a 2a 2a 20 6f 6c 64 2e 2a 20  entire.** old.* 
9170: 72 65 63 6f 72 64 20 69 6e 74 6f 20 6d 65 6d 6f  record into memo
9180: 72 79 20 77 68 65 6e 20 65 78 65 63 75 74 69 6e  ry when executin
9190: 67 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  g an UPDATE or D
91a0: 45 4c 45 54 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ELETE command..*
91b0: 2a 0a 2a 2a 20 42 69 74 20 30 20 6f 66 20 74 68  *.** Bit 0 of th
91c0: 65 20 72 65 74 75 72 6e 65 64 20 6d 61 73 6b 20  e returned mask 
91d0: 69 73 20 73 65 74 20 69 66 20 74 68 65 20 6c 65  is set if the le
91e0: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
91f0: 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6d  f the.** table m
9200: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20 75  ay be accessed u
9210: 73 69 6e 67 20 61 6e 20 5b 6f 6c 64 7c 6e 65 77  sing an [old|new
9220: 5d 2e 3c 63 6f 6c 3e 20 72 65 66 65 72 65 6e 63  ].<col> referenc
9230: 65 2e 20 42 69 74 20 31 20 69 73 20 73 65 74 20  e. Bit 1 is set 
9240: 69 66 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64  if.** the second
9250: 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e   leftmost column
9260: 20 76 61 6c 75 65 20 69 73 20 72 65 71 75 69 72   value is requir
9270: 65 64 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 20 49  ed, and so on. I
9280: 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6d  f there.** are m
9290: 6f 72 65 20 74 68 61 6e 20 33 32 20 63 6f 6c 75  ore than 32 colu
92a0: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
92b0: 2c 20 61 6e 64 20 61 74 20 6c 65 61 73 74 20 6f  , and at least o
92c0: 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ne of the column
92d0: 73 0a 2a 2a 20 77 69 74 68 20 61 6e 20 69 6e 64  s.** with an ind
92e0: 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
92f0: 33 32 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  32 may be access
9300: 65 64 2c 20 30 78 66 66 66 66 66 66 66 66 20 69  ed, 0xffffffff i
9310: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
9320: 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
9330: 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  ible to determin
9340: 65 20 69 66 20 74 68 65 20 6f 6c 64 2e 72 6f 77  e if the old.row
9350: 69 64 20 6f 72 20 6e 65 77 2e 72 6f 77 69 64 20  id or new.rowid 
9360: 63 6f 6c 75 6d 6e 20 69 73 20 0a 2a 2a 20 61 63  column is .** ac
9370: 63 65 73 73 65 64 20 62 79 20 74 72 69 67 67 65  cessed by trigge
9380: 72 73 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  rs. The caller m
9390: 75 73 74 20 61 6c 77 61 79 73 20 61 73 73 75 6d  ust always assum
93a0: 65 20 74 68 61 74 20 69 74 20 69 73 2e 0a 2a 2a  e that it is..**
93b0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73  .** Parameter is
93c0: 4e 65 77 20 6d 75 73 74 20 62 65 20 65 69 74 68  New must be eith
93d0: 65 72 20 31 20 6f 72 20 30 2e 20 49 66 20 69 74  er 1 or 0. If it
93e0: 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20   is 0, then the 
93f0: 6d 61 73 6b 20 72 65 74 75 72 6e 65 64 0a 2a 2a  mask returned.**
9400: 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20   applies to the 
9410: 6f 6c 64 2e 2a 20 74 61 62 6c 65 2e 20 49 66 20  old.* table. If 
9420: 31 2c 20 74 68 65 20 6e 65 77 2e 2a 20 74 61 62  1, the new.* tab
9430: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  le..**.** Parame
9440: 74 65 72 20 74 72 5f 74 6d 20 6d 75 73 74 20 62  ter tr_tm must b
9450: 65 20 61 20 6d 61 73 6b 20 77 69 74 68 20 6f 6e  e a mask with on
9460: 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
9470: 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 0a   TRIGGER_BEFORE.
9480: 2a 2a 20 61 6e 64 20 54 52 49 47 47 45 52 5f 41  ** and TRIGGER_A
9490: 46 54 45 52 20 62 69 74 73 20 73 65 74 2e 20 56  FTER bits set. V
94a0: 61 6c 75 65 73 20 61 63 63 65 73 73 65 64 20 62  alues accessed b
94b0: 79 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72  y BEFORE trigger
94c0: 73 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 69 6e  s are only.** in
94d0: 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
94e0: 74 75 72 6e 65 64 20 6d 61 73 6b 20 69 66 20 74  turned mask if t
94f0: 68 65 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52  he TRIGGER_BEFOR
9500: 45 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  E bit is set in 
9510: 74 68 65 0a 2a 2a 20 74 72 5f 74 6d 20 70 61 72  the.** tr_tm par
9520: 61 6d 65 74 65 72 2e 20 53 69 6d 69 6c 61 72 6c  ameter. Similarl
9530: 79 2c 20 76 61 6c 75 65 73 20 61 63 63 65 73 73  y, values access
9540: 65 64 20 62 79 20 41 46 54 45 52 20 74 72 69 67  ed by AFTER trig
9550: 67 65 72 73 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a  gers are only.**
9560: 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
9570: 20 72 65 74 75 72 6e 65 64 20 6d 61 73 6b 20 69   returned mask i
9580: 66 20 74 68 65 20 54 52 49 47 47 45 52 5f 41 46  f the TRIGGER_AF
9590: 54 45 52 20 62 69 74 20 69 73 20 73 65 74 20 69  TER bit is set i
95a0: 6e 20 74 72 5f 74 6d 2e 0a 2a 2f 0a 75 33 32 20  n tr_tm..*/.u32 
95b0: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 43 6f  sqlite3TriggerCo
95c0: 6c 6d 61 73 6b 28 0a 20 20 50 61 72 73 65 20 2a  lmask(.  Parse *
95d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
95e0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
95f0: 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  /.  Trigger *pTr
9600: 69 67 67 65 72 2c 20 20 20 2f 2a 20 4c 69 73 74  igger,   /* List
9610: 20 6f 66 20 74 72 69 67 67 65 72 73 20 6f 6e 20   of triggers on 
9620: 74 61 62 6c 65 20 70 54 61 62 20 2a 2f 0a 20 20  table pTab */.  
9630: 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67  ExprList *pChang
9640: 65 73 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 20  es,  /* Changes 
9650: 6c 69 73 74 20 66 6f 72 20 61 6e 79 20 55 50 44  list for any UPD
9660: 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 73 20  ATE OF triggers 
9670: 2a 2f 0a 20 20 69 6e 74 20 69 73 4e 65 77 2c 20  */.  int isNew, 
9680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 66            /* 1 f
9690: 6f 72 20 6e 65 77 2e 2a 20 72 65 66 20 6d 61 73  or new.* ref mas
96a0: 6b 2c 20 30 20 66 6f 72 20 6f 6c 64 2e 2a 20 72  k, 0 for old.* r
96b0: 65 66 20 6d 61 73 6b 20 2a 2f 0a 20 20 69 6e 74  ef mask */.  int
96c0: 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20 20   tr_tm,         
96d0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 54 52 49    /* Mask of TRI
96e0: 47 47 45 52 5f 42 45 46 4f 52 45 7c 54 52 49 47  GGER_BEFORE|TRIG
96f0: 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54  GER_AFTER */.  T
9700: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
9710: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
9720: 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72   to code trigger
9730: 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
9740: 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20  orconf          
9750: 20 2f 2a 20 44 65 66 61 75 6c 74 20 4f 4e 20 43   /* Default ON C
9760: 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 66  ONFLICT policy f
9770: 6f 72 20 74 72 69 67 67 65 72 20 73 74 65 70 73  or trigger steps
9780: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
9790: 6e 74 20 6f 70 20 3d 20 70 43 68 61 6e 67 65 73  nt op = pChanges
97a0: 20 3f 20 54 4b 5f 55 50 44 41 54 45 20 3a 20 54   ? TK_UPDATE : T
97b0: 4b 5f 44 45 4c 45 54 45 3b 0a 20 20 75 33 32 20  K_DELETE;.  u32 
97c0: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 54 72 69 67  mask = 0;.  Trig
97d0: 67 65 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72  ger *p;..  asser
97e0: 74 28 20 69 73 4e 65 77 3d 3d 31 20 7c 7c 20 69  t( isNew==1 || i
97f0: 73 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  sNew==0 );.  for
9800: 28 70 3d 70 54 72 69 67 67 65 72 3b 20 70 3b 20  (p=pTrigger; p; 
9810: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
9820: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26   if( p->op==op &
9830: 26 20 28 74 72 5f 74 6d 26 70 2d 3e 74 72 5f 74  & (tr_tm&p->tr_t
9840: 6d 29 0a 20 20 20 20 20 26 26 20 63 68 65 63 6b  m).     && check
9850: 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 70 2d  ColumnOverlap(p-
9860: 3e 70 43 6f 6c 75 6d 6e 73 2c 70 43 68 61 6e 67  >pColumns,pChang
9870: 65 73 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  es).    ){.     
9880: 20 54 72 69 67 67 65 72 50 72 67 20 2a 70 50 72   TriggerPrg *pPr
9890: 67 3b 0a 20 20 20 20 20 20 70 50 72 67 20 3d 20  g;.      pPrg = 
98a0: 67 65 74 52 6f 77 54 72 69 67 67 65 72 28 70 50  getRowTrigger(pP
98b0: 61 72 73 65 2c 20 70 2c 20 70 54 61 62 2c 20 6f  arse, p, pTab, o
98c0: 72 63 6f 6e 66 29 3b 0a 20 20 20 20 20 20 69 66  rconf);.      if
98d0: 28 20 70 50 72 67 20 29 7b 0a 20 20 20 20 20 20  ( pPrg ){.      
98e0: 20 20 6d 61 73 6b 20 7c 3d 20 70 50 72 67 2d 3e    mask |= pPrg->
98f0: 61 43 6f 6c 6d 61 73 6b 5b 69 73 4e 65 77 5d 3b  aColmask[isNew];
9900: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9910: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6d 61 73   }..  return mas
9920: 6b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  k;.}..#endif /* 
9930: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9940: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f  OMIT_TRIGGER) */
9950: 0a                                               .