/ Hex Artifact Content
Login

Artifact ec4813709e990a169b6923293e839fa5dfd64282:


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 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
0750: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 54 6d  teHashFirst(&pTm
0760: 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73  pSchema->trigHas
0770: 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48  h); p; p=sqliteH
0780: 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20  ashNext(p)){.   
0790: 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
07a0: 67 20 3d 20 28 54 72 69 67 67 65 72 20 2a 29 73  g = (Trigger *)s
07b0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29  qliteHashData(p)
07c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 69  ;.      if( pTri
07d0: 67 2d 3e 70 54 61 62 53 63 68 65 6d 61 3d 3d 70  g->pTabSchema==p
07e0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20  Tab->pSchema.   
07f0: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
0800: 33 53 74 72 49 43 6d 70 28 70 54 72 69 67 2d 3e  3StrICmp(pTrig->
0810: 74 61 62 6c 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  table, pTab->zNa
0820: 6d 65 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  me) .      ){.  
0830: 20 20 20 20 20 20 70 54 72 69 67 2d 3e 70 4e 65        pTrig->pNe
0840: 78 74 20 3d 20 28 70 4c 69 73 74 20 3f 20 70 4c  xt = (pList ? pL
0850: 69 73 74 20 3a 20 70 54 61 62 2d 3e 70 54 72 69  ist : pTab->pTri
0860: 67 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  gger);.        p
0870: 4c 69 73 74 20 3d 20 70 54 72 69 67 3b 0a 20 20  List = pTrig;.  
0880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
0890: 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73 74  .  return (pList
08a0: 20 3f 20 70 4c 69 73 74 20 3a 20 70 54 61 62 2d   ? pList : pTab-
08b0: 3e 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a 2f  >pTrigger);.}../
08c0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
08d0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
08e0: 72 20 77 68 65 6e 20 69 74 20 73 65 65 73 20 61  r when it sees a
08f0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
0900: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 75 70 20  statement.** up 
0910: 74 6f 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20  to the point of 
0920: 74 68 65 20 42 45 47 49 4e 20 62 65 66 6f 72 65  the BEGIN before
0930: 20 74 68 65 20 74 72 69 67 67 65 72 20 61 63 74   the trigger act
0940: 69 6f 6e 73 2e 20 20 41 20 54 72 69 67 67 65 72  ions.  A Trigger
0950: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73  .** structure is
0960: 20 67 65 6e 65 72 61 74 65 64 20 62 61 73 65 64   generated based
0970: 20 6f 6e 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   on the informat
0980: 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65 20 61 6e  ion available an
0990: 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70  d stored.** in p
09a0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67  Parse->pNewTrigg
09b0: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 74  er.  After the t
09c0: 72 69 67 67 65 72 20 61 63 74 69 6f 6e 73 20 68  rigger actions h
09d0: 61 76 65 20 62 65 65 6e 20 70 61 72 73 65 64 2c  ave been parsed,
09e0: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46   the.** sqlite3F
09f0: 69 6e 69 73 68 54 72 69 67 67 65 72 28 29 20 66  inishTrigger() f
0a00: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
0a10: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
0a20: 65 20 74 72 69 67 67 65 72 0a 2a 2a 20 63 6f 6e  e trigger.** con
0a30: 73 74 72 75 63 74 69 6f 6e 20 70 72 6f 63 65 73  struction proces
0a40: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0a50: 65 33 42 65 67 69 6e 54 72 69 67 67 65 72 28 0a  e3BeginTrigger(.
0a60: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
0a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
0a80: 73 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68  se context of th
0a90: 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  e CREATE TRIGGER
0aa0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0ab0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
0ac0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
0ad0: 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20 2a  of the trigger *
0ae0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
0af0: 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  2,      /* The n
0b00: 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67 67  ame of the trigg
0b10: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74  er */.  int tr_t
0b20: 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  m,          /* O
0b30: 6e 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c  ne of TK_BEFORE,
0b40: 20 54 4b 5f 41 46 54 45 52 2c 20 54 4b 5f 49 4e   TK_AFTER, TK_IN
0b50: 53 54 45 41 44 20 2a 2f 0a 20 20 69 6e 74 20 6f  STEAD */.  int o
0b60: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
0b70: 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e 53 45  * One of TK_INSE
0b80: 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 54  RT, TK_UPDATE, T
0b90: 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 49 64  K_DELETE */.  Id
0ba0: 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20  List *pColumns, 
0bb0: 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73 74    /* column list
0bc0: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 55   if this is an U
0bd0: 50 44 41 54 45 20 4f 46 20 74 72 69 67 67 65 72  PDATE OF trigger
0be0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
0bf0: 54 61 62 6c 65 4e 61 6d 65 2c 2f 2a 20 54 68 65  TableName,/* The
0c00: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
0c10: 6c 65 2f 76 69 65 77 20 74 68 65 20 74 72 69 67  le/view the trig
0c20: 67 65 72 20 61 70 70 6c 69 65 73 20 74 6f 20 2a  ger applies to *
0c30: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 6e 2c  /.  Expr *pWhen,
0c40: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 4e 20          /* WHEN 
0c50: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
0c60: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 20  isTemp,         
0c70: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 54  /* True if the T
0c80: 45 4d 50 4f 52 41 52 59 20 6b 65 79 77 6f 72 64  EMPORARY keyword
0c90: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
0ca0: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
0cb0: 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73       /* Suppress
0cc0: 20 65 72 72 6f 72 73 20 69 66 20 74 68 65 20 74   errors if the t
0cd0: 72 69 67 67 65 72 20 61 6c 72 65 61 64 79 20 65  rigger already e
0ce0: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 72  xists */.){.  Tr
0cf0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20  igger *pTrigger 
0d00: 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6e 65 77  = 0;  /* The new
0d10: 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 54 61   trigger */.  Ta
0d20: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
0d30: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
0d40: 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72 20  hat the trigger 
0d50: 66 69 72 65 73 20 6f 66 66 20 6f 66 20 2a 2f 0a  fires off of */.
0d60: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
0d70: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  0;        /* Nam
0d80: 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72  e of the trigger
0d90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
0da0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
0db0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
0dc0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
0dd0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
0de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0df0: 64 61 74 61 62 61 73 65 20 74 6f 20 73 74 6f 72  database to stor
0e00: 65 20 74 68 65 20 74 72 69 67 67 65 72 20 69 6e  e the trigger in
0e10: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
0e20: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
0e30: 20 54 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   The unqualified
0e40: 20 64 62 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62   db name */.  Db
0e50: 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
0e60: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20 76        /* State v
0e70: 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 44 42  ector for the DB
0e80: 20 66 69 78 65 72 20 2a 2f 0a 20 20 69 6e 74 20   fixer */.  int 
0e90: 69 54 61 62 44 62 3b 20 20 20 20 20 20 20 20 20  iTabDb;         
0ea0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
0eb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c  the database hol
0ec0: 64 69 6e 67 20 70 54 61 62 20 2a 2f 0a 0a 20 20  ding pTab */..  
0ed0: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 21 3d  assert( pName1!=
0ee0: 30 20 29 3b 20 20 20 2f 2a 20 70 4e 61 6d 65 31  0 );   /* pName1
0ef0: 2d 3e 7a 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ->z might be NUL
0f00: 4c 2c 20 62 75 74 20 6e 6f 74 20 70 4e 61 6d 65  L, but not pName
0f10: 31 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 61 73  1 itself */.  as
0f20: 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20  sert( pName2!=0 
0f30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  );.  assert( op=
0f40: 3d 54 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  =TK_INSERT || op
0f50: 3d 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20 6f  ==TK_UPDATE || o
0f60: 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 29 3b 0a  p==TK_DELETE );.
0f70: 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26    assert( op>0 &
0f80: 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69  & op<0xff );.  i
0f90: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
0fa0: 20 2f 2a 20 49 66 20 54 45 4d 50 20 77 61 73 20   /* If TEMP was 
0fb0: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
0fc0: 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65  the trigger name
0fd0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
0fe0: 69 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  ified. */.    if
0ff0: 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  ( pName2->n>0 ){
1000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1010: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1020: 74 65 6d 70 6f 72 61 72 79 20 74 72 69 67 67 65  temporary trigge
1030: 72 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 71  r may not have q
1040: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 22 29 3b  ualified name");
1050: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
1060: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
1070: 20 7d 0a 20 20 20 20 69 44 62 20 3d 20 31 3b 0a   }.    iDb = 1;.
1080: 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d      pName = pNam
1090: 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e1;.  }else{.   
10a0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
10b0: 68 65 20 64 62 20 74 68 61 74 20 74 68 65 20 74  he db that the t
10c0: 68 65 20 74 72 69 67 67 65 72 20 77 69 6c 6c 20  he trigger will 
10d0: 62 65 20 63 72 65 61 74 65 64 20 69 6e 20 2a 2f  be created in */
10e0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
10f0: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
1100: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
1110: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
1120: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
1130: 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67        goto trigg
1140: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  er_cleanup;.    
1150: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1160: 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20  he trigger name 
1170: 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
1180: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69   and the table i
1190: 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 0a  s a temp table,.
11a0: 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 69 44    ** then set iD
11b0: 62 20 74 6f 20 31 20 74 6f 20 63 72 65 61 74 65  b to 1 to create
11c0: 20 74 68 65 20 74 72 69 67 67 65 72 20 69 6e 20   the trigger in 
11d0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
11e0: 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20 49 66 20  tabase..  ** If 
11f0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
1200: 6f 6b 75 70 28 29 20 72 65 74 75 72 6e 73 20 30  okup() returns 0
1210: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
1220: 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 0a   table does not.
1230: 20 20 2a 2a 20 65 78 69 73 74 2c 20 74 68 65 20    ** exist, the 
1240: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
1250: 62 79 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c  by the block bel
1260: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
1270: 70 54 61 62 6c 65 4e 61 6d 65 20 7c 7c 20 64 62  pTableName || db
1280: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1290: 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  {.    goto trigg
12a0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
12b0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
12c0: 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
12d0: 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d 65  arse, pTableName
12e0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  );.  if( db->ini
12f0: 74 2e 62 75 73 79 3d 3d 30 20 26 26 20 70 4e 61  t.busy==0 && pNa
1300: 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
1310: 62 0a 20 20 20 20 20 20 20 20 26 26 20 70 54 61  b.        && pTa
1320: 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  b->pSchema==db->
1330: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
1340: 7b 0a 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20  {.    iDb = 1;. 
1350: 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20   }..  /* Ensure 
1360: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  the table name m
1370: 61 74 63 68 65 73 20 64 61 74 61 62 61 73 65 20  atches database 
1380: 6e 61 6d 65 20 61 6e 64 20 74 68 61 74 20 74 68  name and that th
1390: 65 20 74 61 62 6c 65 20 65 78 69 73 74 73 20 2a  e table exists *
13a0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
13b0: 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
13c0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
13d0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
13e0: 65 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  eName->nSrc==1 )
13f0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
1400: 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
1410: 61 72 73 65 2c 20 69 44 62 2c 20 22 74 72 69 67  arse, iDb, "trig
1420: 67 65 72 22 2c 20 70 4e 61 6d 65 29 20 26 26 20  ger", pName) && 
1430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69  .      sqlite3Fi
1440: 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
1450: 70 54 61 62 6c 65 4e 61 6d 65 29 20 29 7b 0a 20  pTableName) ){. 
1460: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
1470: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
1480: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
1490: 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
14a0: 65 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  e, pTableName);.
14b0: 20 20 69 66 28 20 21 70 54 61 62 20 29 7b 0a 20    if( !pTab ){. 
14c0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
14d0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
14e0: 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69  */.    if( db->i
14f0: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 7b 0a 20 20  nit.iDb==1 ){.  
1500: 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 23 33      /* Ticket #3
1510: 38 31 30 2e 0a 20 20 20 20 20 20 2a 2a 20 4e 6f  810..      ** No
1520: 72 6d 61 6c 6c 79 2c 20 77 68 65 6e 65 76 65 72  rmally, whenever
1530: 20 61 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70   a table is drop
1540: 70 65 64 2c 20 61 6c 6c 20 61 73 73 6f 63 69 61  ped, all associa
1550: 74 65 64 20 74 72 69 67 67 65 72 73 20 61 72 65  ted triggers are
1560: 0a 20 20 20 20 20 20 2a 2a 20 64 72 6f 70 70 65  .      ** droppe
1570: 64 20 74 6f 6f 2e 20 20 42 75 74 20 69 66 20 61  d too.  But if a
1580: 20 54 45 4d 50 20 74 72 69 67 67 65 72 20 69 73   TEMP trigger is
1590: 20 63 72 65 61 74 65 64 20 6f 6e 20 61 20 6e 6f   created on a no
15a0: 6e 2d 54 45 4d 50 20 74 61 62 6c 65 0a 20 20 20  n-TEMP table.   
15b0: 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 74 61     ** and the ta
15c0: 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 20 62  ble is dropped b
15d0: 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 61  y a different da
15e0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
15f0: 6e 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  n, the.      ** 
1600: 74 72 69 67 67 65 72 20 69 73 20 6e 6f 74 20 76  trigger is not v
1610: 69 73 69 62 6c 65 20 74 6f 20 74 68 65 20 64 61  isible to the da
1620: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1630: 6e 20 74 68 61 74 20 64 6f 65 73 20 74 68 65 0a  n that does the.
1640: 20 20 20 20 20 20 2a 2a 20 64 72 6f 70 20 73 6f        ** drop so
1650: 20 74 68 65 20 74 72 69 67 67 65 72 20 63 61 6e   the trigger can
1660: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 2e 20  not be dropped. 
1670: 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
1680: 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 22 6f 72   an.      ** "or
1690: 70 68 61 6e 65 64 20 74 72 69 67 67 65 72 22 20  phaned trigger" 
16a0: 2d 20 61 20 74 72 69 67 67 65 72 20 77 68 6f 73  - a trigger whos
16b0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 74 61 62  e associated tab
16c0: 6c 65 20 69 73 20 6d 69 73 73 69 6e 67 2e 0a 20  le is missing.. 
16d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 62       */.      db
16e0: 2d 3e 69 6e 69 74 2e 6f 72 70 68 61 6e 54 72 69  ->init.orphanTri
16f0: 67 67 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  gger = 1;.    }.
1700: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
1710: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
1720: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
1730: 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
1740: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1750: 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74  e, "cannot creat
1760: 65 20 74 72 69 67 67 65 72 73 20 6f 6e 20 76 69  e triggers on vi
1770: 72 74 75 61 6c 20 74 61 62 6c 65 73 22 29 3b 0a  rtual tables");.
1780: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
1790: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
17a0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
17b0: 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20  he trigger name 
17c0: 69 73 20 6e 6f 74 20 72 65 73 65 72 76 65 64 20  is not reserved 
17d0: 61 6e 64 20 74 68 61 74 20 6e 6f 20 74 72 69 67  and that no trig
17e0: 67 65 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ger of the.  ** 
17f0: 73 70 65 63 69 66 69 65 64 20 6e 61 6d 65 20 65  specified name e
1800: 78 69 73 74 73 20 2a 2f 0a 20 20 7a 4e 61 6d 65  xists */.  zName
1810: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1820: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
1830: 65 29 3b 0a 20 20 69 66 28 20 21 7a 4e 61 6d 65  e);.  if( !zName
1840: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73   || SQLITE_OK!=s
1850: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
1860: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
1870: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
1880: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1890: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
18a0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 28 64 62  te3HashFind(&(db
18b0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
18c0: 6d 61 2d 3e 74 72 69 67 48 61 73 68 29 2c 0a 20  ma->trigHash),. 
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 73 71 6c 69       zName, sqli
18f0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
1900: 65 29 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21  e)) ){.    if( !
1910: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  noErr ){.      s
1920: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1930: 50 61 72 73 65 2c 20 22 74 72 69 67 67 65 72 20  Parse, "trigger 
1940: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
1950: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
1960: 7d 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  }.    goto trigg
1970: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
1980: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 63 72 65  .  /* Do not cre
1990: 61 74 65 20 61 20 74 72 69 67 67 65 72 20 6f 6e  ate a trigger on
19a0: 20 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20   a system table 
19b0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
19c0: 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
19d0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
19e0: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71   7)==0 ){.    sq
19f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a00: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72  arse, "cannot cr
1a10: 65 61 74 65 20 74 72 69 67 67 65 72 20 6f 6e 20  eate trigger on 
1a20: 73 79 73 74 65 6d 20 74 61 62 6c 65 22 29 3b 0a  system table");.
1a30: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
1a40: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69  ++;.    goto tri
1a50: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
1a60: 7d 0a 0a 20 20 2f 2a 20 49 4e 53 54 45 41 44 20  }..  /* INSTEAD 
1a70: 6f 66 20 74 72 69 67 67 65 72 73 20 61 72 65 20  of triggers are 
1a80: 6f 6e 6c 79 20 66 6f 72 20 76 69 65 77 73 20 61  only for views a
1a90: 6e 64 20 76 69 65 77 73 20 6f 6e 6c 79 20 73 75  nd views only su
1aa0: 70 70 6f 72 74 20 49 4e 53 54 45 41 44 0a 20 20  pport INSTEAD.  
1ab0: 2a 2a 20 6f 66 20 74 72 69 67 67 65 72 73 2e 0a  ** of triggers..
1ac0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d    */.  if( pTab-
1ad0: 3e 70 53 65 6c 65 63 74 20 26 26 20 74 72 5f 74  >pSelect && tr_t
1ae0: 6d 21 3d 54 4b 5f 49 4e 53 54 45 41 44 20 29 7b  m!=TK_INSTEAD ){
1af0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1b00: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
1b10: 6e 6e 6f 74 20 63 72 65 61 74 65 20 25 73 20 74  nnot create %s t
1b20: 72 69 67 67 65 72 20 6f 6e 20 76 69 65 77 3a 20  rigger on view: 
1b30: 25 53 22 2c 20 0a 20 20 20 20 20 20 20 20 28 74  %S", .        (t
1b40: 72 5f 74 6d 20 3d 3d 20 54 4b 5f 42 45 46 4f 52  r_tm == TK_BEFOR
1b50: 45 29 3f 22 42 45 46 4f 52 45 22 3a 22 41 46 54  E)?"BEFORE":"AFT
1b60: 45 52 22 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c  ER", pTableName,
1b70: 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72   0);.    goto tr
1b80: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
1b90: 20 7d 0a 20 20 69 66 28 20 21 70 54 61 62 2d 3e   }.  if( !pTab->
1ba0: 70 53 65 6c 65 63 74 20 26 26 20 74 72 5f 74 6d  pSelect && tr_tm
1bb0: 3d 3d 54 4b 5f 49 4e 53 54 45 41 44 20 29 7b 0a  ==TK_INSTEAD ){.
1bc0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1bd0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
1be0: 6e 6f 74 20 63 72 65 61 74 65 20 49 4e 53 54 45  not create INSTE
1bf0: 41 44 20 4f 46 22 0a 20 20 20 20 20 20 20 20 22  AD OF".        "
1c00: 20 74 72 69 67 67 65 72 20 6f 6e 20 74 61 62 6c   trigger on tabl
1c10: 65 3a 20 25 53 22 2c 20 70 54 61 62 6c 65 4e 61  e: %S", pTableNa
1c20: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  me, 0);.    goto
1c30: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1c40: 3b 0a 20 20 7d 0a 20 20 69 54 61 62 44 62 20 3d  ;.  }.  iTabDb =
1c50: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
1c60: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
1c70: 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
1c80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1c90: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
1ca0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
1cb0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
1cc0: 49 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73 74  IGGER;.    const
1cd0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
1ce0: 3e 61 44 62 5b 69 54 61 62 44 62 5d 2e 7a 4e 61  >aDb[iTabDb].zNa
1cf0: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
1d00: 61 72 20 2a 7a 44 62 54 72 69 67 20 3d 20 69 73  ar *zDbTrig = is
1d10: 54 65 6d 70 20 3f 20 64 62 2d 3e 61 44 62 5b 31  Temp ? db->aDb[1
1d20: 5d 2e 7a 4e 61 6d 65 20 3a 20 7a 44 62 3b 0a 20  ].zName : zDb;. 
1d30: 20 20 20 69 66 28 20 69 54 61 62 44 62 3d 3d 31     if( iTabDb==1
1d40: 20 7c 7c 20 69 73 54 65 6d 70 20 29 20 63 6f 64   || isTemp ) cod
1d50: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
1d60: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a  E_TEMP_TRIGGER;.
1d70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
1d80: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1d90: 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 70 54   code, zName, pT
1da0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 54 72  ab->zName, zDbTr
1db0: 69 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ig) ){.      got
1dc0: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1dd0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
1de0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1df0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1e00: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
1e10: 54 41 42 4c 45 28 69 54 61 62 44 62 29 2c 30 2c  TABLE(iTabDb),0,
1e20: 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
1e30: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1e40: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  p;.    }.  }.#en
1e50: 64 69 66 0a 0a 20 20 2f 2a 20 49 4e 53 54 45 41  dif..  /* INSTEA
1e60: 44 20 4f 46 20 74 72 69 67 67 65 72 73 20 63 61  D OF triggers ca
1e70: 6e 20 6f 6e 6c 79 20 61 70 70 65 61 72 20 6f 6e  n only appear on
1e80: 20 76 69 65 77 73 20 61 6e 64 20 42 45 46 4f 52   views and BEFOR
1e90: 45 20 74 72 69 67 67 65 72 73 0a 20 20 2a 2a 20  E triggers.  ** 
1ea0: 63 61 6e 6e 6f 74 20 61 70 70 65 61 72 20 6f 6e  cannot appear on
1eb0: 20 76 69 65 77 73 2e 20 20 53 6f 20 77 65 20 6d   views.  So we m
1ec0: 69 67 68 74 20 61 73 20 77 65 6c 6c 20 74 72 61  ight as well tra
1ed0: 6e 73 6c 61 74 65 20 65 76 65 72 79 0a 20 20 2a  nslate every.  *
1ee0: 2a 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69  * INSTEAD OF tri
1ef0: 67 67 65 72 20 69 6e 74 6f 20 61 20 42 45 46 4f  gger into a BEFO
1f00: 52 45 20 74 72 69 67 67 65 72 2e 20 20 49 74 20  RE trigger.  It 
1f10: 73 69 6d 70 6c 69 66 69 65 73 20 63 6f 64 65 0a  simplifies code.
1f20: 20 20 2a 2a 20 65 6c 73 65 77 68 65 72 65 2e 0a    ** elsewhere..
1f30: 20 20 2a 2f 0a 20 20 69 66 20 28 74 72 5f 74 6d    */.  if (tr_tm
1f40: 20 3d 3d 20 54 4b 5f 49 4e 53 54 45 41 44 29 7b   == TK_INSTEAD){
1f50: 0a 20 20 20 20 74 72 5f 74 6d 20 3d 20 54 4b 5f  .    tr_tm = TK_
1f60: 42 45 46 4f 52 45 3b 0a 20 20 7d 0a 0a 20 20 2f  BEFORE;.  }..  /
1f70: 2a 20 42 75 69 6c 64 20 74 68 65 20 54 72 69 67  * Build the Trig
1f80: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1f90: 70 54 72 69 67 67 65 72 20 3d 20 28 54 72 69 67  pTrigger = (Trig
1fa0: 67 65 72 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  ger*)sqlite3DbMa
1fb0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1fc0: 65 6f 66 28 54 72 69 67 67 65 72 29 29 3b 0a 20  eof(Trigger));. 
1fd0: 20 69 66 28 20 70 54 72 69 67 67 65 72 3d 3d 30   if( pTrigger==0
1fe0: 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f   ) goto trigger_
1ff0: 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 72 69 67  cleanup;.  pTrig
2000: 67 65 72 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ger->zName = zNa
2010: 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  me;.  zName = 0;
2020: 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62  .  pTrigger->tab
2030: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  le = sqlite3DbSt
2040: 72 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 4e  rDup(db, pTableN
2050: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 29  ame->a[0].zName)
2060: 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53  ;.  pTrigger->pS
2070: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
2080: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
2090: 70 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63  pTrigger->pTabSc
20a0: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
20b0: 68 65 6d 61 3b 0a 20 20 70 54 72 69 67 67 65 72  hema;.  pTrigger
20c0: 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20  ->op = (u8)op;. 
20d0: 20 70 54 72 69 67 67 65 72 2d 3e 74 72 5f 74 6d   pTrigger->tr_tm
20e0: 20 3d 20 74 72 5f 74 6d 3d 3d 54 4b 5f 42 45 46   = tr_tm==TK_BEF
20f0: 4f 52 45 20 3f 20 54 52 49 47 47 45 52 5f 42 45  ORE ? TRIGGER_BE
2100: 46 4f 52 45 20 3a 20 54 52 49 47 47 45 52 5f 41  FORE : TRIGGER_A
2110: 46 54 45 52 3b 0a 20 20 70 54 72 69 67 67 65 72  FTER;.  pTrigger
2120: 2d 3e 70 57 68 65 6e 20 3d 20 73 71 6c 69 74 65  ->pWhen = sqlite
2130: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68  3ExprDup(db, pWh
2140: 65 6e 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  en, EXPRDUP_REDU
2150: 43 45 29 3b 0a 20 20 70 54 72 69 67 67 65 72 2d  CE);.  pTrigger-
2160: 3e 70 43 6f 6c 75 6d 6e 73 20 3d 20 73 71 6c 69  >pColumns = sqli
2170: 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c  te3IdListDup(db,
2180: 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 61 73   pColumns);.  as
2190: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
21a0: 65 77 54 72 69 67 67 65 72 3d 3d 30 20 29 3b 0a  ewTrigger==0 );.
21b0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72    pParse->pNewTr
21c0: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
21d0: 3b 0a 0a 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  ;..trigger_clean
21e0: 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  up:.  sqlite3DbF
21f0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
2200: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
2210: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
2220: 65 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  eName);.  sqlite
2230: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
2240: 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73  , pColumns);.  s
2250: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2260: 28 64 62 2c 20 70 57 68 65 6e 29 3b 0a 20 20 69  (db, pWhen);.  i
2270: 66 28 20 21 70 50 61 72 73 65 2d 3e 70 4e 65 77  f( !pParse->pNew
2280: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 73  Trigger ){.    s
2290: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
22a0: 67 65 72 28 64 62 2c 20 70 54 72 69 67 67 65 72  ger(db, pTrigger
22b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22c0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
22d0: 70 4e 65 77 54 72 69 67 67 65 72 3d 3d 70 54 72  pNewTrigger==pTr
22e0: 69 67 67 65 72 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  igger );.  }.}..
22f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2300: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
2310: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 74 72  er all of the tr
2320: 69 67 67 65 72 20 61 63 74 69 6f 6e 73 20 68 61  igger actions ha
2330: 76 65 20 62 65 65 6e 20 70 61 72 73 65 64 0a 2a  ve been parsed.*
2340: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
2350: 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 63 65  mplete the proce
2360: 73 73 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 74  ss of building t
2370: 68 65 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 76  he trigger..*/.v
2380: 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73  oid sqlite3Finis
2390: 68 54 72 69 67 67 65 72 28 0a 20 20 50 61 72 73  hTrigger(.  Pars
23a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
23b0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
23c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67  ntext */.  Trigg
23d0: 65 72 53 74 65 70 20 2a 70 53 74 65 70 4c 69 73  erStep *pStepLis
23e0: 74 2c 20 2f 2a 20 54 68 65 20 74 72 69 67 67 65  t, /* The trigge
23f0: 72 65 64 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20  red program */. 
2400: 20 54 6f 6b 65 6e 20 2a 70 41 6c 6c 20 20 20 20   Token *pAll    
2410: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65           /* Toke
2420: 6e 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  n that describes
2430: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 43 52   the complete CR
2440: 45 41 54 45 20 54 52 49 47 47 45 52 20 2a 2f 0a  EATE TRIGGER */.
2450: 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54  ){.  Trigger *pT
2460: 72 69 67 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  rig = pParse->pN
2470: 65 77 54 72 69 67 67 65 72 3b 20 20 20 2f 2a 20  ewTrigger;   /* 
2480: 54 72 69 67 67 65 72 20 62 65 69 6e 67 20 66 69  Trigger being fi
2490: 6e 69 73 68 65 64 20 2a 2f 0a 20 20 63 68 61 72  nished */.  char
24a0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
24d0: 72 69 67 67 65 72 20 2a 2f 0a 20 20 73 71 6c 69  rigger */.  sqli
24e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
24f0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
2500: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2510: 61 73 65 20 2a 2f 0a 20 20 44 62 46 69 78 65 72  ase */.  DbFixer
2520: 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 20 20   sFix;          
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 2f 2a 20 46 69 78 65 72 20 6f 62 6a 65 63 74   /* Fixer object
2550: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2580: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   Database contai
2590: 6e 69 6e 67 20 74 68 65 20 74 72 69 67 67 65 72  ning the trigger
25a0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 6e 61 6d 65   */.  Token name
25b0: 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 20  Token;          
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d0: 20 54 72 69 67 67 65 72 20 6e 61 6d 65 20 66 6f   Trigger name fo
25e0: 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e  r error reportin
25f0: 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 2d 3e  g */..  pParse->
2600: 70 4e 65 77 54 72 69 67 67 65 72 20 3d 20 30 3b  pNewTrigger = 0;
2610: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2620: 72 73 65 2d 3e 6e 45 72 72 29 20 7c 7c 20 21 70  rse->nErr) || !p
2630: 54 72 69 67 20 29 20 67 6f 74 6f 20 74 72 69 67  Trig ) goto trig
2640: 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75  gerfinish_cleanu
2650: 70 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 54 72  p;.  zName = pTr
2660: 69 67 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 44 62  ig->zName;.  iDb
2670: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
2680: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
2690: 64 62 2c 20 70 54 72 69 67 2d 3e 70 53 63 68 65  db, pTrig->pSche
26a0: 6d 61 29 3b 0a 20 20 70 54 72 69 67 2d 3e 73 74  ma);.  pTrig->st
26b0: 65 70 5f 6c 69 73 74 20 3d 20 70 53 74 65 70 4c  ep_list = pStepL
26c0: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  ist;.  while( pS
26d0: 74 65 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 70  tepList ){.    p
26e0: 53 74 65 70 4c 69 73 74 2d 3e 70 54 72 69 67 20  StepList->pTrig 
26f0: 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 70 53 74  = pTrig;.    pSt
2700: 65 70 4c 69 73 74 20 3d 20 70 53 74 65 70 4c 69  epList = pStepLi
2710: 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  st->pNext;.  }. 
2720: 20 6e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 3d 20 70   nameToken.z = p
2730: 54 72 69 67 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 6e  Trig->zName;.  n
2740: 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20 73 71 6c  ameToken.n = sql
2750: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 6e 61 6d  ite3Strlen30(nam
2760: 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 69 66 28  eToken.z);.  if(
2770: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
2780: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
2790: 44 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20 26  Db, "trigger", &
27a0: 6e 61 6d 65 54 6f 6b 65 6e 29 20 0a 20 20 20 20  nameToken) .    
27b0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
27c0: 46 69 78 54 72 69 67 67 65 72 53 74 65 70 28 26  FixTriggerStep(&
27d0: 73 46 69 78 2c 20 70 54 72 69 67 2d 3e 73 74 65  sFix, pTrig->ste
27e0: 70 5f 6c 69 73 74 29 20 29 7b 0a 20 20 20 20 67  p_list) ){.    g
27f0: 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69 73  oto triggerfinis
2800: 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  h_cleanup;.  }..
2810: 20 20 2f 2a 20 69 66 20 77 65 20 61 72 65 20 6e    /* if we are n
2820: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
2830: 0a 20 20 2a 2a 20 62 75 69 6c 64 20 74 68 65 20  .  ** build the 
2840: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 65 6e  sqlite_master en
2850: 74 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  try.  */.  if( !
2860: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
2870: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
2880: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20    char *z;..    
2890: 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  /* Make an entry
28a0: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
28b0: 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
28c0: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
28d0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
28e0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
28f0: 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69 73 68  to triggerfinish
2900: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 73 71  _cleanup;.    sq
2910: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
2920: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
2930: 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 7a 20   0, iDb);.    z 
2940: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
2950: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 41  up(db, (char*)pA
2960: 6c 6c 2d 3e 7a 2c 20 70 41 6c 6c 2d 3e 6e 29 3b  ll->z, pAll->n);
2970: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
2980: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
2990: 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
29a0: 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
29b0: 28 27 74 72 69 67 67 65 72 27 2c 25 51 2c 25 51  ('trigger',%Q,%Q
29c0: 2c 30 2c 27 43 52 45 41 54 45 20 54 52 49 47 47  ,0,'CREATE TRIGG
29d0: 45 52 20 25 71 27 29 22 2c 0a 20 20 20 20 20 20  ER %q')",.      
29e0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
29f0: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
2a00: 45 28 69 44 62 29 2c 20 7a 4e 61 6d 65 2c 0a 20  E(iDb), zName,. 
2a10: 20 20 20 20 20 20 70 54 72 69 67 2d 3e 74 61 62        pTrig->tab
2a20: 6c 65 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  le, z);.    sqli
2a30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
2a40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
2a50: 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
2a60: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
2a70: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2a80: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
2a90: 20 69 44 62 2c 20 30 2c 20 30 2c 20 73 71 6c 69   iDb, 0, 0, sqli
2aa0: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
2ab0: 20 20 20 20 64 62 2c 20 22 74 79 70 65 3d 27 74      db, "type='t
2ac0: 72 69 67 67 65 72 27 20 41 4e 44 20 6e 61 6d 65  rigger' AND name
2ad0: 3d 27 25 71 27 22 2c 20 7a 4e 61 6d 65 29 2c 20  ='%q'", zName), 
2ae0: 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29  P4_DYNAMIC.    )
2af0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d  ;.  }..  if( db-
2b00: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
2b10: 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 6e 6b    Trigger *pLink
2b20: 20 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 48 61   = pTrig;.    Ha
2b30: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d  sh *pHash = &db-
2b40: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
2b50: 61 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20  a->trigHash;.   
2b60: 20 70 54 72 69 67 20 3d 20 73 71 6c 69 74 65 33   pTrig = sqlite3
2b70: 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68  HashInsert(pHash
2b80: 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  , zName, sqlite3
2b90: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c  Strlen30(zName),
2ba0: 20 70 54 72 69 67 29 3b 0a 20 20 20 20 69 66 28   pTrig);.    if(
2bb0: 20 70 54 72 69 67 20 29 7b 0a 20 20 20 20 20 20   pTrig ){.      
2bc0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2bd0: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
2be0: 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 53 63 68 65  if( pLink->pSche
2bf0: 6d 61 3d 3d 70 4c 69 6e 6b 2d 3e 70 54 61 62 53  ma==pLink->pTabS
2c00: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 54  chema ){.      T
2c10: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
2c20: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
2c30: 33 53 74 72 6c 65 6e 33 30 28 70 4c 69 6e 6b 2d  3Strlen30(pLink-
2c40: 3e 74 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 70  >table);.      p
2c50: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Tab = sqlite3Has
2c60: 68 46 69 6e 64 28 26 70 4c 69 6e 6b 2d 3e 70 54  hFind(&pLink->pT
2c70: 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  abSchema->tblHas
2c80: 68 2c 20 70 4c 69 6e 6b 2d 3e 74 61 62 6c 65 2c  h, pLink->table,
2c90: 20 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   n);.      asser
2ca0: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
2cb0: 20 20 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74      pLink->pNext
2cc0: 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65   = pTab->pTrigge
2cd0: 72 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  r;.      pTab->p
2ce0: 54 72 69 67 67 65 72 20 3d 20 70 4c 69 6e 6b 3b  Trigger = pLink;
2cf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 74 72 69 67  .    }.  }..trig
2d00: 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75  gerfinish_cleanu
2d10: 70 3a 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  p:.  sqlite3Dele
2d20: 74 65 54 72 69 67 67 65 72 28 64 62 2c 20 70 54  teTrigger(db, pT
2d30: 72 69 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rig);.  assert( 
2d40: 21 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69  !pParse->pNewTri
2d50: 67 67 65 72 20 29 3b 0a 20 20 73 71 6c 69 74 65  gger );.  sqlite
2d60: 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74  3DeleteTriggerSt
2d70: 65 70 28 64 62 2c 20 70 53 74 65 70 4c 69 73 74  ep(db, pStepList
2d80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  );.}../*.** Turn
2d90: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2da0: 65 6e 74 20 28 74 68 61 74 20 74 68 65 20 70 53  ent (that the pS
2db0: 65 6c 65 63 74 20 70 61 72 61 6d 65 74 65 72 20  elect parameter 
2dc0: 70 6f 69 6e 74 73 20 74 6f 29 20 69 6e 74 6f 0a  points to) into.
2dd0: 2a 2a 20 61 20 74 72 69 67 67 65 72 20 73 74 65  ** a trigger ste
2de0: 70 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  p.  Return a poi
2df0: 6e 74 65 72 20 74 6f 20 61 20 54 72 69 67 67 65  nter to a Trigge
2e00: 72 53 74 65 70 20 73 74 72 75 63 74 75 72 65 2e  rStep structure.
2e10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
2e20: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
2e30: 74 69 6e 65 20 77 68 65 6e 20 69 74 20 66 69 6e  tine when it fin
2e40: 64 73 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ds a SELECT stat
2e50: 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62 6f 64 79  ement in.** body
2e60: 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20   of a TRIGGER.  
2e70: 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20  .*/.TriggerStep 
2e80: 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 53  *sqlite3TriggerS
2e90: 65 6c 65 63 74 53 74 65 70 28 73 71 6c 69 74 65  electStep(sqlite
2ea0: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
2eb0: 53 65 6c 65 63 74 29 7b 0a 20 20 54 72 69 67 67  Select){.  Trigg
2ec0: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72  erStep *pTrigger
2ed0: 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62  Step = sqlite3Db
2ee0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
2ef0: 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 65  izeof(TriggerSte
2f00: 70 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67  p));.  if( pTrig
2f10: 67 65 72 53 74 65 70 3d 3d 30 20 29 20 7b 0a 20  gerStep==0 ) {. 
2f20: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2f30: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
2f40: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ct);.    return 
2f50: 30 3b 0a 20 20 7d 0a 20 20 70 54 72 69 67 67 65  0;.  }.  pTrigge
2f60: 72 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53  rStep->op = TK_S
2f70: 45 4c 45 43 54 3b 0a 20 20 70 54 72 69 67 67 65  ELECT;.  pTrigge
2f80: 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d  rStep->pSelect =
2f90: 20 70 53 65 6c 65 63 74 3b 0a 20 20 70 54 72 69   pSelect;.  pTri
2fa0: 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66  ggerStep->orconf
2fb0: 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20   = OE_Default;. 
2fc0: 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72   return pTrigger
2fd0: 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Step;.}../*.** A
2fe0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f  llocate space to
2ff0: 20 68 6f 6c 64 20 61 20 6e 65 77 20 74 72 69 67   hold a new trig
3000: 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 61  ger step.  The a
3010: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 0a 2a  llocated space.*
3020: 2a 20 68 6f 6c 64 73 20 62 6f 74 68 20 74 68 65  * holds both the
3030: 20 54 72 69 67 67 65 72 53 74 65 70 20 6f 62 6a   TriggerStep obj
3040: 65 63 74 20 61 6e 64 20 74 68 65 20 54 72 69 67  ect and the Trig
3050: 67 65 72 53 74 65 70 2e 74 61 72 67 65 74 2e 7a  gerStep.target.z
3060: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49   string..**.** I
3070: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
3080: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
3090: 65 74 75 72 6e 65 64 20 61 6e 64 20 64 62 2d 3e  eturned and db->
30a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 69 73 20  mallocFailed is 
30b0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  set..*/.static T
30c0: 72 69 67 67 65 72 53 74 65 70 20 2a 74 72 69 67  riggerStep *trig
30d0: 67 65 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28  gerStepAllocate(
30e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3100: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
3110: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70  ction */.  u8 op
3120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3130: 20 20 20 20 20 20 20 2f 2a 20 54 72 69 67 67 65         /* Trigge
3140: 72 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 54 6f  r opcode */.  To
3150: 6b 65 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20 20  ken *pName      
3160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3170: 20 74 61 72 67 65 74 20 6e 61 6d 65 20 2a 2f 0a   target name */.
3180: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
3190: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a   *pTriggerStep;.
31a0: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 20  .  pTriggerStep 
31b0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
31c0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
31d0: 28 54 72 69 67 67 65 72 53 74 65 70 29 20 2b 20  (TriggerStep) + 
31e0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 69 66 28  pName->n);.  if(
31f0: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b   pTriggerStep ){
3200: 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
3210: 63 68 61 72 2a 29 26 70 54 72 69 67 67 65 72 53  char*)&pTriggerS
3220: 74 65 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  tep[1];.    memc
3230: 70 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  py(z, pName->z, 
3240: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 70  pName->n);.    p
3250: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72  TriggerStep->tar
3260: 67 65 74 2e 7a 20 3d 20 7a 3b 0a 20 20 20 20 70  get.z = z;.    p
3270: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72  TriggerStep->tar
3280: 67 65 74 2e 6e 20 3d 20 70 4e 61 6d 65 2d 3e 6e  get.n = pName->n
3290: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
32a0: 65 70 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 7d  ep->op = op;.  }
32b0: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67  .  return pTrigg
32c0: 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erStep;.}../*.**
32d0: 20 42 75 69 6c 64 20 61 20 74 72 69 67 67 65 72   Build a trigger
32e0: 20 73 74 65 70 20 6f 75 74 20 6f 66 20 61 6e 20   step out of an 
32f0: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
3300: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
3310: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65  ter.** to the ne
3320: 77 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 0a  w trigger step..
3330: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
3340: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
3350: 69 6e 65 20 77 68 65 6e 20 69 74 20 73 65 65 73  ine when it sees
3360: 20 61 6e 20 49 4e 53 45 52 54 20 69 6e 73 69 64   an INSERT insid
3370: 65 20 74 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66  e the.** body of
3380: 20 61 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 54   a trigger..*/.T
3390: 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69  riggerStep *sqli
33a0: 74 65 33 54 72 69 67 67 65 72 49 6e 73 65 72 74  te3TriggerInsert
33b0: 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 20  Step(.  sqlite3 
33c0: 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  *db,        /* T
33d0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
33e0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
33f0: 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20  n *pTableName,  
3400: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3410: 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
3420: 77 65 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 49  we insert */.  I
3430: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20  dList *pColumn, 
3440: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
3450: 6c 75 6d 6e 73 20 69 6e 20 70 54 61 62 6c 65 4e  lumns in pTableN
3460: 61 6d 65 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ame to insert in
3470: 74 6f 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  to */.  ExprList
3480: 20 2a 70 45 4c 69 73 74 2c 20 20 20 2f 2a 20 54   *pEList,   /* T
3490: 68 65 20 56 41 4c 55 45 20 63 6c 61 75 73 65 3a  he VALUE clause:
34a0: 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
34b0: 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  s to be inserted
34c0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
34d0: 65 6c 65 63 74 2c 20 20 20 20 2f 2a 20 41 20 53  elect,    /* A S
34e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
34f0: 74 68 61 74 20 73 75 70 70 6c 69 65 73 20 76 61  that supplies va
3500: 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 6f 72 63  lues */.  u8 orc
3510: 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a  onf           /*
3520: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c   The conflict al
3530: 67 6f 72 69 74 68 6d 20 28 4f 45 5f 41 62 6f 72  gorithm (OE_Abor
3540: 74 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 65  t, OE_Replace, e
3550: 74 63 2e 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69  tc.) */.){.  Tri
3560: 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67  ggerStep *pTrigg
3570: 65 72 53 74 65 70 3b 0a 0a 20 20 61 73 73 65 72  erStep;..  asser
3580: 74 28 70 45 4c 69 73 74 20 3d 3d 20 30 20 7c 7c  t(pEList == 0 ||
3590: 20 70 53 65 6c 65 63 74 20 3d 3d 20 30 29 3b 0a   pSelect == 0);.
35a0: 20 20 61 73 73 65 72 74 28 70 45 4c 69 73 74 20    assert(pEList 
35b0: 21 3d 20 30 20 7c 7c 20 70 53 65 6c 65 63 74 20  != 0 || pSelect 
35c0: 21 3d 20 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  != 0 || db->mall
35d0: 6f 63 46 61 69 6c 65 64 29 3b 0a 0a 20 20 70 54  ocFailed);..  pT
35e0: 72 69 67 67 65 72 53 74 65 70 20 3d 20 74 72 69  riggerStep = tri
35f0: 67 67 65 72 53 74 65 70 41 6c 6c 6f 63 61 74 65  ggerStepAllocate
3600: 28 64 62 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20  (db, TK_INSERT, 
3610: 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69  pTableName);.  i
3620: 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70 20  f( pTriggerStep 
3630: 29 7b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53  ){.    pTriggerS
3640: 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tep->pSelect = s
3650: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
3660: 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50  db, pSelect, EXP
3670: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
3680: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3690: 70 49 64 4c 69 73 74 20 3d 20 70 43 6f 6c 75 6d  pIdList = pColum
36a0: 6e 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53  n;.    pTriggerS
36b0: 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d  tep->pExprList =
36c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
36d0: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20  Dup(db, pEList, 
36e0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
36f0: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
3700: 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f  p->orconf = orco
3710: 6e 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nf;.  }else{.   
3720: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
3730: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e  lete(db, pColumn
3740: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
3750: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
3760: 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 71  b, pEList);.  sq
3770: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
3780: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
3790: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67  .  return pTrigg
37a0: 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erStep;.}../*.**
37b0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69   Construct a tri
37c0: 67 67 65 72 20 73 74 65 70 20 74 68 61 74 20 69  gger step that i
37d0: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 55 50 44  mplements an UPD
37e0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ATE statement an
37f0: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  d return.** a po
3800: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 74 72  inter to that tr
3810: 69 67 67 65 72 20 73 74 65 70 2e 20 20 54 68 65  igger step.  The
3820: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
3830: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
3840: 69 74 0a 2a 2a 20 73 65 65 73 20 61 6e 20 55 50  it.** sees an UP
3850: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69  DATE statement i
3860: 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f  nside the body o
3870: 66 20 61 20 43 52 45 41 54 45 20 54 52 49 47 47  f a CREATE TRIGG
3880: 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74  ER..*/.TriggerSt
3890: 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67  ep *sqlite3Trigg
38a0: 65 72 55 70 64 61 74 65 53 74 65 70 28 0a 20 20  erUpdateStep(.  
38b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
38c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
38d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
38e0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
38f0: 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  leName,   /* Nam
3900: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
3910: 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a  o be updated */.
3920: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
3930: 73 74 2c 20 20 20 20 2f 2a 20 54 68 65 20 53 45  st,    /* The SE
3940: 54 20 63 6c 61 75 73 65 3a 20 6c 69 73 74 20 6f  T clause: list o
3950: 66 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 6e 65 77  f column and new
3960: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 45 78 70   values */.  Exp
3970: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
3980: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
3990: 6c 61 75 73 65 20 2a 2f 0a 20 20 75 38 20 6f 72  lause */.  u8 or
39a0: 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 20  conf            
39b0: 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20  /* The conflict 
39c0: 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41  algorithm. (OE_A
39d0: 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
39e0: 20 65 74 63 29 20 2a 2f 0a 29 7b 0a 20 20 54 72   etc) */.){.  Tr
39f0: 69 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67  iggerStep *pTrig
3a00: 67 65 72 53 74 65 70 3b 0a 0a 20 20 70 54 72 69  gerStep;..  pTri
3a10: 67 67 65 72 53 74 65 70 20 3d 20 74 72 69 67 67  ggerStep = trigg
3a20: 65 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64  erStepAllocate(d
3a30: 62 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 54  b, TK_UPDATE, pT
3a40: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ableName);.  if(
3a50: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b   pTriggerStep ){
3a60: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
3a70: 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 73  p->pExprList = s
3a80: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
3a90: 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 45 58  p(db, pEList, EX
3aa0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
3ab0: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
3ac0: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3ad0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68  3ExprDup(db, pWh
3ae0: 65 72 65 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ere, EXPRDUP_RED
3af0: 55 43 45 29 3b 0a 20 20 20 20 70 54 72 69 67 67  UCE);.    pTrigg
3b00: 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d  erStep->orconf =
3b10: 20 6f 72 63 6f 6e 66 3b 0a 20 20 7d 0a 20 20 73   orconf;.  }.  s
3b20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
3b30: 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29  lete(db, pEList)
3b40: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
3b50: 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65 72 65  elete(db, pWhere
3b60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69  );.  return pTri
3b70: 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a  ggerStep;.}../*.
3b80: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 74  ** Construct a t
3b90: 72 69 67 67 65 72 20 73 74 65 70 20 74 68 61 74  rigger step that
3ba0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 44 45   implements a DE
3bb0: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61  LETE statement a
3bc0: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70  nd return.** a p
3bd0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 74  ointer to that t
3be0: 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 54 68  rigger step.  Th
3bf0: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
3c00: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3c10: 20 69 74 0a 2a 2a 20 73 65 65 73 20 61 20 44 45   it.** sees a DE
3c20: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69  LETE statement i
3c30: 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f  nside the body o
3c40: 66 20 61 20 43 52 45 41 54 45 20 54 52 49 47 47  f a CREATE TRIGG
3c50: 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74  ER..*/.TriggerSt
3c60: 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67  ep *sqlite3Trigg
3c70: 65 72 44 65 6c 65 74 65 53 74 65 70 28 0a 20 20  erDeleteStep(.  
3c80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
3c90: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
3ca0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
3cb0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
3cc0: 65 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54  eName,      /* T
3cd0: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  he table from wh
3ce0: 69 63 68 20 72 6f 77 73 20 61 72 65 20 64 65 6c  ich rows are del
3cf0: 65 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  eted */.  Expr *
3d00: 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20  pWhere          
3d10: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
3d20: 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 54 72  lause */.){.  Tr
3d30: 69 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67  iggerStep *pTrig
3d40: 67 65 72 53 74 65 70 3b 0a 0a 20 20 70 54 72 69  gerStep;..  pTri
3d50: 67 67 65 72 53 74 65 70 20 3d 20 74 72 69 67 67  ggerStep = trigg
3d60: 65 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64  erStepAllocate(d
3d70: 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 70 54  b, TK_DELETE, pT
3d80: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ableName);.  if(
3d90: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b   pTriggerStep ){
3da0: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
3db0: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
3dc0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
3dd0: 57 68 65 72 65 2c 20 45 58 50 52 44 55 50 5f 52  Where, EXPRDUP_R
3de0: 45 44 55 43 45 29 3b 0a 20 20 20 20 70 54 72 69  EDUCE);.    pTri
3df0: 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66  ggerStep->orconf
3e00: 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20   = OE_Default;. 
3e10: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
3e20: 44 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65 72  Delete(db, pWher
3e30: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 72  e);.  return pTr
3e40: 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a  iggerStep;.}../*
3e50: 20 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79   .** Recursively
3e60: 20 64 65 6c 65 74 65 20 61 20 54 72 69 67 67 65   delete a Trigge
3e70: 72 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 76  r structure.*/.v
3e80: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
3e90: 65 54 72 69 67 67 65 72 28 73 71 6c 69 74 65 33  eTrigger(sqlite3
3ea0: 20 2a 64 62 2c 20 54 72 69 67 67 65 72 20 2a 70   *db, Trigger *p
3eb0: 54 72 69 67 67 65 72 29 7b 0a 20 20 69 66 28 20  Trigger){.  if( 
3ec0: 70 54 72 69 67 67 65 72 3d 3d 30 20 29 20 72 65  pTrigger==0 ) re
3ed0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 44  turn;.  sqlite3D
3ee0: 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70  eleteTriggerStep
3ef0: 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 73  (db, pTrigger->s
3f00: 74 65 70 5f 6c 69 73 74 29 3b 0a 20 20 73 71 6c  tep_list);.  sql
3f10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3f20: 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 29 3b  Trigger->zName);
3f30: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3f40: 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 74  (db, pTrigger->t
3f50: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  able);.  sqlite3
3f60: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3f70: 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b  Trigger->pWhen);
3f80: 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
3f90: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 72 69 67  Delete(db, pTrig
3fa0: 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 29 3b 0a  ger->pColumns);.
3fb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3fc0: 64 62 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 7d  db, pTrigger);.}
3fd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3fe0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
3ff0: 74 6f 20 64 72 6f 70 20 61 20 74 72 69 67 67 65  to drop a trigge
4000: 72 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  r from the datab
4010: 61 73 65 20 73 63 68 65 6d 61 2e 20 0a 2a 2a 0a  ase schema. .**.
4020: 2a 2a 20 54 68 69 73 20 6d 61 79 20 62 65 20 63  ** This may be c
4030: 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 66  alled directly f
4040: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 20 61  rom the parser a
4050: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 69 64 65  nd therefore ide
4060: 6e 74 69 66 69 65 73 0a 2a 2a 20 74 68 65 20 74  ntifies.** the t
4070: 72 69 67 67 65 72 20 62 79 20 6e 61 6d 65 2e 20  rigger by name. 
4080: 20 54 68 65 20 73 71 6c 69 74 65 33 44 72 6f 70   The sqlite3Drop
4090: 54 72 69 67 67 65 72 50 74 72 28 29 20 72 6f 75  TriggerPtr() rou
40a0: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 0a 2a 2a  tine does the.**
40b0: 20 73 61 6d 65 20 6a 6f 62 20 61 73 20 74 68 69   same job as thi
40c0: 73 20 72 6f 75 74 69 6e 65 20 65 78 63 65 70 74  s routine except
40d0: 20 69 74 20 74 61 6b 65 73 20 61 20 70 6f 69 6e   it takes a poin
40e0: 74 65 72 20 74 6f 20 74 68 65 20 74 72 69 67 67  ter to the trigg
40f0: 65 72 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  er.** instead of
4100: 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d   the trigger nam
4110: 65 2e 0a 2a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  e..**/.void sqli
4120: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28 50  te3DropTrigger(P
4130: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
4140: 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
4150: 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 72 69 67  t noErr){.  Trig
4160: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
4170: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  0;.  int i;.  co
4180: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
4190: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
41a0: 6d 65 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  me;.  int nName;
41b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
41c0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
41d0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
41e0: 69 6c 65 64 20 29 20 67 6f 74 6f 20 64 72 6f 70  iled ) goto drop
41f0: 5f 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70  _trigger_cleanup
4200: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
4210: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
4220: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
4230: 20 20 20 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72      goto drop_tr
4240: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
4250: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e   }..  assert( pN
4260: 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
4270: 20 20 7a 44 62 20 3d 20 70 4e 61 6d 65 2d 3e 61    zDb = pName->a
4280: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20  [0].zDatabase;. 
4290: 20 7a 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e   zName = pName->
42a0: 61 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 6e 4e  a[0].zName;.  nN
42b0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
42c0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
42d0: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
42e0: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
42f0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
4300: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
4310: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
4320: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
4330: 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73      if( zDb && s
4340: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62  qlite3StrICmp(db
4350: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  ->aDb[j].zName, 
4360: 7a 44 62 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  zDb) ) continue;
4370: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
4380: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
4390: 26 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  &(db->aDb[j].pSc
43a0: 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 29 2c  hema->trigHash),
43b0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
43c0: 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72      if( pTrigger
43d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
43e0: 69 66 28 20 21 70 54 72 69 67 67 65 72 20 29 7b  if( !pTrigger ){
43f0: 0a 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20  .    if( !noErr 
4400: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4410: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4420: 20 22 6e 6f 20 73 75 63 68 20 74 72 69 67 67 65   "no such trigge
4430: 72 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  r: %S", pName, 0
4440: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
4450: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
4460: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 64   = 1;.    goto d
4470: 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61  rop_trigger_clea
4480: 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nup;.  }.  sqlit
4490: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
44a0: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
44b0: 72 29 3b 0a 0a 64 72 6f 70 5f 74 72 69 67 67 65  r);..drop_trigge
44c0: 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  r_cleanup:.  sql
44d0: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
44e0: 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
44f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
4500: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
4510: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  able structure f
4520: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  or the table tha
4530: 74 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69  t a trigger.** i
4540: 73 20 73 65 74 20 6f 6e 2e 0a 2a 2f 0a 73 74 61  s set on..*/.sta
4550: 74 69 63 20 54 61 62 6c 65 20 2a 74 61 62 6c 65  tic Table *table
4560: 4f 66 54 72 69 67 67 65 72 28 54 72 69 67 67 65  OfTrigger(Trigge
4570: 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 20  r *pTrigger){.  
4580: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
4590: 74 72 6c 65 6e 33 30 28 70 54 72 69 67 67 65 72  trlen30(pTrigger
45a0: 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 72 65 74 75  ->table);.  retu
45b0: 72 6e 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  rn sqlite3HashFi
45c0: 6e 64 28 26 70 54 72 69 67 67 65 72 2d 3e 70 54  nd(&pTrigger->pT
45d0: 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  abSchema->tblHas
45e0: 68 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62  h, pTrigger->tab
45f0: 6c 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  le, n);.}.../*.*
4600: 2a 20 44 72 6f 70 20 61 20 74 72 69 67 67 65 72  * Drop a trigger
4610: 20 67 69 76 65 6e 20 61 20 70 6f 69 6e 74 65 72   given a pointer
4620: 20 74 6f 20 74 68 61 74 20 74 72 69 67 67 65 72   to that trigger
4630: 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
4640: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
4650: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4660: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
4670: 72 29 7b 0a 20 20 54 61 62 6c 65 20 20 20 2a 70  r){.  Table   *p
4680: 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76  Table;.  Vdbe *v
4690: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
46a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
46b0: 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 44 62 20  int iDb;..  iDb 
46c0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
46d0: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
46e0: 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  b, pTrigger->pSc
46f0: 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
4700: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
4710: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 70 54 61 62  b->nDb );.  pTab
4720: 6c 65 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 67  le = tableOfTrig
4730: 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20  ger(pTrigger);. 
4740: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
4750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
4760: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ble->pSchema==pT
4770: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20  rigger->pSchema 
4780: 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 23 69 66  || iDb==1 );.#if
4790: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
47a0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
47b0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
47c0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  = SQLITE_DROP_TR
47d0: 49 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73 74  IGGER;.    const
47e0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
47f0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
4800: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
4810: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
4820: 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
4830: 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 64 65  f( iDb==1 ) code
4840: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
4850: 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20  EMP_TRIGGER;.   
4860: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
4870: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
4880: 64 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e  de, pTrigger->zN
4890: 61 6d 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ame, pTable->zNa
48a0: 6d 65 2c 20 7a 44 62 29 20 7c 7c 0a 20 20 20 20  me, zDb) ||.    
48b0: 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65    sqlite3AuthChe
48c0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
48d0: 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
48e0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
48f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
4900: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
4910: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
4920: 20 64 65 73 74 72 6f 79 20 74 68 65 20 64 61 74   destroy the dat
4930: 61 62 61 73 65 20 72 65 63 6f 72 64 20 6f 66 20  abase record of 
4940: 74 68 65 20 74 72 69 67 67 65 72 2e 0a 20 20 2a  the trigger..  *
4950: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
4960: 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  le!=0 );.  if( (
4970: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
4980: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
4990: 7b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a  {.    int base;.
49a0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
49b0: 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70   VdbeOpList drop
49c0: 54 72 69 67 67 65 72 5b 5d 20 3d 20 7b 0a 20 20  Trigger[] = {.  
49d0: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
49e0: 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c       0, ADDR(9),
49f0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
4a00: 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20  _String8,    0, 
4a10: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  1,        0}, /*
4a20: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
4a30: 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20  _Column,     0, 
4a40: 31 2c 20 20 20 20 20 20 20 20 32 7d 2c 0a 20 20  1,        2},.  
4a50: 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20      { OP_Ne,    
4a60: 20 20 20 20 20 32 2c 20 41 44 44 52 28 38 29 2c       2, ADDR(8),
4a70: 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    1},.      { OP
4a80: 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20  _String8,    0, 
4a90: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  1,        0}, /*
4aa0: 20 34 3a 20 22 74 72 69 67 67 65 72 22 20 2a 2f   4: "trigger" */
4ab0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
4ac0: 6d 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  mn,     0, 0,   
4ad0: 20 20 20 20 20 32 7d 2c 0a 20 20 20 20 20 20 7b       2},.      {
4ae0: 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20   OP_Ne,         
4af0: 32 2c 20 41 44 44 52 28 38 29 2c 20 20 31 7d 2c  2, ADDR(8),  1},
4b00: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
4b10: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
4b20: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
4b30: 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
4b40: 30 2c 20 41 44 44 52 28 31 29 2c 20 20 30 7d 2c  0, ADDR(1),  0},
4b50: 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 8 */.    };.
4b60: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
4b70: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
4b80: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
4b90: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
4ba0: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
4bb0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 62 61  se, iDb);.    ba
4bc0: 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
4bd0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 20 41 72  AddOpList(v,  Ar
4be0: 72 61 79 53 69 7a 65 28 64 72 6f 70 54 72 69 67  raySize(dropTrig
4bf0: 67 65 72 29 2c 20 64 72 6f 70 54 72 69 67 67 65  ger), dropTrigge
4c00: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
4c10: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 62  dbeChangeP4(v, b
4c20: 61 73 65 2b 31 2c 20 70 54 72 69 67 67 65 72 2d  ase+1, pTrigger-
4c30: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
4c40: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4c50: 65 50 34 28 76 2c 20 62 61 73 65 2b 34 2c 20 22  eP4(v, base+4, "
4c60: 74 72 69 67 67 65 72 22 2c 20 50 34 5f 53 54 41  trigger", P4_STA
4c70: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
4c80: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
4c90: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
4ca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4cb0: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  2(v, OP_Close, 0
4cc0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4cd0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
4ce0: 50 5f 44 72 6f 70 54 72 69 67 67 65 72 2c 20 69  P_DropTrigger, i
4cf0: 44 62 2c 20 30 2c 20 30 2c 20 70 54 72 69 67 67  Db, 0, 0, pTrigg
4d00: 65 72 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  er->zName, 0);. 
4d10: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
4d20: 4d 65 6d 3c 33 20 29 7b 0a 20 20 20 20 20 20 70  Mem<3 ){.      p
4d30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b  Parse->nMem = 3;
4d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4d50: 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 20 74 72 69  .** Remove a tri
4d60: 67 67 65 72 20 66 72 6f 6d 20 74 68 65 20 68 61  gger from the ha
4d70: 73 68 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  sh tables of the
4d80: 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72   sqlite* pointer
4d90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4da0: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
4db0: 54 72 69 67 67 65 72 28 73 71 6c 69 74 65 33 20  Trigger(sqlite3 
4dc0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
4dd0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
4de0: 7b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  {.  Hash *pHash 
4df0: 3d 20 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  = &(db->aDb[iDb]
4e00: 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  .pSchema->trigHa
4e10: 73 68 29 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  sh);.  Trigger *
4e20: 70 54 72 69 67 67 65 72 3b 0a 20 20 70 54 72 69  pTrigger;.  pTri
4e30: 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 48 61  gger = sqlite3Ha
4e40: 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20  shInsert(pHash, 
4e50: 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  zName, sqlite3St
4e60: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30  rlen30(zName), 0
4e70: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
4e80: 70 54 72 69 67 67 65 72 29 20 29 7b 0a 20 20 20  pTrigger) ){.   
4e90: 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e 70   if( pTrigger->p
4ea0: 53 63 68 65 6d 61 3d 3d 70 54 72 69 67 67 65 72  Schema==pTrigger
4eb0: 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 29 7b 0a  ->pTabSchema ){.
4ec0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
4ed0: 62 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 67 67  b = tableOfTrigg
4ee0: 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20  er(pTrigger);.  
4ef0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 2a 70 70      Trigger **pp
4f00: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26  ;.      for(pp=&
4f10: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 20  pTab->pTrigger; 
4f20: 2a 70 70 21 3d 70 54 72 69 67 67 65 72 3b 20 70  *pp!=pTrigger; p
4f30: 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
4f40: 29 29 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20  ));.      *pp = 
4f50: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b 0a 20 20  (*pp)->pNext;.  
4f60: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
4f70: 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62 2c  eleteTrigger(db,
4f80: 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
4f90: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
4fa0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
4fb0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
4fc0: 70 45 4c 69 73 74 20 69 73 20 74 68 65 20 53 45  pEList is the SE
4fd0: 54 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55  T clause of an U
4fe0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
4ff0: 20 20 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a 20    Each entry.** 
5000: 69 6e 20 70 45 4c 69 73 74 20 69 73 20 6f 66 20  in pEList is of 
5010: 74 68 65 20 66 6f 72 6d 61 74 20 3c 69 64 3e 3d  the format <id>=
5020: 3c 65 78 70 72 3e 2e 20 20 49 66 20 61 6e 79 20  <expr>.  If any 
5030: 6f 66 20 74 68 65 20 65 6e 74 72 69 65 73 0a 2a  of the entries.*
5040: 2a 20 69 6e 20 70 45 4c 69 73 74 20 68 61 76 65  * in pEList have
5050: 20 61 6e 20 3c 69 64 3e 20 77 68 69 63 68 20 6d   an <id> which m
5060: 61 74 63 68 65 73 20 61 6e 20 69 64 65 6e 74 69  atches an identi
5070: 66 69 65 72 20 69 6e 20 70 49 64 4c 69 73 74 2c  fier in pIdList,
5080: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
5090: 54 52 55 45 2e 20 20 49 66 20 70 49 64 4c 69 73  TRUE.  If pIdLis
50a0: 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  t==NULL, then it
50b0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
50c0: 0a 2a 2a 20 77 69 6c 64 63 61 72 64 20 74 68 61  .** wildcard tha
50d0: 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68 69  t matches anythi
50e0: 6e 67 2e 20 20 4c 69 6b 65 77 69 73 65 20 69 66  ng.  Likewise if
50f0: 20 70 45 4c 69 73 74 3d 3d 4e 55 4c 4c 20 74 68   pEList==NULL th
5100: 65 6e 0a 2a 2a 20 69 74 20 6d 61 74 63 68 65 73  en.** it matches
5110: 20 61 6e 79 74 68 69 6e 67 20 73 6f 20 61 6c 77   anything so alw
5120: 61 79 73 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ays return true.
5130: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 6f    Return false o
5140: 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nly.** if there 
5150: 69 73 20 6e 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a  is no match..*/.
5160: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
5170: 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 49 64  ColumnOverlap(Id
5180: 4c 69 73 74 20 2a 70 49 64 4c 69 73 74 2c 20 45  List *pIdList, E
5190: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
51a0: 7b 0a 20 20 69 6e 74 20 65 3b 0a 20 20 69 66 28  {.  int e;.  if(
51b0: 20 70 49 64 4c 69 73 74 3d 3d 30 20 7c 7c 20 4e   pIdList==0 || N
51c0: 45 56 45 52 28 70 45 4c 69 73 74 3d 3d 30 29 20  EVER(pEList==0) 
51d0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f  ) return 1;.  fo
51e0: 72 28 65 3d 30 3b 20 65 3c 70 45 4c 69 73 74 2d  r(e=0; e<pEList-
51f0: 3e 6e 45 78 70 72 3b 20 65 2b 2b 29 7b 0a 20 20  >nExpr; e++){.  
5200: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
5210: 69 73 74 49 6e 64 65 78 28 70 49 64 4c 69 73 74  istIndex(pIdList
5220: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 65 5d 2e 7a  , pEList->a[e].z
5230: 4e 61 6d 65 29 3e 3d 30 20 29 20 72 65 74 75 72  Name)>=0 ) retur
5240: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
5250: 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n 0; .}../*.** R
5260: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
5270: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 6f 6e 20  all triggers on 
5280: 74 61 62 6c 65 20 70 54 61 62 20 69 66 20 74 68  table pTab if th
5290: 65 72 65 20 65 78 69 73 74 73 20 61 74 20 6c 65  ere exists at le
52a0: 61 73 74 0a 2a 2a 20 6f 6e 65 20 74 72 69 67 67  ast.** one trigg
52b0: 65 72 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  er that must be 
52c0: 66 69 72 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  fired when an op
52d0: 65 72 61 74 69 6f 6e 20 6f 66 20 74 79 70 65 20  eration of type 
52e0: 27 6f 70 27 20 69 73 20 0a 2a 2a 20 70 65 72 66  'op' is .** perf
52f0: 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 74 61 62  ormed on the tab
5300: 6c 65 2c 20 61 6e 64 2c 20 69 66 20 74 68 61 74  le, and, if that
5310: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
5320: 20 55 50 44 41 54 45 2c 20 69 66 20 61 74 0a 2a   UPDATE, if at.*
5330: 2a 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  * least one of t
5340: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 43  he columns in pC
5350: 68 61 6e 67 65 73 20 69 73 20 62 65 69 6e 67 20  hanges is being 
5360: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 54 72 69  modified..*/.Tri
5370: 67 67 65 72 20 2a 73 71 6c 69 74 65 33 54 72 69  gger *sqlite3Tri
5380: 67 67 65 72 73 45 78 69 73 74 28 0a 20 20 50 61  ggersExist(.  Pa
5390: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
53a0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
53b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
53c0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
53d0: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
53e0: 20 74 68 65 20 63 6f 6e 74 61 69 6e 73 20 74 68   the contains th
53f0: 65 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20  e triggers */.  
5400: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
5410: 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f          /* one o
5420: 66 20 54 4b 5f 44 45 4c 45 54 45 2c 20 54 4b 5f  f TK_DELETE, TK_
5430: 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50 44 41 54  INSERT, TK_UPDAT
5440: 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  E */.  ExprList 
5450: 2a 70 43 68 61 6e 67 65 73 2c 20 20 20 20 20 2f  *pChanges,     /
5460: 2a 20 43 6f 6c 75 6d 6e 73 20 74 68 61 74 20 63  * Columns that c
5470: 68 61 6e 67 65 20 69 6e 20 61 6e 20 55 50 44 41  hange in an UPDA
5480: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
5490: 20 20 69 6e 74 20 2a 70 4d 61 73 6b 20 20 20 20    int *pMask    
54a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
54b0: 3a 20 4d 61 73 6b 20 6f 66 20 54 52 49 47 47 45  : Mask of TRIGGE
54c0: 52 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52  R_BEFORE|TRIGGER
54d0: 5f 41 46 54 45 52 20 2a 2f 0a 29 7b 0a 20 20 69  _AFTER */.){.  i
54e0: 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 54  nt mask = 0;.  T
54f0: 72 69 67 67 65 72 20 2a 70 4c 69 73 74 20 3d 20  rigger *pList = 
5500: 30 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 3b  0;.  Trigger *p;
5510: 0a 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d  ..  if( (pParse-
5520: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
5530: 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65  ITE_EnableTrigge
5540: 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  r)!=0 ){.    pLi
5550: 73 74 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  st = sqlite3Trig
5560: 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  gerList(pParse, 
5570: 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pTab);.  }.  ass
5580: 65 72 74 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c  ert( pList==0 ||
5590: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
55a0: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ==0 );.  for(p=p
55b0: 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  List; p; p=p->pN
55c0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
55d0: 3e 6f 70 3d 3d 6f 70 20 26 26 20 63 68 65 63 6b  >op==op && check
55e0: 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 70 2d  ColumnOverlap(p-
55f0: 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70 43 68 61 6e  >pColumns, pChan
5600: 67 65 73 29 20 29 7b 0a 20 20 20 20 20 20 6d 61  ges) ){.      ma
5610: 73 6b 20 7c 3d 20 70 2d 3e 74 72 5f 74 6d 3b 0a  sk |= p->tr_tm;.
5620: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5630: 70 4d 61 73 6b 20 29 7b 0a 20 20 20 20 2a 70 4d  pMask ){.    *pM
5640: 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  ask = mask;.  }.
5650: 20 20 72 65 74 75 72 6e 20 28 6d 61 73 6b 20 3f    return (mask ?
5660: 20 70 4c 69 73 74 20 3a 20 30 29 3b 0a 7d 0a 0a   pList : 0);.}..
5670: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  /*.** Convert th
5680: 65 20 70 53 74 65 70 2d 3e 74 61 72 67 65 74 20  e pStep->target 
5690: 74 6f 6b 65 6e 20 69 6e 74 6f 20 61 20 53 72 63  token into a Src
56a0: 4c 69 73 74 20 61 6e 64 20 72 65 74 75 72 6e 20  List and return 
56b0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
56c0: 74 68 61 74 20 53 72 63 4c 69 73 74 2e 0a 2a 2a  that SrcList..**
56d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
56e0: 20 61 64 64 73 20 61 20 73 70 65 63 69 66 69 63   adds a specific
56f0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2c 20   database name, 
5700: 69 66 20 6e 65 65 64 65 64 2c 20 74 6f 20 74 68  if needed, to th
5710: 65 20 74 61 72 67 65 74 20 77 68 65 6e 0a 2a 2a  e target when.**
5720: 20 66 6f 72 6d 69 6e 67 20 74 68 65 20 53 72 63   forming the Src
5730: 4c 69 73 74 2e 20 20 54 68 69 73 20 70 72 65 76  List.  This prev
5740: 65 6e 74 73 20 61 20 74 72 69 67 67 65 72 20 69  ents a trigger i
5750: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
5760: 72 6f 6d 0a 2a 2a 20 72 65 66 65 72 72 69 6e 67  rom.** referring
5770: 20 74 6f 20 61 20 74 61 72 67 65 74 20 69 6e 20   to a target in 
5780: 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
5790: 2e 20 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  .  An exception 
57a0: 69 73 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 74  is when the.** t
57b0: 72 69 67 67 65 72 20 69 73 20 69 6e 20 54 45 4d  rigger is in TEM
57c0: 50 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  P in which case 
57d0: 69 74 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20  it can refer to 
57e0: 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
57f0: 73 65 20 69 74 0a 2a 2a 20 77 61 6e 74 73 2e 0a  se it.** wants..
5800: 2a 2f 0a 73 74 61 74 69 63 20 53 72 63 4c 69 73  */.static SrcLis
5810: 74 20 2a 74 61 72 67 65 74 53 72 63 4c 69 73 74  t *targetSrcList
5820: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5830: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
5840: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
5850: 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  */.  TriggerStep
5860: 20 2a 70 53 74 65 70 20 20 20 2f 2a 20 54 68 65   *pStep   /* The
5870: 20 74 72 69 67 67 65 72 20 63 6f 6e 74 61 69 6e   trigger contain
5880: 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 74  ing the target t
5890: 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  oken */.){.  int
58a0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
58b0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
58c0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 75 73  e database to us
58d0: 65 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  e */.  SrcList *
58e0: 70 53 72 63 3b 20 20 20 20 20 20 20 2f 2a 20 53  pSrc;       /* S
58f0: 72 63 4c 69 73 74 20 74 6f 20 62 65 20 72 65 74  rcList to be ret
5900: 75 72 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  urned */..  pSrc
5910: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
5920: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e  tAppend(pParse->
5930: 64 62 2c 20 30 2c 20 26 70 53 74 65 70 2d 3e 74  db, 0, &pStep->t
5940: 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 69 66 28  arget, 0);.  if(
5950: 20 70 53 72 63 20 29 7b 0a 20 20 20 20 61 73 73   pSrc ){.    ass
5960: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
5970: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5980: 20 70 53 72 63 2d 3e 61 21 3d 30 20 29 3b 0a 20   pSrc->a!=0 );. 
5990: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
59a0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
59b0: 61 72 73 65 2d 3e 64 62 2c 20 70 53 74 65 70 2d  arse->db, pStep-
59c0: 3e 70 54 72 69 67 2d 3e 70 53 63 68 65 6d 61 29  >pTrig->pSchema)
59d0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30  ;.    if( iDb==0
59e0: 20 7c 7c 20 69 44 62 3e 3d 32 20 29 7b 0a 20 20   || iDb>=2 ){.  
59f0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
5a00: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
5a10: 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
5a20: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20  pParse->db->nDb 
5a30: 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
5a40: 5b 70 53 72 63 2d 3e 6e 53 72 63 2d 31 5d 2e 7a  [pSrc->nSrc-1].z
5a50: 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
5a60: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 64  e3DbStrDup(db, d
5a70: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
5a80: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
5a90: 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a  return pSrc;.}..
5aa0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
5ab0: 44 42 45 20 63 6f 64 65 20 66 6f 72 20 74 68 65  DBE code for the
5ac0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
5ad0: 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  de the body of a
5ae0: 20 73 69 6e 67 6c 65 20 0a 2a 2a 20 74 72 69 67   single .** trig
5af0: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
5b00: 6e 74 20 63 6f 64 65 54 72 69 67 67 65 72 50 72  nt codeTriggerPr
5b10: 6f 67 72 61 6d 28 0a 20 20 50 61 72 73 65 20 2a  ogram(.  Parse *
5b20: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
5b30: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
5b40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72   context */.  Tr
5b50: 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65 70  iggerStep *pStep
5b60: 4c 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20  List,   /* List 
5b70: 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  of statements in
5b80: 73 69 64 65 20 74 68 65 20 74 72 69 67 67 65 72  side the trigger
5b90: 20 62 6f 64 79 20 2a 2f 0a 20 20 69 6e 74 20 6f   body */.  int o
5ba0: 72 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20  rconf           
5bb0: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
5bc0: 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45 5f   algorithm. (OE_
5bd0: 41 62 6f 72 74 2c 20 65 74 63 29 20 2a 2f 20 20  Abort, etc) */  
5be0: 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65  .){.  TriggerSte
5bf0: 70 20 2a 70 53 74 65 70 3b 0a 20 20 56 64 62 65  p *pStep;.  Vdbe
5c00: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5c10: 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  dbe;.  sqlite3 *
5c20: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5c30: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
5c40: 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
5c50: 26 26 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c  && pParse->pTopl
5c60: 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  evel );.  assert
5c70: 28 20 70 53 74 65 70 4c 69 73 74 20 29 3b 0a 20  ( pStepList );. 
5c80: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
5c90: 0a 20 20 66 6f 72 28 70 53 74 65 70 3d 70 53 74  .  for(pStep=pSt
5ca0: 65 70 4c 69 73 74 3b 20 70 53 74 65 70 3b 20 70  epList; pStep; p
5cb0: 53 74 65 70 3d 70 53 74 65 70 2d 3e 70 4e 65 78  Step=pStep->pNex
5cc0: 74 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72  t){.    /* Figur
5cd0: 65 20 6f 75 74 20 74 68 65 20 4f 4e 20 43 4f 4e  e out the ON CON
5ce0: 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 74 68 61  FLICT policy tha
5cf0: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
5d00: 6f 72 20 74 68 69 73 20 73 74 65 70 0a 20 20 20  or this step.   
5d10: 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 69 67 67   ** of the trigg
5d20: 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74  er program. If t
5d30: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  he statement tha
5d40: 74 20 63 61 75 73 65 64 20 74 68 69 73 20 74 72  t caused this tr
5d50: 69 67 67 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20  igger.    ** to 
5d60: 66 69 72 65 20 68 61 64 20 61 6e 20 65 78 70 6c  fire had an expl
5d70: 69 63 69 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  icit ON CONFLICT
5d80: 2c 20 74 68 65 6e 20 75 73 65 20 69 74 2e 20 4f  , then use it. O
5d90: 74 68 65 72 77 69 73 65 2c 20 75 73 65 0a 20 20  therwise, use.  
5da0: 20 20 2a 2a 20 74 68 65 20 4f 4e 20 43 4f 4e 46    ** the ON CONF
5db0: 4c 49 43 54 20 70 6f 6c 69 63 79 20 74 68 61 74  LICT policy that
5dc0: 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 61   was specified a
5dd0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72  s part of the tr
5de0: 69 67 67 65 72 0a 20 20 20 20 2a 2a 20 73 74 65  igger.    ** ste
5df0: 70 20 73 74 61 74 65 6d 65 6e 74 2e 20 45 78 61  p statement. Exa
5e00: 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
5e10: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 52 49   **   CREATE TRI
5e20: 47 47 45 52 20 41 46 54 45 52 20 49 4e 53 45 52  GGER AFTER INSER
5e30: 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 3b 0a 20  T ON t1 BEGIN;. 
5e40: 20 20 20 2a 2a 20 20 20 20 20 49 4e 53 45 52 54     **     INSERT
5e50: 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f   OR REPLACE INTO
5e60: 20 74 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 61   t2 VALUES(new.a
5e70: 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20 2a 2a  , new.b);.    **
5e80: 20 20 20 45 4e 44 3b 0a 20 20 20 20 2a 2a 0a 20     END;.    **. 
5e90: 20 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49     **   INSERT I
5ea0: 4e 54 4f 20 74 31 20 2e 2e 2e 20 3b 20 20 20 20  NTO t1 ... ;    
5eb0: 20 20 20 20 20 20 20 20 2d 2d 20 69 6e 73 65 72          -- inser
5ec0: 74 20 69 6e 74 6f 20 74 32 20 75 73 65 73 20 52  t into t2 uses R
5ed0: 45 50 4c 41 43 45 20 70 6f 6c 69 63 79 0a 20 20  EPLACE policy.  
5ee0: 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 4f 52    **   INSERT OR
5ef0: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20   IGNORE INTO t1 
5f00: 2e 2e 2e 20 3b 20 20 2d 2d 20 69 6e 73 65 72 74  ... ;  -- insert
5f10: 20 69 6e 74 6f 20 74 32 20 75 73 65 73 20 49 47   into t2 uses IG
5f20: 4e 4f 52 45 20 70 6f 6c 69 63 79 0a 20 20 20 20  NORE policy.    
5f30: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65  */.    pParse->e
5f40: 4f 72 63 6f 6e 66 20 3d 20 28 6f 72 63 6f 6e 66  Orconf = (orconf
5f50: 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 3f 70 53  ==OE_Default)?pS
5f60: 74 65 70 2d 3e 6f 72 63 6f 6e 66 3a 28 75 38 29  tep->orconf:(u8)
5f70: 6f 72 63 6f 6e 66 3b 0a 0a 20 20 20 20 73 77 69  orconf;..    swi
5f80: 74 63 68 28 20 70 53 74 65 70 2d 3e 6f 70 20 29  tch( pStep->op )
5f90: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  {.      case TK_
5fa0: 55 50 44 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  UPDATE: {.      
5fb0: 20 20 73 71 6c 69 74 65 33 55 70 64 61 74 65 28    sqlite3Update(
5fc0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
5fd0: 20 20 20 74 61 72 67 65 74 53 72 63 4c 69 73 74     targetSrcList
5fe0: 28 70 50 61 72 73 65 2c 20 70 53 74 65 70 29 2c  (pParse, pStep),
5ff0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6000: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
6010: 2c 20 70 53 74 65 70 2d 3e 70 45 78 70 72 4c 69  , pStep->pExprLi
6020: 73 74 2c 20 30 29 2c 20 0a 20 20 20 20 20 20 20  st, 0), .       
6030: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
6040: 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 57 68  p(db, pStep->pWh
6050: 65 72 65 2c 20 30 29 2c 20 0a 20 20 20 20 20 20  ere, 0), .      
6060: 20 20 20 20 70 50 61 72 73 65 2d 3e 65 4f 72 63      pParse->eOrc
6070: 6f 6e 66 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  onf.        );. 
6080: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6090: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
60a0: 20 54 4b 5f 49 4e 53 45 52 54 3a 20 7b 0a 20 20   TK_INSERT: {.  
60b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e 73        sqlite3Ins
60c0: 65 72 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ert(pParse, .   
60d0: 20 20 20 20 20 20 20 74 61 72 67 65 74 53 72 63         targetSrc
60e0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 74  List(pParse, pSt
60f0: 65 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ep),.          s
6100: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
6110: 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 45 78  p(db, pStep->pEx
6120: 70 72 4c 69 73 74 2c 20 30 29 2c 20 0a 20 20 20  prList, 0), .   
6130: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
6140: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 74 65  lectDup(db, pSte
6150: 70 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 2c 20  p->pSelect, 0), 
6160: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6170: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
6180: 70 53 74 65 70 2d 3e 70 49 64 4c 69 73 74 29 2c  pStep->pIdList),
6190: 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72   .          pPar
61a0: 73 65 2d 3e 65 4f 72 63 6f 6e 66 0a 20 20 20 20  se->eOrconf.    
61b0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 62      );.        b
61c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
61d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 45 4c 45      case TK_DELE
61e0: 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  TE: {.        sq
61f0: 6c 69 74 65 33 44 65 6c 65 74 65 46 72 6f 6d 28  lite3DeleteFrom(
6200: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
6210: 20 20 20 74 61 72 67 65 74 53 72 63 4c 69 73 74     targetSrcList
6220: 28 70 50 61 72 73 65 2c 20 70 53 74 65 70 29 2c  (pParse, pStep),
6230: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6240: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
6250: 74 65 70 2d 3e 70 57 68 65 72 65 2c 20 30 29 0a  tep->pWhere, 0).
6260: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
6270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6280: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
6290: 20 61 73 73 65 72 74 28 20 70 53 74 65 70 2d 3e   assert( pStep->
62a0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
62b0: 20 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63   {.        Selec
62c0: 74 44 65 73 74 20 73 44 65 73 74 3b 0a 20 20 20  tDest sDest;.   
62d0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
62e0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
62f0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 74 65  lectDup(db, pSte
6300: 70 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  p->pSelect, 0);.
6310: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
6320: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 73  electDestInit(&s
6330: 44 65 73 74 2c 20 53 52 54 5f 44 69 73 63 61 72  Dest, SRT_Discar
6340: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  d, 0);.        s
6350: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
6360: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 73  rse, pSelect, &s
6370: 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Dest);.        s
6380: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
6390: 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
63a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
63b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20        }.    } . 
63c0: 20 20 20 69 66 28 20 70 53 74 65 70 2d 3e 6f 70     if( pStep->op
63d0: 21 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  !=TK_SELECT ){. 
63e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
63f0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 52 65 73  AddOp0(v, OP_Res
6400: 65 74 43 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 0a  etCount);.    }.
6410: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
6420: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
6430: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
6440: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
6450: 73 65 64 20 74 6f 20 61 64 64 20 56 64 62 65 43  sed to add VdbeC
6460: 6f 6d 6d 65 6e 74 28 29 20 61 6e 6e 6f 74 61 74  omment() annotat
6470: 69 6f 6e 73 20 74 6f 20 61 20 56 44 42 45 0a 2a  ions to a VDBE.*
6480: 2a 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73  * program. It is
6490: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 70 72 6f   not used in pro
64a0: 64 75 63 74 69 6f 6e 20 63 6f 64 65 2c 20 6f 6e  duction code, on
64b0: 6c 79 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ly for debugging
64c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
64d0: 74 20 63 68 61 72 20 2a 6f 6e 45 72 72 6f 72 54  t char *onErrorT
64e0: 65 78 74 28 69 6e 74 20 6f 6e 45 72 72 6f 72 29  ext(int onError)
64f0: 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 6e 45 72  {.  switch( onEr
6500: 72 6f 72 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ror ){.    case 
6510: 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20 72 65 74  OE_Abort:    ret
6520: 75 72 6e 20 22 61 62 6f 72 74 22 3b 0a 20 20 20  urn "abort";.   
6530: 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63   case OE_Rollbac
6540: 6b 3a 20 72 65 74 75 72 6e 20 22 72 6f 6c 6c 62  k: return "rollb
6550: 61 63 6b 22 3b 0a 20 20 20 20 63 61 73 65 20 4f  ack";.    case O
6560: 45 5f 46 61 69 6c 3a 20 20 20 20 20 72 65 74 75  E_Fail:     retu
6570: 72 6e 20 22 66 61 69 6c 22 3b 0a 20 20 20 20 63  rn "fail";.    c
6580: 61 73 65 20 4f 45 5f 52 65 70 6c 61 63 65 3a 20  ase OE_Replace: 
6590: 20 72 65 74 75 72 6e 20 22 72 65 70 6c 61 63 65   return "replace
65a0: 22 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 49  ";.    case OE_I
65b0: 67 6e 6f 72 65 3a 20 20 20 72 65 74 75 72 6e 20  gnore:   return 
65c0: 22 69 67 6e 6f 72 65 22 3b 0a 20 20 20 20 63 61  "ignore";.    ca
65d0: 73 65 20 4f 45 5f 44 65 66 61 75 6c 74 3a 20 20  se OE_Default:  
65e0: 72 65 74 75 72 6e 20 22 64 65 66 61 75 6c 74 22  return "default"
65f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
6600: 6e 2f 61 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n/a";.}.#endif..
6610: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 63 6f 6e 74  /*.** Parse cont
6620: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 46  ext structure pF
6630: 72 6f 6d 20 68 61 73 20 6a 75 73 74 20 62 65 65  rom has just bee
6640: 6e 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  n used to create
6650: 20 61 20 73 75 62 2d 76 64 62 65 0a 2a 2a 20 28   a sub-vdbe.** (
6660: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 29  trigger program)
6670: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
6680: 73 20 6f 63 63 75 72 72 65 64 2c 20 74 72 61 6e  s occurred, tran
6690: 73 66 65 72 20 65 72 72 6f 72 20 69 6e 66 6f 72  sfer error infor
66a0: 6d 61 74 69 6f 6e 0a 2a 2a 20 66 72 6f 6d 20 70  mation.** from p
66b0: 46 72 6f 6d 20 74 6f 20 70 54 6f 2e 0a 2a 2f 0a  From to pTo..*/.
66c0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e  static void tran
66d0: 73 66 65 72 50 61 72 73 65 45 72 72 6f 72 28 50  sferParseError(P
66e0: 61 72 73 65 20 2a 70 54 6f 2c 20 50 61 72 73 65  arse *pTo, Parse
66f0: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 61 73 73 65   *pFrom){.  asse
6700: 72 74 28 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d  rt( pFrom->zErrM
6710: 73 67 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e  sg==0 || pFrom->
6720: 6e 45 72 72 20 29 3b 0a 20 20 61 73 73 65 72 74  nErr );.  assert
6730: 28 20 70 54 6f 2d 3e 7a 45 72 72 4d 73 67 3d 3d  ( pTo->zErrMsg==
6740: 30 20 7c 7c 20 70 54 6f 2d 3e 6e 45 72 72 20 29  0 || pTo->nErr )
6750: 3b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 6e 45 72  ;.  if( pTo->nEr
6760: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 6f 2d  r==0 ){.    pTo-
6770: 3e 7a 45 72 72 4d 73 67 20 3d 20 70 46 72 6f 6d  >zErrMsg = pFrom
6780: 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70  ->zErrMsg;.    p
6790: 54 6f 2d 3e 6e 45 72 72 20 3d 20 70 46 72 6f 6d  To->nErr = pFrom
67a0: 2d 3e 6e 45 72 72 3b 0a 20 20 7d 65 6c 73 65 7b  ->nErr;.  }else{
67b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
67c0: 65 65 28 70 46 72 6f 6d 2d 3e 64 62 2c 20 70 46  ee(pFrom->db, pF
67d0: 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  rom->zErrMsg);. 
67e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
67f0: 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
6800: 61 20 6e 65 77 20 54 72 69 67 67 65 72 50 72 67  a new TriggerPrg
6810: 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 73   object with a s
6820: 75 62 2d 70 72 6f 67 72 61 6d 20 0a 2a 2a 20 69  ub-program .** i
6830: 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 72 69 67  mplementing trig
6840: 67 65 72 20 70 54 72 69 67 67 65 72 20 77 69 74  ger pTrigger wit
6850: 68 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f  h ON CONFLICT po
6860: 6c 69 63 79 20 6f 72 63 6f 6e 66 2e 0a 2a 2f 0a  licy orconf..*/.
6870: 73 74 61 74 69 63 20 54 72 69 67 67 65 72 50 72  static TriggerPr
6880: 67 20 2a 63 6f 64 65 52 6f 77 54 72 69 67 67 65  g *codeRowTrigge
6890: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
68a0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72  se,       /* Cur
68b0: 72 65 6e 74 20 70 61 72 73 65 20 63 6f 6e 74 65  rent parse conte
68c0: 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20  xt */.  Trigger 
68d0: 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f 2a 20  *pTrigger,   /* 
68e0: 54 72 69 67 67 65 72 20 74 6f 20 63 6f 64 65 20  Trigger to code 
68f0: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
6900: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
6910: 20 74 61 62 6c 65 20 70 54 72 69 67 67 65 72 20   table pTrigger 
6920: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 2a  is attached to *
6930: 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20  /.  int orconf  
6940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43           /* ON C
6950: 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 74  ONFLICT policy t
6960: 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 20 70  o code trigger p
6970: 72 6f 67 72 61 6d 20 77 69 74 68 20 2a 2f 0a 29  rogram with */.)
6980: 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 20  {.  Parse *pTop 
6990: 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
69a0: 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
69b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
69c0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
69d0: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
69e0: 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 50 72 67   */.  TriggerPrg
69f0: 20 2a 70 50 72 67 3b 20 20 20 20 20 20 20 20 20   *pPrg;         
6a00: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
6a10: 74 75 72 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  turn */.  Expr *
6a20: 70 57 68 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  pWhen = 0;      
6a30: 20 20 20 20 20 20 2f 2a 20 44 75 70 6c 69 63 61        /* Duplica
6a40: 74 65 20 6f 66 20 74 72 69 67 67 65 72 20 57 48  te of trigger WH
6a50: 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
6a60: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6a80: 2a 20 54 65 6d 70 6f 72 61 72 79 20 56 4d 20 2a  * Temporary VM *
6a90: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
6aa0: 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  sNC;            
6ab0: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
6ac0: 66 6f 72 20 73 75 62 2d 76 64 62 65 20 2a 2f 0a  for sub-vdbe */.
6ad0: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 50    SubProgram *pP
6ae0: 72 6f 67 72 61 6d 20 3d 20 30 3b 20 20 20 2f 2a  rogram = 0;   /*
6af0: 20 53 75 62 2d 76 64 62 65 20 66 6f 72 20 74 72   Sub-vdbe for tr
6b00: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 2a 2f  igger program */
6b10: 0a 20 20 50 61 72 73 65 20 2a 70 53 75 62 50 61  .  Parse *pSubPa
6b20: 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rse;           /
6b30: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
6b40: 66 6f 72 20 73 75 62 2d 76 64 62 65 20 2a 2f 0a  for sub-vdbe */.
6b50: 20 20 69 6e 74 20 69 45 6e 64 54 72 69 67 67 65    int iEndTrigge
6b60: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  r = 0;        /*
6b70: 20 4c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   Label to jump t
6b80: 6f 20 69 66 20 57 48 45 4e 20 69 73 20 66 61 6c  o if WHEN is fal
6b90: 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
6ba0: 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65   pTrigger->zName
6bb0: 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 74 61 62  ==0 || pTab==tab
6bc0: 6c 65 4f 66 54 72 69 67 67 65 72 28 70 54 72 69  leOfTrigger(pTri
6bd0: 67 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  gger) );.  asser
6be0: 74 28 20 70 54 6f 70 2d 3e 70 56 64 62 65 20 29  t( pTop->pVdbe )
6bf0: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
6c00: 20 74 68 65 20 54 72 69 67 67 65 72 50 72 67 20   the TriggerPrg 
6c10: 61 6e 64 20 53 75 62 50 72 6f 67 72 61 6d 20 6f  and SubProgram o
6c20: 62 6a 65 63 74 73 2e 20 54 6f 20 65 6e 73 75 72  bjects. To ensur
6c30: 65 20 74 68 61 74 20 74 68 65 79 0a 20 20 2a 2a  e that they.  **
6c40: 20 61 72 65 20 66 72 65 65 64 20 69 66 20 61 6e   are freed if an
6c50: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
6c60: 69 6e 6b 20 74 68 65 6d 20 69 6e 74 6f 20 74 68  ink them into th
6c70: 65 20 50 61 72 73 65 2e 70 54 72 69 67 67 65 72  e Parse.pTrigger
6c80: 50 72 67 20 0a 20 20 2a 2a 20 6c 69 73 74 20 6f  Prg .  ** list o
6c90: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
6ca0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 73 6f 6f  Parse object soo
6cb0: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
6cc0: 6c 61 74 65 72 2e 20 20 2a 2f 0a 20 20 70 50 72  later.  */.  pPr
6cd0: 67 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  g = sqlite3DbMal
6ce0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
6cf0: 6f 66 28 54 72 69 67 67 65 72 50 72 67 29 29 3b  of(TriggerPrg));
6d00: 0a 20 20 69 66 28 20 21 70 50 72 67 20 29 20 72  .  if( !pPrg ) r
6d10: 65 74 75 72 6e 20 30 3b 0a 20 20 70 50 72 67 2d  eturn 0;.  pPrg-
6d20: 3e 70 4e 65 78 74 20 3d 20 70 54 6f 70 2d 3e 70  >pNext = pTop->p
6d30: 54 72 69 67 67 65 72 50 72 67 3b 0a 20 20 70 54  TriggerPrg;.  pT
6d40: 6f 70 2d 3e 70 54 72 69 67 67 65 72 50 72 67 20  op->pTriggerPrg 
6d50: 3d 20 70 50 72 67 3b 0a 20 20 70 50 72 67 2d 3e  = pPrg;.  pPrg->
6d60: 70 50 72 6f 67 72 61 6d 20 3d 20 70 50 72 6f 67  pProgram = pProg
6d70: 72 61 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ram = sqlite3DbM
6d80: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
6d90: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 29  zeof(SubProgram)
6da0: 29 3b 0a 20 20 69 66 28 20 21 70 50 72 6f 67 72  );.  if( !pProgr
6db0: 61 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  am ) return 0;. 
6dc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b   sqlite3VdbeLink
6dd0: 53 75 62 50 72 6f 67 72 61 6d 28 70 54 6f 70 2d  SubProgram(pTop-
6de0: 3e 70 56 64 62 65 2c 20 70 50 72 6f 67 72 61 6d  >pVdbe, pProgram
6df0: 29 3b 0a 20 20 70 50 72 67 2d 3e 70 54 72 69 67  );.  pPrg->pTrig
6e00: 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 3b 0a  ger = pTrigger;.
6e10: 20 20 70 50 72 67 2d 3e 6f 72 63 6f 6e 66 20 3d    pPrg->orconf =
6e20: 20 6f 72 63 6f 6e 66 3b 0a 20 20 70 50 72 67 2d   orconf;.  pPrg-
6e30: 3e 61 43 6f 6c 6d 61 73 6b 5b 30 5d 20 3d 20 30  >aColmask[0] = 0
6e40: 78 66 66 66 66 66 66 66 66 3b 0a 20 20 70 50 72  xffffffff;.  pPr
6e50: 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b 31 5d 20 3d  g->aColmask[1] =
6e60: 20 30 78 66 66 66 66 66 66 66 66 3b 0a 0a 20 20   0xffffffff;..  
6e70: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
6e80: 70 6f 70 75 6c 61 74 65 20 61 20 6e 65 77 20 50  populate a new P
6e90: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 74 6f 20  arse context to 
6ea0: 75 73 65 20 66 6f 72 20 63 6f 64 69 6e 67 20 74  use for coding t
6eb0: 68 65 20 0a 20 20 2a 2a 20 74 72 69 67 67 65 72  he .  ** trigger
6ec0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 20 2a   sub-program.  *
6ed0: 2f 0a 20 20 70 53 75 62 50 61 72 73 65 20 3d 20  /.  pSubParse = 
6ee0: 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f  sqlite3StackAllo
6ef0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
6f00: 28 50 61 72 73 65 29 29 3b 0a 20 20 69 66 28 20  (Parse));.  if( 
6f10: 21 70 53 75 62 50 61 72 73 65 20 29 20 72 65 74  !pSubParse ) ret
6f20: 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  urn 0;.  memset(
6f30: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
6f40: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61  sNC));.  sNC.pPa
6f50: 72 73 65 20 3d 20 70 53 75 62 50 61 72 73 65 3b  rse = pSubParse;
6f60: 0a 20 20 70 53 75 62 50 61 72 73 65 2d 3e 64 62  .  pSubParse->db
6f70: 20 3d 20 64 62 3b 0a 20 20 70 53 75 62 50 61 72   = db;.  pSubPar
6f80: 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
6f90: 3d 20 70 54 61 62 3b 0a 20 20 70 53 75 62 50 61  = pTab;.  pSubPa
6fa0: 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 20 3d  rse->pToplevel =
6fb0: 20 70 54 6f 70 3b 0a 20 20 70 53 75 62 50 61 72   pTop;.  pSubPar
6fc0: 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
6fd0: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61   = pTrigger->zNa
6fe0: 6d 65 3b 0a 20 20 70 53 75 62 50 61 72 73 65 2d  me;.  pSubParse-
6ff0: 3e 65 54 72 69 67 67 65 72 4f 70 20 3d 20 70 54  >eTriggerOp = pT
7000: 72 69 67 67 65 72 2d 3e 6f 70 3b 0a 20 20 70 53  rigger->op;.  pS
7010: 75 62 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c  ubParse->nQueryL
7020: 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
7030: 75 65 72 79 4c 6f 6f 70 3b 0a 0a 20 20 76 20 3d  ueryLoop;..  v =
7040: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
7050: 70 53 75 62 50 61 72 73 65 29 3b 0a 20 20 69 66  pSubParse);.  if
7060: 28 20 76 20 29 7b 0a 20 20 20 20 56 64 62 65 43  ( v ){.    VdbeC
7070: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 53 74 61 72  omment((v, "Star
7080: 74 3a 20 25 73 2e 25 73 20 28 25 73 20 25 73 25  t: %s.%s (%s %s%
7090: 73 25 73 20 4f 4e 20 25 73 29 22 2c 20 0a 20 20  s%s ON %s)", .  
70a0: 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e      pTrigger->zN
70b0: 61 6d 65 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74  ame, onErrorText
70c0: 28 6f 72 63 6f 6e 66 29 2c 0a 20 20 20 20 20 20  (orconf),.      
70d0: 28 70 54 72 69 67 67 65 72 2d 3e 74 72 5f 74 6d  (pTrigger->tr_tm
70e0: 3d 3d 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45  ==TRIGGER_BEFORE
70f0: 20 3f 20 22 42 45 46 4f 52 45 22 20 3a 20 22 41   ? "BEFORE" : "A
7100: 46 54 45 52 22 29 2c 0a 20 20 20 20 20 20 20 20  FTER"),.        
7110: 28 70 54 72 69 67 67 65 72 2d 3e 6f 70 3d 3d 54  (pTrigger->op==T
7120: 4b 5f 55 50 44 41 54 45 20 3f 20 22 55 50 44 41  K_UPDATE ? "UPDA
7130: 54 45 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20  TE" : ""),.     
7140: 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e 6f 70     (pTrigger->op
7150: 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 3f 20 22 49  ==TK_INSERT ? "I
7160: 4e 53 45 52 54 22 20 3a 20 22 22 29 2c 0a 20 20  NSERT" : ""),.  
7170: 20 20 20 20 20 20 28 70 54 72 69 67 67 65 72 2d        (pTrigger-
7180: 3e 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 3f  >op==TK_DELETE ?
7190: 20 22 44 45 4c 45 54 45 22 20 3a 20 22 22 29 2c   "DELETE" : ""),
71a0: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  .      pTab->zNa
71b0: 6d 65 0a 20 20 20 20 29 29 3b 0a 23 69 66 6e 64  me.    ));.#ifnd
71c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
71d0: 52 41 43 45 0a 20 20 20 20 73 71 6c 69 74 65 33  RACE.    sqlite3
71e0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
71f0: 2d 31 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  -1, .      sqlit
7200: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d  e3MPrintf(db, "-
7210: 2d 20 54 52 49 47 47 45 52 20 25 73 22 2c 20 70  - TRIGGER %s", p
7220: 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 29 2c  Trigger->zName),
7230: 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20   P4_DYNAMIC.    
7240: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
7250: 2a 20 49 66 20 6f 6e 65 20 77 61 73 20 73 70 65  * If one was spe
7260: 63 69 66 69 65 64 2c 20 63 6f 64 65 20 74 68 65  cified, code the
7270: 20 57 48 45 4e 20 63 6c 61 75 73 65 2e 20 49 66   WHEN clause. If
7280: 20 69 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f   it evaluates to
7290: 20 66 61 6c 73 65 0a 20 20 20 20 2a 2a 20 28 6f   false.    ** (o
72a0: 72 20 4e 55 4c 4c 29 20 74 68 65 20 73 75 62 2d  r NULL) the sub-
72b0: 76 64 62 65 20 69 73 20 69 6d 6d 65 64 69 61 74  vdbe is immediat
72c0: 65 6c 79 20 68 61 6c 74 65 64 20 62 79 20 6a 75  ely halted by ju
72d0: 6d 70 69 6e 67 20 74 6f 20 74 68 65 20 0a 20 20  mping to the .  
72e0: 20 20 2a 2a 20 4f 50 5f 48 61 6c 74 20 69 6e 73    ** OP_Halt ins
72f0: 65 72 74 65 64 20 61 74 20 74 68 65 20 65 6e 64  erted at the end
7300: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   of the program.
7310: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 72    */.    if( pTr
7320: 69 67 67 65 72 2d 3e 70 57 68 65 6e 20 29 7b 0a  igger->pWhen ){.
7330: 20 20 20 20 20 20 70 57 68 65 6e 20 3d 20 73 71        pWhen = sq
7340: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7350: 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e   pTrigger->pWhen
7360: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
7370: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74  SQLITE_OK==sqlit
7380: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
7390: 65 73 28 26 73 4e 43 2c 20 70 57 68 65 6e 29 20  es(&sNC, pWhen) 
73a0: 0a 20 20 20 20 20 20 20 26 26 20 64 62 2d 3e 6d  .       && db->m
73b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a  allocFailed==0 .
73c0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
73d0: 20 69 45 6e 64 54 72 69 67 67 65 72 20 3d 20 73   iEndTrigger = s
73e0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
73f0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
7400: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
7410: 73 65 28 70 53 75 62 50 61 72 73 65 2c 20 70 57  se(pSubParse, pW
7420: 68 65 6e 2c 20 69 45 6e 64 54 72 69 67 67 65 72  hen, iEndTrigger
7430: 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
7440: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
7450: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7460: 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65 6e 29  elete(db, pWhen)
7470: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7480: 43 6f 64 65 20 74 68 65 20 74 72 69 67 67 65 72  Code the trigger
7490: 20 70 72 6f 67 72 61 6d 20 69 6e 74 6f 20 74 68   program into th
74a0: 65 20 73 75 62 2d 76 64 62 65 2e 20 2a 2f 0a 20  e sub-vdbe. */. 
74b0: 20 20 20 63 6f 64 65 54 72 69 67 67 65 72 50 72     codeTriggerPr
74c0: 6f 67 72 61 6d 28 70 53 75 62 50 61 72 73 65 2c  ogram(pSubParse,
74d0: 20 70 54 72 69 67 67 65 72 2d 3e 73 74 65 70 5f   pTrigger->step_
74e0: 6c 69 73 74 2c 20 6f 72 63 6f 6e 66 29 3b 0a 0a  list, orconf);..
74f0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 61 6e      /* Insert an
7500: 20 4f 50 5f 48 61 6c 74 20 61 74 20 74 68 65 20   OP_Halt at the 
7510: 65 6e 64 20 6f 66 20 74 68 65 20 73 75 62 2d 70  end of the sub-p
7520: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 69  rogram. */.    i
7530: 66 28 20 69 45 6e 64 54 72 69 67 67 65 72 20 29  f( iEndTrigger )
7540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7550: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
7560: 76 2c 20 69 45 6e 64 54 72 69 67 67 65 72 29 3b  v, iEndTrigger);
7570: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7580: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
7590: 4f 50 5f 48 61 6c 74 29 3b 0a 20 20 20 20 56 64  OP_Halt);.    Vd
75a0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  beComment((v, "E
75b0: 6e 64 3a 20 25 73 2e 25 73 22 2c 20 70 54 72 69  nd: %s.%s", pTri
75c0: 67 67 65 72 2d 3e 7a 4e 61 6d 65 2c 20 6f 6e 45  gger->zName, onE
75d0: 72 72 6f 72 54 65 78 74 28 6f 72 63 6f 6e 66 29  rrorText(orconf)
75e0: 29 29 3b 0a 0a 20 20 20 20 74 72 61 6e 73 66 65  ));..    transfe
75f0: 72 50 61 72 73 65 45 72 72 6f 72 28 70 50 61 72  rParseError(pPar
7600: 73 65 2c 20 70 53 75 62 50 61 72 73 65 29 3b 0a  se, pSubParse);.
7610: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
7620: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
7630: 20 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 61       pProgram->a
7640: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
7650: 54 61 6b 65 4f 70 41 72 72 61 79 28 76 2c 20 26  TakeOpArray(v, &
7660: 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 2c 20 26  pProgram->nOp, &
7670: 70 54 6f 70 2d 3e 6e 4d 61 78 41 72 67 29 3b 0a  pTop->nMaxArg);.
7680: 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 67 72      }.    pProgr
7690: 61 6d 2d 3e 6e 4d 65 6d 20 3d 20 70 53 75 62 50  am->nMem = pSubP
76a0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
76b0: 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 20 3d  pProgram->nCsr =
76c0: 20 70 53 75 62 50 61 72 73 65 2d 3e 6e 54 61 62   pSubParse->nTab
76d0: 3b 0a 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e  ;.    pProgram->
76e0: 74 6f 6b 65 6e 20 3d 20 28 76 6f 69 64 20 2a 29  token = (void *)
76f0: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 70 50  pTrigger;.    pP
7700: 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b 30 5d 20  rg->aColmask[0] 
7710: 3d 20 70 53 75 62 50 61 72 73 65 2d 3e 6f 6c 64  = pSubParse->old
7720: 6d 61 73 6b 3b 0a 20 20 20 20 70 50 72 67 2d 3e  mask;.    pPrg->
7730: 61 43 6f 6c 6d 61 73 6b 5b 31 5d 20 3d 20 70 53  aColmask[1] = pS
7740: 75 62 50 61 72 73 65 2d 3e 6e 65 77 6d 61 73 6b  ubParse->newmask
7750: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7760: 65 44 65 6c 65 74 65 28 76 29 3b 0a 20 20 7d 0a  eDelete(v);.  }.
7770: 0a 20 20 61 73 73 65 72 74 28 20 21 70 53 75 62  .  assert( !pSub
7780: 50 61 72 73 65 2d 3e 70 41 69 6e 63 20 20 20 20  Parse->pAinc    
7790: 20 20 20 26 26 20 21 70 53 75 62 50 61 72 73 65     && !pSubParse
77a0: 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 29 3b 0a  ->pZombieTab );.
77b0: 20 20 61 73 73 65 72 74 28 20 21 70 53 75 62 50    assert( !pSubP
77c0: 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 50 72  arse->pTriggerPr
77d0: 67 20 26 26 20 21 70 53 75 62 50 61 72 73 65 2d  g && !pSubParse-
77e0: 3e 6e 4d 61 78 41 72 67 20 29 3b 0a 20 20 73 71  >nMaxArg );.  sq
77f0: 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
7800: 62 2c 20 70 53 75 62 50 61 72 73 65 29 3b 0a 0a  b, pSubParse);..
7810: 20 20 72 65 74 75 72 6e 20 70 50 72 67 3b 0a 7d    return pPrg;.}
7820: 0a 20 20 20 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75  .    ./*.** Retu
7830: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
7840: 61 20 54 72 69 67 67 65 72 50 72 67 20 6f 62 6a  a TriggerPrg obj
7850: 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ect containing t
7860: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 66  he sub-program f
7870: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 20 70 54  or.** trigger pT
7880: 72 69 67 67 65 72 20 77 69 74 68 20 64 65 66 61  rigger with defa
7890: 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ult ON CONFLICT 
78a0: 61 6c 67 6f 72 69 74 68 6d 20 6f 72 63 6f 6e 66  algorithm orconf
78b0: 2e 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20  . If no such.** 
78c0: 54 72 69 67 67 65 72 50 72 67 20 6f 62 6a 65 63  TriggerPrg objec
78d0: 74 20 65 78 69 73 74 73 2c 20 61 20 6e 65 77 20  t exists, a new 
78e0: 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
78f0: 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
7900: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 62 65 69 6e  d before.** bein
7910: 67 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  g returned..*/.s
7920: 74 61 74 69 63 20 54 72 69 67 67 65 72 50 72 67  tatic TriggerPrg
7930: 20 2a 67 65 74 52 6f 77 54 72 69 67 67 65 72 28   *getRowTrigger(
7940: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7950: 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65  ,       /* Curre
7960: 6e 74 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74  nt parse context
7970: 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70   */.  Trigger *p
7980: 54 72 69 67 67 65 72 2c 20 20 20 2f 2a 20 54 72  Trigger,   /* Tr
7990: 69 67 67 65 72 20 74 6f 20 63 6f 64 65 20 2a 2f  igger to code */
79a0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
79b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
79c0: 61 62 6c 65 20 74 72 69 67 67 65 72 20 70 54 72  able trigger pTr
79d0: 69 67 67 65 72 20 69 73 20 61 74 74 61 63 68 65  igger is attache
79e0: 64 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  d to */.  int or
79f0: 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f  conf           /
7a00: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c  * ON CONFLICT al
7a10: 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 29 7b 0a 20  gorithm. */.){. 
7a20: 20 50 61 72 73 65 20 2a 70 52 6f 6f 74 20 3d 20   Parse *pRoot = 
7a30: 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
7a40: 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
7a50: 54 72 69 67 67 65 72 50 72 67 20 2a 70 50 72 67  TriggerPrg *pPrg
7a60: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 72  ;..  assert( pTr
7a70: 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  igger->zName==0 
7a80: 7c 7c 20 70 54 61 62 3d 3d 74 61 62 6c 65 4f 66  || pTab==tableOf
7a90: 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72  Trigger(pTrigger
7aa0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 6d 61  ) );..  /* It ma
7ab0: 79 20 62 65 20 74 68 61 74 20 74 68 69 73 20 74  y be that this t
7ac0: 72 69 67 67 65 72 20 68 61 73 20 61 6c 72 65 61  rigger has alrea
7ad0: 64 79 20 62 65 65 6e 20 63 6f 64 65 64 20 28 6f  dy been coded (o
7ae0: 72 20 69 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a  r is in the.  **
7af0: 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
7b00: 67 20 63 6f 64 65 64 29 2e 20 49 66 20 74 68 69  g coded). If thi
7b10: 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
7b20: 68 65 6e 20 61 6e 20 65 6e 74 72 79 20 77 69 74  hen an entry wit
7b30: 68 0a 20 20 2a 2a 20 61 20 6d 61 74 63 68 69 6e  h.  ** a matchin
7b40: 67 20 54 72 69 67 67 65 72 50 72 67 2e 70 54 72  g TriggerPrg.pTr
7b50: 69 67 67 65 72 20 66 69 65 6c 64 20 77 69 6c 6c  igger field will
7b60: 20 62 65 20 70 72 65 73 65 6e 74 20 73 6f 6d 65   be present some
7b70: 77 68 65 72 65 0a 20 20 2a 2a 20 69 6e 20 74 68  where.  ** in th
7b80: 65 20 50 61 72 73 65 2e 70 54 72 69 67 67 65 72  e Parse.pTrigger
7b90: 50 72 67 20 6c 69 73 74 2e 20 53 65 61 72 63 68  Prg list. Search
7ba0: 20 66 6f 72 20 73 75 63 68 20 61 6e 20 65 6e 74   for such an ent
7bb0: 72 79 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  ry.  */.  for(pP
7bc0: 72 67 3d 70 52 6f 6f 74 2d 3e 70 54 72 69 67 67  rg=pRoot->pTrigg
7bd0: 65 72 50 72 67 3b 20 0a 20 20 20 20 20 20 70 50  erPrg; .      pP
7be0: 72 67 20 26 26 20 28 70 50 72 67 2d 3e 70 54 72  rg && (pPrg->pTr
7bf0: 69 67 67 65 72 21 3d 70 54 72 69 67 67 65 72 20  igger!=pTrigger 
7c00: 7c 7c 20 70 50 72 67 2d 3e 6f 72 63 6f 6e 66 21  || pPrg->orconf!
7c10: 3d 6f 72 63 6f 6e 66 29 3b 20 0a 20 20 20 20 20  =orconf); .     
7c20: 20 70 50 72 67 3d 70 50 72 67 2d 3e 70 4e 65 78   pPrg=pPrg->pNex
7c30: 74 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t.  );..  /* If 
7c40: 61 6e 20 65 78 69 73 74 69 6e 67 20 54 72 69 67  an existing Trig
7c50: 67 65 72 50 72 67 20 63 6f 75 6c 64 20 6e 6f 74  gerPrg could not
7c60: 20 62 65 20 6c 6f 63 61 74 65 64 2c 20 63 72 65   be located, cre
7c70: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 20 2a  ate a new one. *
7c80: 2f 0a 20 20 69 66 28 20 21 70 50 72 67 20 29 7b  /.  if( !pPrg ){
7c90: 0a 20 20 20 20 70 50 72 67 20 3d 20 63 6f 64 65  .    pPrg = code
7ca0: 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73  RowTrigger(pPars
7cb0: 65 2c 20 70 54 72 69 67 67 65 72 2c 20 70 54 61  e, pTrigger, pTa
7cc0: 62 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 7d 0a  b, orconf);.  }.
7cd0: 0a 20 20 72 65 74 75 72 6e 20 70 50 72 67 3b 0a  .  return pPrg;.
7ce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
7cf0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 74  e code for the t
7d00: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 61  rigger program a
7d10: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
7d20: 72 69 67 67 65 72 20 70 20 6f 6e 20 0a 2a 2a 20  rigger p on .** 
7d30: 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68 65 20  table pTab. The 
7d40: 72 65 67 2c 20 6f 72 63 6f 6e 66 20 61 6e 64 20  reg, orconf and 
7d50: 69 67 6e 6f 72 65 4a 75 6d 70 20 70 61 72 61 6d  ignoreJump param
7d60: 65 74 65 72 73 20 70 61 73 73 65 64 20 74 6f 20  eters passed to 
7d70: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
7d80: 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
7d90: 20 74 68 6f 73 65 20 64 65 73 63 72 69 62 65 64   those described
7da0: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 66   in the header f
7db0: 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 73  unction for.** s
7dc0: 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69  qlite3CodeRowTri
7dd0: 67 67 65 72 28 29 0a 2a 2f 0a 76 6f 69 64 20 73  gger().*/.void s
7de0: 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69  qlite3CodeRowTri
7df0: 67 67 65 72 44 69 72 65 63 74 28 0a 20 20 50 61  ggerDirect(.  Pa
7e00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7e10: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
7e20: 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72  ext */.  Trigger
7e30: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *p,          /*
7e40: 20 54 72 69 67 67 65 72 20 74 6f 20 63 6f 64 65   Trigger to code
7e50: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
7e60: 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  b,         /* Th
7e70: 65 20 74 61 62 6c 65 20 74 6f 20 63 6f 64 65 20  e table to code 
7e80: 74 72 69 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f  triggers from */
7e90: 0a 20 20 69 6e 74 20 72 65 67 2c 20 20 20 20 20  .  int reg,     
7ea0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 20 61          /* Reg a
7eb0: 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rray containing 
7ec0: 4f 4c 44 2e 2a 20 61 6e 64 20 4e 45 57 2e 2a 20  OLD.* and NEW.* 
7ed0: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
7ee0: 6f 72 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20  orconf,         
7ef0: 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   /* ON CONFLICT 
7f00: 70 6f 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20  policy */.  int 
7f10: 69 67 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20 20  ignoreJump      
7f20: 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20   /* Instruction 
7f30: 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52  to jump to for R
7f40: 41 49 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a  AISE(IGNORE) */.
7f50: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
7f60: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
7f70: 61 72 73 65 29 3b 20 2f 2a 20 4d 61 69 6e 20 56  arse); /* Main V
7f80: 4d 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 50 72  M */.  TriggerPr
7f90: 67 20 2a 70 50 72 67 3b 0a 20 20 70 50 72 67 20  g *pPrg;.  pPrg 
7fa0: 3d 20 67 65 74 52 6f 77 54 72 69 67 67 65 72 28  = getRowTrigger(
7fb0: 70 50 61 72 73 65 2c 20 70 2c 20 70 54 61 62 2c  pParse, p, pTab,
7fc0: 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 61 73 73 65   orconf);.  asse
7fd0: 72 74 28 20 70 50 72 67 20 7c 7c 20 70 50 61 72  rt( pPrg || pPar
7fe0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
7ff0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
8000: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  iled );..  /* Co
8010: 64 65 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  de the OP_Progra
8020: 6d 20 6f 70 63 6f 64 65 20 69 6e 20 74 68 65 20  m opcode in the 
8030: 70 61 72 65 6e 74 20 56 44 42 45 2e 20 50 34 20  parent VDBE. P4 
8040: 6f 66 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  of the OP_Progra
8050: 6d 20 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f 69  m .  ** is a poi
8060: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 2d  nter to the sub-
8070: 76 64 62 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  vdbe containing 
8080: 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
8090: 72 61 6d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ram.  */.  if( p
80a0: 50 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  Prg ){.    int b
80b0: 52 65 63 75 72 73 69 76 65 20 3d 20 28 70 2d 3e  Recursive = (p->
80c0: 7a 4e 61 6d 65 20 26 26 20 30 3d 3d 28 70 50 61  zName && 0==(pPa
80d0: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  rse->db->flags&S
80e0: 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72  QLITE_RecTrigger
80f0: 73 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s));..    sqlite
8100: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8110: 50 5f 50 72 6f 67 72 61 6d 2c 20 72 65 67 2c 20  P_Program, reg, 
8120: 69 67 6e 6f 72 65 4a 75 6d 70 2c 20 2b 2b 70 50  ignoreJump, ++pP
8130: 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20  arse->nMem);.   
8140: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8150: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
8160: 73 74 20 63 68 61 72 20 2a 29 70 50 72 67 2d 3e  st char *)pPrg->
8170: 70 50 72 6f 67 72 61 6d 2c 20 50 34 5f 53 55 42  pProgram, P4_SUB
8180: 50 52 4f 47 52 41 4d 29 3b 0a 20 20 20 20 56 64  PROGRAM);.    Vd
8190: 62 65 43 6f 6d 6d 65 6e 74 28 0a 20 20 20 20 20  beComment(.     
81a0: 20 20 20 28 76 2c 20 22 43 61 6c 6c 3a 20 25 73     (v, "Call: %s
81b0: 2e 25 73 22 2c 20 28 70 2d 3e 7a 4e 61 6d 65 3f  .%s", (p->zName?
81c0: 70 2d 3e 7a 4e 61 6d 65 3a 22 66 6b 65 79 22 29  p->zName:"fkey")
81d0: 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72  , onErrorText(or
81e0: 63 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 2f 2a  conf)));..    /*
81f0: 20 53 65 74 20 74 68 65 20 50 35 20 6f 70 65 72   Set the P5 oper
8200: 61 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f 50 72  and of the OP_Pr
8210: 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f  ogram instructio
8220: 6e 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  n to non-zero if
8230: 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76  .    ** recursiv
8240: 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20  e invocation of 
8250: 74 68 69 73 20 74 72 69 67 67 65 72 20 70 72 6f  this trigger pro
8260: 67 72 61 6d 20 69 73 20 64 69 73 61 6c 6c 6f 77  gram is disallow
8270: 65 64 2e 20 52 65 63 75 72 73 69 76 65 0a 20 20  ed. Recursive.  
8280: 20 20 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20    ** invocation 
8290: 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 69 66  is disallowed if
82a0: 20 28 61 29 20 74 68 65 20 73 75 62 2d 70 72 6f   (a) the sub-pro
82b0: 67 72 61 6d 20 69 73 20 72 65 61 6c 6c 79 20 61  gram is really a
82c0: 20 74 72 69 67 67 65 72 2c 0a 20 20 20 20 2a 2a   trigger,.    **
82d0: 20 6e 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b   not a foreign k
82e0: 65 79 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 28  ey action, and (
82f0: 62 29 20 74 68 65 20 66 6c 61 67 20 74 6f 20 65  b) the flag to e
8300: 6e 61 62 6c 65 20 72 65 63 75 72 73 69 76 65 20  nable recursive 
8310: 74 72 69 67 67 65 72 73 0a 20 20 20 20 2a 2a 20  triggers.    ** 
8320: 69 73 20 63 6c 65 61 72 2e 20 20 2a 2f 0a 20 20  is clear.  */.  
8330: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
8340: 6e 67 65 50 35 28 76 2c 20 28 75 38 29 62 52 65  ngeP5(v, (u8)bRe
8350: 63 75 72 73 69 76 65 29 3b 0a 20 20 7d 0a 7d 0a  cursive);.  }.}.
8360: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
8370: 61 6c 6c 65 64 20 74 6f 20 63 6f 64 65 20 74 68  alled to code th
8380: 65 20 72 65 71 75 69 72 65 64 20 46 4f 52 20 45  e required FOR E
8390: 41 43 48 20 52 4f 57 20 74 72 69 67 67 65 72 73  ACH ROW triggers
83a0: 20 66 6f 72 20 61 6e 20 6f 70 65 72 61 74 69 6f   for an operatio
83b0: 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 20 70 54  n.** on table pT
83c0: 61 62 2e 20 54 68 65 20 6f 70 65 72 61 74 69 6f  ab. The operatio
83d0: 6e 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65  n to code trigge
83e0: 72 73 20 66 6f 72 20 28 49 4e 53 45 52 54 2c 20  rs for (INSERT, 
83f0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
8400: 29 0a 2a 2a 20 69 73 20 67 69 76 65 6e 20 62 79  ).** is given by
8410: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 61 74 65   the op paramate
8420: 72 2e 20 54 68 65 20 74 72 5f 74 6d 20 70 61 72  r. The tr_tm par
8430: 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
8440: 73 20 77 68 65 74 68 65 72 20 74 68 65 0a 2a 2a  s whether the.**
8450: 20 42 45 46 4f 52 45 20 6f 72 20 41 46 54 45 52   BEFORE or AFTER
8460: 20 74 72 69 67 67 65 72 73 20 61 72 65 20 63 6f   triggers are co
8470: 64 65 64 2e 20 49 66 20 74 68 65 20 6f 70 65 72  ded. If the oper
8480: 61 74 69 6f 6e 20 69 73 20 61 6e 20 55 50 44 41  ation is an UPDA
8490: 54 45 2c 20 74 68 65 6e 0a 2a 2a 20 70 61 72 61  TE, then.** para
84a0: 6d 65 74 65 72 20 70 43 68 61 6e 67 65 73 20 69  meter pChanges i
84b0: 73 20 70 61 73 73 65 64 20 74 68 65 20 6c 69 73  s passed the lis
84c0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 62 65 69  t of columns bei
84d0: 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ng modified..**.
84e0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
84f0: 6e 6f 20 74 72 69 67 67 65 72 73 20 74 68 61 74  no triggers that
8500: 20 66 69 72 65 20 61 74 20 74 68 65 20 73 70 65   fire at the spe
8510: 63 69 66 69 65 64 20 74 69 6d 65 20 66 6f 72 20  cified time for 
8520: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
8530: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 70 54   operation on pT
8540: 61 62 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ab, this functio
8550: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
8560: 0a 2a 2a 20 54 68 65 20 72 65 67 20 61 72 67 75  .** The reg argu
8570: 6d 65 6e 74 20 69 73 20 74 68 65 20 61 64 64 72  ment is the addr
8580: 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74  ess of the first
8590: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
85a0: 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68  registers .** th
85b0: 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 76  at contain the v
85c0: 61 6c 75 65 73 20 73 75 62 73 74 69 74 75 74 65  alues substitute
85d0: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 2e 2a 20  d for the new.* 
85e0: 61 6e 64 20 6f 6c 64 2e 2a 20 72 65 66 65 72 65  and old.* refere
85f0: 6e 63 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 74  nces.** in the t
8600: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20  rigger program. 
8610: 49 66 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  If N is the numb
8620: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
8630: 20 74 61 62 6c 65 20 70 54 61 62 0a 2a 2a 20 28   table pTab.** (
8640: 61 20 63 6f 70 79 20 6f 66 20 70 54 61 62 2d 3e  a copy of pTab->
8650: 6e 43 6f 6c 29 2c 20 74 68 65 6e 20 72 65 67 69  nCol), then regi
8660: 73 74 65 72 73 20 61 72 65 20 70 6f 70 75 6c 61  sters are popula
8670: 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
8680: 2a 2a 0a 2a 2a 20 20 20 52 65 67 69 73 74 65 72  **.**   Register
8690: 20 20 20 20 20 20 20 43 6f 6e 74 61 69 6e 73 0a         Contains.
86a0: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
86b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
86e0: 20 72 65 67 2b 30 20 20 20 20 20 20 20 20 20 20   reg+0          
86f0: 4f 4c 44 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72  OLD.rowid.**   r
8700: 65 67 2b 31 20 20 20 20 20 20 20 20 20 20 4f 4c  eg+1          OL
8710: 44 2e 2a 20 76 61 6c 75 65 20 6f 66 20 6c 65 66  D.* value of lef
8720: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
8730: 20 70 54 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20   pTab.**   ...  
8740: 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
8750: 20 20 20 72 65 67 2b 4e 20 20 20 20 20 20 20 20     reg+N        
8760: 20 20 4f 4c 44 2e 2a 20 76 61 6c 75 65 20 6f 66    OLD.* value of
8770: 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
8780: 6d 6e 20 6f 66 20 70 54 61 62 0a 2a 2a 20 20 20  mn of pTab.**   
8790: 72 65 67 2b 4e 2b 31 20 20 20 20 20 20 20 20 4e  reg+N+1        N
87a0: 45 57 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72 65  EW.rowid.**   re
87b0: 67 2b 4e 2b 32 20 20 20 20 20 20 20 20 4f 4c 44  g+N+2        OLD
87c0: 2e 2a 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74  .* value of left
87d0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
87e0: 70 54 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20  pTab.**   ...   
87f0: 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
8800: 20 20 72 65 67 2b 4e 2b 4e 2b 31 20 20 20 20 20    reg+N+N+1     
8810: 20 4e 45 57 2e 2a 20 76 61 6c 75 65 20 6f 66 20   NEW.* value of 
8820: 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
8830: 6e 20 6f 66 20 70 54 61 62 0a 2a 2a 0a 2a 2a 20  n of pTab.**.** 
8840: 46 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 74 72  For ON DELETE tr
8850: 69 67 67 65 72 73 2c 20 74 68 65 20 72 65 67 69  iggers, the regi
8860: 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67  sters containing
8870: 20 74 68 65 20 4e 45 57 2e 2a 20 76 61 6c 75 65   the NEW.* value
8880: 73 20 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20  s will.** never 
8890: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
88a0: 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  he trigger progr
88b0: 61 6d 2c 20 73 6f 20 74 68 65 79 20 61 72 65 20  am, so they are 
88c0: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  not allocated or
88d0: 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 64 20 62   .** populated b
88e0: 79 20 74 68 65 20 63 61 6c 6c 65 72 20 28 74 68  y the caller (th
88f0: 65 72 65 20 69 73 20 6e 6f 20 64 61 74 61 20 74  ere is no data t
8900: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 6d 20  o populate them 
8910: 77 69 74 68 20 61 6e 79 77 61 79 29 2e 20 0a 2a  with anyway). .*
8920: 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 66 6f 72  * Similarly, for
8930: 20 4f 4e 20 49 4e 53 45 52 54 20 74 72 69 67 67   ON INSERT trigg
8940: 65 72 73 20 74 68 65 20 76 61 6c 75 65 73 20 73  ers the values s
8950: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 4f 4c 44  tored in the OLD
8960: 2e 2a 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  .* registers.** 
8970: 61 72 65 20 6e 65 76 65 72 20 61 63 63 65 73 73  are never access
8980: 65 64 2c 20 61 6e 64 20 73 6f 20 61 72 65 20 6e  ed, and so are n
8990: 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ot allocated by 
89a0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 6f 2c 20  the caller. So, 
89b0: 66 6f 72 20 61 6e 0a 2a 2a 20 4f 4e 20 49 4e 53  for an.** ON INS
89c0: 45 52 54 20 74 72 69 67 67 65 72 2c 20 74 68 65  ERT trigger, the
89d0: 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   value passed to
89e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
89f0: 73 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 0a  s parameter reg.
8a00: 2a 2a 20 69 73 20 6e 6f 74 20 61 20 72 65 61 64  ** is not a read
8a10: 61 62 6c 65 20 72 65 67 69 73 74 65 72 2c 20 61  able register, a
8a20: 6c 74 68 6f 75 67 68 20 72 65 67 69 73 74 65 72  lthough register
8a30: 73 20 28 72 65 67 2b 4e 29 20 74 68 72 6f 75 67  s (reg+N) throug
8a40: 68 20 0a 2a 2a 20 28 72 65 67 2b 4e 2b 4e 2b 31  h .** (reg+N+N+1
8a50: 29 20 61 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ) are..**.** Par
8a60: 61 6d 65 74 65 72 20 6f 72 63 6f 6e 66 20 69 73  ameter orconf is
8a70: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e   the default con
8a80: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
8a90: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 74   algorithm for t
8aa0: 68 65 0a 2a 2a 20 74 72 69 67 67 65 72 20 70 72  he.** trigger pr
8ab0: 6f 67 72 61 6d 20 74 6f 20 75 73 65 20 28 52 45  ogram to use (RE
8ac0: 50 4c 41 43 45 2c 20 49 47 4e 4f 52 45 20 65 74  PLACE, IGNORE et
8ad0: 63 2e 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69  c.). Parameter i
8ae0: 67 6e 6f 72 65 4a 75 6d 70 0a 2a 2a 20 69 73 20  gnoreJump.** is 
8af0: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
8b00: 74 68 61 74 20 63 6f 6e 74 72 6f 6c 20 73 68 6f  that control sho
8b10: 75 6c 64 20 6a 75 6d 70 20 74 6f 20 69 66 20 61  uld jump to if a
8b20: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
8b30: 0a 2a 2a 20 72 61 69 73 65 73 20 61 6e 20 49 47  .** raises an IG
8b40: 4e 4f 52 45 20 65 78 63 65 70 74 69 6f 6e 2e 0a  NORE exception..
8b50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
8b60: 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 0a 20  odeRowTrigger(. 
8b70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8b80: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
8b90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67  ontext */.  Trig
8ba0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20  ger *pTrigger,  
8bb0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67   /* List of trig
8bc0: 67 65 72 73 20 6f 6e 20 74 61 62 6c 65 20 70 54  gers on table pT
8bd0: 61 62 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  ab */.  int op, 
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8bf0: 4f 6e 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45  One of TK_UPDATE
8c00: 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f  , TK_INSERT, TK_
8c10: 44 45 4c 45 54 45 20 2a 2f 0a 20 20 45 78 70 72  DELETE */.  Expr
8c20: 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20  List *pChanges, 
8c30: 20 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74   /* Changes list
8c40: 20 66 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20   for any UPDATE 
8c50: 4f 46 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20  OF triggers */. 
8c60: 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20 20   int tr_tm,     
8c70: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
8c80: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 2c 20  TRIGGER_BEFORE, 
8c90: 54 52 49 47 47 45 52 5f 41 46 54 45 52 20 2a 2f  TRIGGER_AFTER */
8ca0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
8cb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
8cc0: 61 62 6c 65 20 74 6f 20 63 6f 64 65 20 74 72 69  able to code tri
8cd0: 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20 20  ggers from */.  
8ce0: 69 6e 74 20 72 65 67 2c 20 20 20 20 20 20 20 20  int reg,        
8cf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73       /* The firs
8d00: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
8d10: 20 72 65 67 69 73 74 65 72 73 20 28 73 65 65 20   registers (see 
8d20: 61 62 6f 76 65 29 20 2a 2f 0a 20 20 69 6e 74 20  above) */.  int 
8d30: 6f 72 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20  orconf,         
8d40: 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   /* ON CONFLICT 
8d50: 70 6f 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20  policy */.  int 
8d60: 69 67 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20 20  ignoreJump      
8d70: 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20   /* Instruction 
8d80: 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52  to jump to for R
8d90: 41 49 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a  AISE(IGNORE) */.
8da0: 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 3b  ){.  Trigger *p;
8db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8dc0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8dd0: 6f 75 67 68 20 70 54 72 69 67 67 65 72 20 6c 69  ough pTrigger li
8de0: 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
8df0: 20 6f 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 7c   op==TK_UPDATE |
8e00: 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20  | op==TK_INSERT 
8e10: 7c 7c 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45  || op==TK_DELETE
8e20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
8e30: 5f 74 6d 3d 3d 54 52 49 47 47 45 52 5f 42 45 46  _tm==TRIGGER_BEF
8e40: 4f 52 45 20 7c 7c 20 74 72 5f 74 6d 3d 3d 54 52  ORE || tr_tm==TR
8e50: 49 47 47 45 52 5f 41 46 54 45 52 20 29 3b 0a 20  IGGER_AFTER );. 
8e60: 20 61 73 73 65 72 74 28 20 28 6f 70 3d 3d 54 4b   assert( (op==TK
8e70: 5f 55 50 44 41 54 45 29 3d 3d 28 70 43 68 61 6e  _UPDATE)==(pChan
8e80: 67 65 73 21 3d 30 29 20 29 3b 0a 0a 20 20 66 6f  ges!=0) );..  fo
8e90: 72 28 70 3d 70 54 72 69 67 67 65 72 3b 20 70 3b  r(p=pTrigger; p;
8ea0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 0a 20   p=p->pNext){.. 
8eb0: 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65     /* Sanity che
8ec0: 63 6b 69 6e 67 3a 20 20 54 68 65 20 73 63 68 65  cking:  The sche
8ed0: 6d 61 20 66 6f 72 20 74 68 65 20 74 72 69 67 67  ma for the trigg
8ee0: 65 72 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74  er and for the t
8ef0: 61 62 6c 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  able are.    ** 
8f00: 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 2e 20  always defined. 
8f10: 20 54 68 65 20 74 72 69 67 67 65 72 20 6d 75 73   The trigger mus
8f20: 74 20 62 65 20 69 6e 20 74 68 65 20 73 61 6d 65  t be in the same
8f30: 20 73 63 68 65 6d 61 20 61 73 20 74 68 65 20 74   schema as the t
8f40: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6f 72 20 65  able.    ** or e
8f50: 6c 73 65 20 69 74 20 6d 75 73 74 20 62 65 20 61  lse it must be a
8f60: 20 54 45 4d 50 20 74 72 69 67 67 65 72 2e 20 2a   TEMP trigger. *
8f70: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
8f80: 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20  >pSchema!=0 );. 
8f90: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54     assert( p->pT
8fa0: 61 62 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20  abSchema!=0 );. 
8fb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53     assert( p->pS
8fc0: 63 68 65 6d 61 3d 3d 70 2d 3e 70 54 61 62 53 63  chema==p->pTabSc
8fd0: 68 65 6d 61 20 0a 20 20 20 20 20 20 20 20 20 7c  hema .         |
8fe0: 7c 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 50  | p->pSchema==pP
8ff0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d  arse->db->aDb[1]
9000: 2e 70 53 63 68 65 6d 61 20 29 3b 0a 0a 20 20 20  .pSchema );..   
9010: 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68   /* Determine wh
9020: 65 74 68 65 72 20 77 65 20 73 68 6f 75 6c 64 20  ether we should 
9030: 63 6f 64 65 20 74 68 69 73 20 74 72 69 67 67 65  code this trigge
9040: 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  r */.    if( p->
9050: 6f 70 3d 3d 6f 70 20 0a 20 20 20 20 20 26 26 20  op==op .     && 
9060: 70 2d 3e 74 72 5f 74 6d 3d 3d 74 72 5f 74 6d 20  p->tr_tm==tr_tm 
9070: 0a 20 20 20 20 20 26 26 20 63 68 65 63 6b 43 6f  .     && checkCo
9080: 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70  lumnOverlap(p->p
9090: 43 6f 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67 65  Columns, pChange
90a0: 73 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  s).    ){.      
90b0: 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72  sqlite3CodeRowTr
90c0: 69 67 67 65 72 44 69 72 65 63 74 28 70 50 61 72  iggerDirect(pPar
90d0: 73 65 2c 20 70 2c 20 70 54 61 62 2c 20 72 65 67  se, p, pTab, reg
90e0: 2c 20 6f 72 63 6f 6e 66 2c 20 69 67 6e 6f 72 65  , orconf, ignore
90f0: 4a 75 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Jump);.    }.  }
9100: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 69 67 67 65  .}../*.** Trigge
9110: 72 73 20 6d 61 79 20 61 63 63 65 73 73 20 76 61  rs may access va
9120: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
9130: 68 65 20 6f 6c 64 2e 2a 20 6f 72 20 6e 65 77 2e  he old.* or new.
9140: 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
9150: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9160: 6e 20 72 65 74 75 72 6e 73 20 61 20 33 32 2d 62  n returns a 32-b
9170: 69 74 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63  it bitmask indic
9180: 61 74 69 6e 67 20 77 68 69 63 68 20 63 6f 6c 75  ating which colu
9190: 6d 6e 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f  mns of the .** o
91a0: 6c 64 2e 2a 20 6f 72 20 6e 65 77 2e 2a 20 74 61  ld.* or new.* ta
91b0: 62 6c 65 73 20 61 63 74 75 61 6c 6c 79 20 61 72  bles actually ar
91c0: 65 20 75 73 65 64 20 62 79 20 74 72 69 67 67 65  e used by trigge
91d0: 72 73 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  rs. This informa
91e0: 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20  tion .** may be 
91f0: 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
9200: 65 72 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  er, for example,
9210: 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67   to avoid having
9220: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 6e 74   to load the ent
9230: 69 72 65 0a 2a 2a 20 6f 6c 64 2e 2a 20 72 65 63  ire.** old.* rec
9240: 6f 72 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ord into memory 
9250: 77 68 65 6e 20 65 78 65 63 75 74 69 6e 67 20 61  when executing a
9260: 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
9270: 54 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  TE command..**.*
9280: 2a 20 42 69 74 20 30 20 6f 66 20 74 68 65 20 72  * Bit 0 of the r
9290: 65 74 75 72 6e 65 64 20 6d 61 73 6b 20 69 73 20  eturned mask is 
92a0: 73 65 74 20 69 66 20 74 68 65 20 6c 65 66 74 2d  set if the left-
92b0: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
92c0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20  he.** table may 
92d0: 62 65 20 61 63 63 65 73 73 65 64 20 75 73 69 6e  be accessed usin
92e0: 67 20 61 6e 20 5b 6f 6c 64 7c 6e 65 77 5d 2e 3c  g an [old|new].<
92f0: 63 6f 6c 3e 20 72 65 66 65 72 65 6e 63 65 2e 20  col> reference. 
9300: 42 69 74 20 31 20 69 73 20 73 65 74 20 69 66 0a  Bit 1 is set if.
9310: 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65  ** the second le
9320: 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 76 61  ftmost column va
9330: 6c 75 65 20 69 73 20 72 65 71 75 69 72 65 64 2c  lue is required,
9340: 20 61 6e 64 20 73 6f 20 6f 6e 2e 20 49 66 20 74   and so on. If t
9350: 68 65 72 65 0a 2a 2a 20 61 72 65 20 6d 6f 72 65  here.** are more
9360: 20 74 68 61 6e 20 33 32 20 63 6f 6c 75 6d 6e 73   than 32 columns
9370: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61   in the table, a
9380: 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  nd at least one 
9390: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 2a  of the columns.*
93a0: 2a 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  * with an index 
93b0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 33 32 20  greater than 32 
93c0: 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64 2c  may be accessed,
93d0: 20 30 78 66 66 66 66 66 66 66 66 20 69 73 20 72   0xffffffff is r
93e0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
93f0: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
9400: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  e to determine i
9410: 66 20 74 68 65 20 6f 6c 64 2e 72 6f 77 69 64 20  f the old.rowid 
9420: 6f 72 20 6e 65 77 2e 72 6f 77 69 64 20 63 6f 6c  or new.rowid col
9430: 75 6d 6e 20 69 73 20 0a 2a 2a 20 61 63 63 65 73  umn is .** acces
9440: 73 65 64 20 62 79 20 74 72 69 67 67 65 72 73 2e  sed by triggers.
9450: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
9460: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74   always assume t
9470: 68 61 74 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a  hat it is..**.**
9480: 20 50 61 72 61 6d 65 74 65 72 20 69 73 4e 65 77   Parameter isNew
9490: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
94a0: 31 20 6f 72 20 30 2e 20 49 66 20 69 74 20 69 73  1 or 0. If it is
94b0: 20 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 73   0, then the mas
94c0: 6b 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 70  k returned.** ap
94d0: 70 6c 69 65 73 20 74 6f 20 74 68 65 20 6f 6c 64  plies to the old
94e0: 2e 2a 20 74 61 62 6c 65 2e 20 49 66 20 31 2c 20  .* table. If 1, 
94f0: 74 68 65 20 6e 65 77 2e 2a 20 74 61 62 6c 65 2e  the new.* table.
9500: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
9510: 20 74 72 5f 74 6d 20 6d 75 73 74 20 62 65 20 61   tr_tm must be a
9520: 20 6d 61 73 6b 20 77 69 74 68 20 6f 6e 65 20 6f   mask with one o
9530: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 54 52  r both of the TR
9540: 49 47 47 45 52 5f 42 45 46 4f 52 45 0a 2a 2a 20  IGGER_BEFORE.** 
9550: 61 6e 64 20 54 52 49 47 47 45 52 5f 41 46 54 45  and TRIGGER_AFTE
9560: 52 20 62 69 74 73 20 73 65 74 2e 20 56 61 6c 75  R bits set. Valu
9570: 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20 42  es accessed by B
9580: 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 20 61  EFORE triggers a
9590: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63 6c 75  re only.** inclu
95a0: 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
95b0: 6e 65 64 20 6d 61 73 6b 20 69 66 20 74 68 65 20  ned mask if the 
95c0: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 62  TRIGGER_BEFORE b
95d0: 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
95e0: 0a 2a 2a 20 74 72 5f 74 6d 20 70 61 72 61 6d 65  .** tr_tm parame
95f0: 74 65 72 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ter. Similarly, 
9600: 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64 20  values accessed 
9610: 62 79 20 41 46 54 45 52 20 74 72 69 67 67 65 72  by AFTER trigger
9620: 73 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 69 6e  s are only.** in
9630: 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
9640: 74 75 72 6e 65 64 20 6d 61 73 6b 20 69 66 20 74  turned mask if t
9650: 68 65 20 54 52 49 47 47 45 52 5f 41 46 54 45 52  he TRIGGER_AFTER
9660: 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74   bit is set in t
9670: 72 5f 74 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  r_tm..*/.u32 sql
9680: 69 74 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61  ite3TriggerColma
9690: 73 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  sk(.  Parse *pPa
96a0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
96b0: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
96c0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
96d0: 65 72 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  er,   /* List of
96e0: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62   triggers on tab
96f0: 6c 65 20 70 54 61 62 20 2a 2f 0a 20 20 45 78 70  le pTab */.  Exp
9700: 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c  rList *pChanges,
9710: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69 73    /* Changes lis
9720: 74 20 66 6f 72 20 61 6e 79 20 55 50 44 41 54 45  t for any UPDATE
9730: 20 4f 46 20 74 72 69 67 67 65 72 73 20 2a 2f 0a   OF triggers */.
9740: 20 20 69 6e 74 20 69 73 4e 65 77 2c 20 20 20 20    int isNew,    
9750: 20 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20         /* 1 for 
9760: 6e 65 77 2e 2a 20 72 65 66 20 6d 61 73 6b 2c 20  new.* ref mask, 
9770: 30 20 66 6f 72 20 6f 6c 64 2e 2a 20 72 65 66 20  0 for old.* ref 
9780: 6d 61 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 74 72  mask */.  int tr
9790: 5f 74 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  _tm,           /
97a0: 2a 20 4d 61 73 6b 20 6f 66 20 54 52 49 47 47 45  * Mask of TRIGGE
97b0: 52 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52  R_BEFORE|TRIGGER
97c0: 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54 61 62 6c  _AFTER */.  Tabl
97d0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
97e0: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f   /* The table to
97f0: 20 63 6f 64 65 20 74 72 69 67 67 65 72 73 20 66   code triggers f
9800: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63  rom */.  int orc
9810: 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a  onf           /*
9820: 20 44 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e 46   Default ON CONF
9830: 4c 49 43 54 20 70 6f 6c 69 63 79 20 66 6f 72 20  LICT policy for 
9840: 74 72 69 67 67 65 72 20 73 74 65 70 73 20 2a 2f  trigger steps */
9850: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  .){.  const int 
9860: 6f 70 20 3d 20 70 43 68 61 6e 67 65 73 20 3f 20  op = pChanges ? 
9870: 54 4b 5f 55 50 44 41 54 45 20 3a 20 54 4b 5f 44  TK_UPDATE : TK_D
9880: 45 4c 45 54 45 3b 0a 20 20 75 33 32 20 6d 61 73  ELETE;.  u32 mas
9890: 6b 20 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72  k = 0;.  Trigger
98a0: 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
98b0: 69 73 4e 65 77 3d 3d 31 20 7c 7c 20 69 73 4e 65  isNew==1 || isNe
98c0: 77 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d  w==0 );.  for(p=
98d0: 70 54 72 69 67 67 65 72 3b 20 70 3b 20 70 3d 70  pTrigger; p; p=p
98e0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
98f0: 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 28  ( p->op==op && (
9900: 74 72 5f 74 6d 26 70 2d 3e 74 72 5f 74 6d 29 0a  tr_tm&p->tr_tm).
9910: 20 20 20 20 20 26 26 20 63 68 65 63 6b 43 6f 6c       && checkCol
9920: 75 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43  umnOverlap(p->pC
9930: 6f 6c 75 6d 6e 73 2c 70 43 68 61 6e 67 65 73 29  olumns,pChanges)
9940: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 54 72  .    ){.      Tr
9950: 69 67 67 65 72 50 72 67 20 2a 70 50 72 67 3b 0a  iggerPrg *pPrg;.
9960: 20 20 20 20 20 20 70 50 72 67 20 3d 20 67 65 74        pPrg = get
9970: 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73  RowTrigger(pPars
9980: 65 2c 20 70 2c 20 70 54 61 62 2c 20 6f 72 63 6f  e, p, pTab, orco
9990: 6e 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nf);.      if( p
99a0: 50 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  Prg ){.        m
99b0: 61 73 6b 20 7c 3d 20 70 50 72 67 2d 3e 61 43 6f  ask |= pPrg->aCo
99c0: 6c 6d 61 73 6b 5b 69 73 4e 65 77 5d 3b 0a 20 20  lmask[isNew];.  
99d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
99e0: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
99f0: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  }..#endif /* !de
9a00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9a10: 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a        T_TRIGGER) */.