/ Hex Artifact Content
Login

Artifact 3c48db13db94f3c34b01b7caae2130279c8f4d28:


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 70 4e 61 6d 65 32 2d  );.  if( pName2-
12f0: 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
1300: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d   pTab->pSchema==
1310: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
1320: 6d 61 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20  ma ){.    iDb = 
1330: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73  1;.  }..  /* Ens
1340: 75 72 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ure the table na
1350: 6d 65 20 6d 61 74 63 68 65 73 20 64 61 74 61 62  me matches datab
1360: 61 73 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 61  ase name and tha
1370: 74 20 74 68 65 20 74 61 62 6c 65 20 65 78 69 73  t the table exis
1380: 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ts */.  if( db->
1390: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
13a0: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
13b0: 6e 75 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nup;.  assert( p
13c0: 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e 53 72 63 3d  TableName->nSrc=
13d0: 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =1 );.  if( sqli
13e0: 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
13f0: 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
1400: 74 72 69 67 67 65 72 22 2c 20 70 4e 61 6d 65 29  trigger", pName)
1410: 20 26 26 20 0a 20 20 20 20 20 20 73 71 6c 69 74   && .      sqlit
1420: 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
1430: 69 78 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 20  ix, pTableName) 
1440: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67  ){.    goto trig
1450: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
1460: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
1470: 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
1480: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d  Parse, pTableNam
1490: 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20  e);.  if( !pTab 
14a0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ){.    /* The ta
14b0: 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ble does not exi
14c0: 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64  st. */.    if( d
14d0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
14e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  {.      /* Ticke
14f0: 74 20 23 33 38 31 30 2e 0a 20 20 20 20 20 20 2a  t #3810..      *
1500: 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65 6e  * Normally, when
1510: 65 76 65 72 20 61 20 74 61 62 6c 65 20 69 73 20  ever a table is 
1520: 64 72 6f 70 70 65 64 2c 20 61 6c 6c 20 61 73 73  dropped, all ass
1530: 6f 63 69 61 74 65 64 20 74 72 69 67 67 65 72 73  ociated triggers
1540: 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 64 72   are.      ** dr
1550: 6f 70 70 65 64 20 74 6f 6f 2e 20 20 42 75 74 20  opped too.  But 
1560: 69 66 20 61 20 54 45 4d 50 20 74 72 69 67 67 65  if a TEMP trigge
1570: 72 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 20  r is created on 
1580: 61 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65  a non-TEMP table
1590: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
15a0: 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
15b0: 65 64 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  ed by a differen
15c0: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  t database conne
15d0: 63 74 69 6f 6e 2c 20 74 68 65 0a 20 20 20 20 20  ction, the.     
15e0: 20 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20 6e   ** trigger is n
15f0: 6f 74 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68  ot visible to th
1600: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1610: 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20  ction that does 
1620: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 72 6f  the.      ** dro
1630: 70 20 73 6f 20 74 68 65 20 74 72 69 67 67 65 72  p so the trigger
1640: 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
1650: 65 64 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74  ed.  This result
1660: 73 20 69 6e 20 61 6e 0a 20 20 20 20 20 20 2a 2a  s in an.      **
1670: 20 22 6f 72 70 68 61 6e 65 64 20 74 72 69 67 67   "orphaned trigg
1680: 65 72 22 20 2d 20 61 20 74 72 69 67 67 65 72 20  er" - a trigger 
1690: 77 68 6f 73 65 20 61 73 73 6f 63 69 61 74 65 64  whose associated
16a0: 20 74 61 62 6c 65 20 69 73 20 6d 69 73 73 69 6e   table is missin
16b0: 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
16c0: 20 20 64 62 2d 3e 69 6e 69 74 2e 6f 72 70 68 61    db->init.orpha
16d0: 6e 54 72 69 67 67 65 72 20 3d 20 31 3b 0a 20 20  nTrigger = 1;.  
16e0: 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 74 72 69    }.    goto tri
16f0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
1700: 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  }.  if( IsVirtua
1710: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
1720: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1730: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
1740: 72 65 61 74 65 20 74 72 69 67 67 65 72 73 20 6f  reate triggers o
1750: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n virtual tables
1760: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69  ");.    goto tri
1770: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
1780: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  }..  /* Check th
1790: 61 74 20 74 68 65 20 74 72 69 67 67 65 72 20 6e  at the trigger n
17a0: 61 6d 65 20 69 73 20 6e 6f 74 20 72 65 73 65 72  ame is not reser
17b0: 76 65 64 20 61 6e 64 20 74 68 61 74 20 6e 6f 20  ved and that no 
17c0: 74 72 69 67 67 65 72 20 6f 66 20 74 68 65 0a 20  trigger of the. 
17d0: 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 61   ** specified na
17e0: 6d 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 7a  me exists */.  z
17f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1800: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1810: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a  pName);.  if( !z
1820: 4e 61 6d 65 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  Name || SQLITE_O
1830: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
1840: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
1850: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
1860: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
1870: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20  anup;.  }.  if( 
1880: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
1890: 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  &(db->aDb[iDb].p
18a0: 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68  Schema->trigHash
18b0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
18c0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
18d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18e0: 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 69  zName)) ){.    i
18f0: 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20  f( !noErr ){.   
1900: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1910: 73 67 28 70 50 61 72 73 65 2c 20 22 74 72 69 67  sg(pParse, "trig
1920: 67 65 72 20 25 54 20 61 6c 72 65 61 64 79 20 65  ger %T already e
1930: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
1940: 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 74      }.    goto t
1950: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
1960: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74    }..  /* Do not
1970: 20 63 72 65 61 74 65 20 61 20 74 72 69 67 67 65   create a trigge
1980: 72 20 6f 6e 20 61 20 73 79 73 74 65 6d 20 74 61  r on a system ta
1990: 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ble */.  if( sql
19a0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
19b0: 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
19c0: 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  e_", 7)==0 ){.  
19d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19e0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
19f0: 74 20 63 72 65 61 74 65 20 74 72 69 67 67 65 72  t create trigger
1a00: 20 6f 6e 20 73 79 73 74 65 6d 20 74 61 62 6c 65   on system table
1a10: 22 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ");.    pParse->
1a20: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
1a30: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1a40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 4e 53 54  ;.  }..  /* INST
1a50: 45 41 44 20 6f 66 20 74 72 69 67 67 65 72 73 20  EAD of triggers 
1a60: 61 72 65 20 6f 6e 6c 79 20 66 6f 72 20 76 69 65  are only for vie
1a70: 77 73 20 61 6e 64 20 76 69 65 77 73 20 6f 6e 6c  ws and views onl
1a80: 79 20 73 75 70 70 6f 72 74 20 49 4e 53 54 45 41  y support INSTEA
1a90: 44 0a 20 20 2a 2a 20 6f 66 20 74 72 69 67 67 65  D.  ** of trigge
1aa0: 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rs..  */.  if( p
1ab0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
1ac0: 74 72 5f 74 6d 21 3d 54 4b 5f 49 4e 53 54 45 41  tr_tm!=TK_INSTEA
1ad0: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
1ae0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1af0: 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "cannot create 
1b00: 25 73 20 74 72 69 67 67 65 72 20 6f 6e 20 76 69  %s trigger on vi
1b10: 65 77 3a 20 25 53 22 2c 20 0a 20 20 20 20 20 20  ew: %S", .      
1b20: 20 20 28 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 42    (tr_tm == TK_B
1b30: 45 46 4f 52 45 29 3f 22 42 45 46 4f 52 45 22 3a  EFORE)?"BEFORE":
1b40: 22 41 46 54 45 52 22 2c 20 70 54 61 62 6c 65 4e  "AFTER", pTableN
1b50: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ame, 0);.    got
1b60: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1b70: 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 54  p;.  }.  if( !pT
1b80: 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 74  ab->pSelect && t
1b90: 72 5f 74 6d 3d 3d 54 4b 5f 49 4e 53 54 45 41 44  r_tm==TK_INSTEAD
1ba0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1bb0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1bc0: 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 49  "cannot create I
1bd0: 4e 53 54 45 41 44 20 4f 46 22 0a 20 20 20 20 20  NSTEAD OF".     
1be0: 20 20 20 22 20 74 72 69 67 67 65 72 20 6f 6e 20     " trigger on 
1bf0: 74 61 62 6c 65 3a 20 25 53 22 2c 20 70 54 61 62  table: %S", pTab
1c00: 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  leName, 0);.    
1c10: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
1c20: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 54 61 62  anup;.  }.  iTab
1c30: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
1c40: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
1c50: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23  ab->pSchema);..#
1c60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c70: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1c80: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
1c90: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
1ca0: 45 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 63  E_TRIGGER;.    c
1cb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
1cc0: 20 64 62 2d 3e 61 44 62 5b 69 54 61 62 44 62 5d   db->aDb[iTabDb]
1cd0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
1ce0: 74 20 63 68 61 72 20 2a 7a 44 62 54 72 69 67 20  t char *zDbTrig 
1cf0: 3d 20 69 73 54 65 6d 70 20 3f 20 64 62 2d 3e 61  = isTemp ? db->a
1d00: 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3a 20 7a 44  Db[1].zName : zD
1d10: 62 3b 0a 20 20 20 20 69 66 28 20 69 54 61 62 44  b;.    if( iTabD
1d20: 62 3d 3d 31 20 7c 7c 20 69 73 54 65 6d 70 20 29  b==1 || isTemp )
1d30: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
1d40: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
1d50: 45 52 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ER;.    if( sqli
1d60: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1d70: 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65  rse, code, zName
1d80: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
1d90: 44 62 54 72 69 67 29 20 29 7b 0a 20 20 20 20 20  DbTrig) ){.     
1da0: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
1db0: 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20  eanup;.    }.   
1dc0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1dd0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1de0: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
1df0: 45 4d 41 5f 54 41 42 4c 45 28 69 54 61 62 44 62  EMA_TABLE(iTabDb
1e00: 29 2c 30 2c 7a 44 62 29 29 7b 0a 20 20 20 20 20  ),0,zDb)){.     
1e10: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
1e20: 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  eanup;.    }.  }
1e30: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 4e  .#endif..  /* IN
1e40: 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65 72  STEAD OF trigger
1e50: 73 20 63 61 6e 20 6f 6e 6c 79 20 61 70 70 65 61  s can only appea
1e60: 72 20 6f 6e 20 76 69 65 77 73 20 61 6e 64 20 42  r on views and B
1e70: 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 0a 20  EFORE triggers. 
1e80: 20 2a 2a 20 63 61 6e 6e 6f 74 20 61 70 70 65 61   ** cannot appea
1e90: 72 20 6f 6e 20 76 69 65 77 73 2e 20 20 53 6f 20  r on views.  So 
1ea0: 77 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c  we might as well
1eb0: 20 74 72 61 6e 73 6c 61 74 65 20 65 76 65 72 79   translate every
1ec0: 0a 20 20 2a 2a 20 49 4e 53 54 45 41 44 20 4f 46  .  ** INSTEAD OF
1ed0: 20 74 72 69 67 67 65 72 20 69 6e 74 6f 20 61 20   trigger into a 
1ee0: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 2e 20  BEFORE trigger. 
1ef0: 20 49 74 20 73 69 6d 70 6c 69 66 69 65 73 20 63   It simplifies c
1f00: 6f 64 65 0a 20 20 2a 2a 20 65 6c 73 65 77 68 65  ode.  ** elsewhe
1f10: 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 74  re..  */.  if (t
1f20: 72 5f 74 6d 20 3d 3d 20 54 4b 5f 49 4e 53 54 45  r_tm == TK_INSTE
1f30: 41 44 29 7b 0a 20 20 20 20 74 72 5f 74 6d 20 3d  AD){.    tr_tm =
1f40: 20 54 4b 5f 42 45 46 4f 52 45 3b 0a 20 20 7d 0a   TK_BEFORE;.  }.
1f50: 0a 20 20 2f 2a 20 42 75 69 6c 64 20 74 68 65 20  .  /* Build the 
1f60: 54 72 69 67 67 65 72 20 6f 62 6a 65 63 74 20 2a  Trigger object *
1f70: 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 28  /.  pTrigger = (
1f80: 54 72 69 67 67 65 72 2a 29 73 71 6c 69 74 65 33  Trigger*)sqlite3
1f90: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1fa0: 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 29   sizeof(Trigger)
1fb0: 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  );.  if( pTrigge
1fc0: 72 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72 69 67  r==0 ) goto trig
1fd0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70  ger_cleanup;.  p
1fe0: 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 20 3d  Trigger->zName =
1ff0: 20 7a 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20   zName;.  zName 
2000: 3d 20 30 3b 0a 20 20 70 54 72 69 67 67 65 72 2d  = 0;.  pTrigger-
2010: 3e 74 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  >table = sqlite3
2020: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 54 61  DbStrDup(db, pTa
2030: 62 6c 65 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  bleName->a[0].zN
2040: 61 6d 65 29 3b 0a 20 20 70 54 72 69 67 67 65 72  ame);.  pTrigger
2050: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
2060: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
2070: 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70 54  ;.  pTrigger->pT
2080: 61 62 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d  abSchema = pTab-
2090: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 72 69  >pSchema;.  pTri
20a0: 67 67 65 72 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  gger->op = (u8)o
20b0: 70 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 74  p;.  pTrigger->t
20c0: 72 5f 74 6d 20 3d 20 74 72 5f 74 6d 3d 3d 54 4b  r_tm = tr_tm==TK
20d0: 5f 42 45 46 4f 52 45 20 3f 20 54 52 49 47 47 45  _BEFORE ? TRIGGE
20e0: 52 5f 42 45 46 4f 52 45 20 3a 20 54 52 49 47 47  R_BEFORE : TRIGG
20f0: 45 52 5f 41 46 54 45 52 3b 0a 20 20 70 54 72 69  ER_AFTER;.  pTri
2100: 67 67 65 72 2d 3e 70 57 68 65 6e 20 3d 20 73 71  gger->pWhen = sq
2110: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
2120: 20 70 57 68 65 6e 2c 20 45 58 50 52 44 55 50 5f   pWhen, EXPRDUP_
2130: 52 45 44 55 43 45 29 3b 0a 20 20 70 54 72 69 67  REDUCE);.  pTrig
2140: 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 20 3d 20  ger->pColumns = 
2150: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
2160: 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a  (db, pColumns);.
2170: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2180: 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 3d 3d 30  ->pNewTrigger==0
2190: 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e   );.  pParse->pN
21a0: 65 77 54 72 69 67 67 65 72 20 3d 20 70 54 72 69  ewTrigger = pTri
21b0: 67 67 65 72 3b 0a 0a 74 72 69 67 67 65 72 5f 63  gger;..trigger_c
21c0: 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
21d0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
21e0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  e);.  sqlite3Src
21f0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2200: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 73 71  TableName);.  sq
2210: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
2220: 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b  e(db, pColumns);
2230: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
2240: 6c 65 74 65 28 64 62 2c 20 70 57 68 65 6e 29 3b  lete(db, pWhen);
2250: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
2260: 70 4e 65 77 54 72 69 67 67 65 72 20 29 7b 0a 20  pNewTrigger ){. 
2270: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
2280: 54 72 69 67 67 65 72 28 64 62 2c 20 70 54 72 69  Trigger(db, pTri
2290: 67 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gger);.  }else{.
22a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
22b0: 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 3d  se->pNewTrigger=
22c0: 3d 70 54 72 69 67 67 65 72 20 29 3b 0a 20 20 7d  =pTrigger );.  }
22d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
22e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
22f0: 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
2300: 65 20 74 72 69 67 67 65 72 20 61 63 74 69 6f 6e  e trigger action
2310: 73 20 68 61 76 65 20 62 65 65 6e 20 70 61 72 73  s have been pars
2320: 65 64 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  ed.** in order t
2330: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70  o complete the p
2340: 72 6f 63 65 73 73 20 6f 66 20 62 75 69 6c 64 69  rocess of buildi
2350: 6e 67 20 74 68 65 20 74 72 69 67 67 65 72 2e 0a  ng the trigger..
2360: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
2370: 69 6e 69 73 68 54 72 69 67 67 65 72 28 0a 20 20  inishTrigger(.  
2380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2390: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
23a0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
23b0: 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65  riggerStep *pSte
23c0: 70 4c 69 73 74 2c 20 2f 2a 20 54 68 65 20 74 72  pList, /* The tr
23d0: 69 67 67 65 72 65 64 20 70 72 6f 67 72 61 6d 20  iggered program 
23e0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 6c  */.  Token *pAll
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2400: 54 6f 6b 65 6e 20 74 68 61 74 20 64 65 73 63 72  Token that descr
2410: 69 62 65 73 20 74 68 65 20 63 6f 6d 70 6c 65 74  ibes the complet
2420: 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  e CREATE TRIGGER
2430: 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72   */.){.  Trigger
2440: 20 2a 70 54 72 69 67 20 3d 20 70 50 61 72 73 65   *pTrig = pParse
2450: 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 3b 20 20  ->pNewTrigger;  
2460: 20 20 2f 2a 20 54 72 69 67 67 65 72 20 62 65 69    /* Trigger bei
2470: 6e 67 20 66 69 6e 69 73 68 65 64 20 2a 2f 0a 20  ng finished */. 
2480: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
24b0: 65 20 6f 66 20 74 72 69 67 67 65 72 20 2a 2f 0a  e of trigger */.
24c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
24d0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
24e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24f0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2500: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
2510: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2530: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2540: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
2550: 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a 20  the trigger */. 
2560: 20 54 6f 6b 65 6e 20 6e 61 6d 65 54 6f 6b 65 6e   Token nameToken
2570: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2580: 72 69 67 67 65 72 20 6e 61 6d 65 20 66 6f 72 20  rigger name for 
2590: 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 20  error reporting 
25a0: 2a 2f 0a 0a 20 20 70 54 72 69 67 20 3d 20 70 50  */..  pTrig = pP
25b0: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
25c0: 72 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  r;.  pParse->pNe
25d0: 77 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20  wTrigger = 0;.  
25e0: 69 66 28 20 4e 45 56 45 52 28 70 50 61 72 73 65  if( NEVER(pParse
25f0: 2d 3e 6e 45 72 72 29 20 7c 7c 20 21 70 54 72 69  ->nErr) || !pTri
2600: 67 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72  g ) goto trigger
2610: 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a  finish_cleanup;.
2620: 20 20 7a 4e 61 6d 65 20 3d 20 70 54 72 69 67 2d    zName = pTrig-
2630: 3e 7a 4e 61 6d 65 3b 0a 20 20 69 44 62 20 3d 20  >zName;.  iDb = 
2640: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
2650: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
2660: 20 70 54 72 69 67 2d 3e 70 53 63 68 65 6d 61 29   pTrig->pSchema)
2670: 3b 0a 20 20 70 54 72 69 67 2d 3e 73 74 65 70 5f  ;.  pTrig->step_
2680: 6c 69 73 74 20 3d 20 70 53 74 65 70 4c 69 73 74  list = pStepList
2690: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 74 65 70  ;.  while( pStep
26a0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 70 53 74 65  List ){.    pSte
26b0: 70 4c 69 73 74 2d 3e 70 54 72 69 67 20 3d 20 70  pList->pTrig = p
26c0: 54 72 69 67 3b 0a 20 20 20 20 70 53 74 65 70 4c  Trig;.    pStepL
26d0: 69 73 74 20 3d 20 70 53 74 65 70 4c 69 73 74 2d  ist = pStepList-
26e0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 6e 61  >pNext;.  }.  na
26f0: 6d 65 54 6f 6b 65 6e 2e 7a 20 3d 20 70 54 72 69  meToken.z = pTri
2700: 67 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 6e 61 6d 65  g->zName;.  name
2710: 54 6f 6b 65 6e 2e 6e 20 3d 20 73 71 6c 69 74 65  Token.n = sqlite
2720: 33 53 74 72 6c 65 6e 33 30 28 6e 61 6d 65 54 6f  3Strlen30(nameTo
2730: 6b 65 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 73 71  ken.z);.  if( sq
2740: 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
2750: 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
2760: 20 22 74 72 69 67 67 65 72 22 2c 20 26 6e 61 6d   "trigger", &nam
2770: 65 54 6f 6b 65 6e 29 20 0a 20 20 20 20 20 20 20  eToken) .       
2780: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78     && sqlite3Fix
2790: 54 72 69 67 67 65 72 53 74 65 70 28 26 73 46 69  TriggerStep(&sFi
27a0: 78 2c 20 70 54 72 69 67 2d 3e 73 74 65 70 5f 6c  x, pTrig->step_l
27b0: 69 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ist) ){.    goto
27c0: 20 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63   triggerfinish_c
27d0: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  leanup;.  }..  /
27e0: 2a 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  * if we are not 
27f0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 61 6e  initializing, an
2800: 64 20 74 68 69 73 20 74 72 69 67 67 65 72 20 69  d this trigger i
2810: 73 20 6e 6f 74 20 6f 6e 20 61 20 54 45 4d 50 20  s not on a TEMP 
2820: 74 61 62 6c 65 2c 20 0a 20 20 2a 2a 20 62 75 69  table, .  ** bui
2830: 6c 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ld the sqlite_ma
2840: 73 74 65 72 20 65 6e 74 72 79 0a 20 20 2a 2f 0a  ster entry.  */.
2850: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
2860: 62 75 73 79 20 29 7b 0a 20 20 20 20 56 64 62 65  busy ){.    Vdbe
2870: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
2880: 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61  ;..    /* Make a
2890: 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73  n entry in the s
28a0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
28b0: 6c 65 20 2a 2f 0a 20 20 20 20 76 20 3d 20 73 71  le */.    v = sq
28c0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
28d0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
28e0: 3d 30 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65  =0 ) goto trigge
28f0: 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b  rfinish_cleanup;
2900: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
2910: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
2920: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
2930: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
2940: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
2950: 68 61 72 2a 29 70 41 6c 6c 2d 3e 7a 2c 20 70 41  har*)pAll->z, pA
2960: 6c 6c 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ll->n);.    sqli
2970: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
2980: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 49  Parse,.       "I
2990: 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
29a0: 20 56 41 4c 55 45 53 28 27 74 72 69 67 67 65 72   VALUES('trigger
29b0: 27 2c 25 51 2c 25 51 2c 30 2c 27 43 52 45 41 54  ',%Q,%Q,0,'CREAT
29c0: 45 20 54 52 49 47 47 45 52 20 25 71 27 29 22 2c  E TRIGGER %q')",
29d0: 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
29e0: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
29f0: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 7a  MA_TABLE(iDb), z
2a00: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 70 54 72  Name,.       pTr
2a10: 69 67 2d 3e 74 61 62 6c 65 2c 20 7a 29 3b 0a 20  ig->table, z);. 
2a20: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2a30: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  (db, z);.    sql
2a40: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
2a50: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
2a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a70: 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65  dOp4(v, OP_Parse
2a80: 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20  Schema, iDb, 0, 
2a90: 30 2c 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74  0, sqlite3MPrint
2aa0: 66 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22  f(.        db, "
2ab0: 74 79 70 65 3d 27 74 72 69 67 67 65 72 27 20 41  type='trigger' A
2ac0: 4e 44 20 6e 61 6d 65 3d 27 25 71 27 22 2c 20 7a  ND name='%q'", z
2ad0: 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49  Name), P4_DYNAMI
2ae0: 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  C.    );.  }..  
2af0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
2b00: 79 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72  y ){.    Trigger
2b10: 20 2a 70 4c 69 6e 6b 20 3d 20 70 54 72 69 67 3b   *pLink = pTrig;
2b20: 0a 20 20 20 20 48 61 73 68 20 2a 70 48 61 73 68  .    Hash *pHash
2b30: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
2b40: 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  .pSchema->trigHa
2b50: 73 68 3b 0a 20 20 20 20 70 54 72 69 67 20 3d 20  sh;.    pTrig = 
2b60: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
2b70: 74 28 70 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  t(pHash, zName, 
2b80: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2b90: 7a 4e 61 6d 65 29 2c 20 70 54 72 69 67 29 3b 0a  zName), pTrig);.
2ba0: 20 20 20 20 69 66 28 20 70 54 72 69 67 20 29 7b      if( pTrig ){
2bb0: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
2bc0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
2bd0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 6e 6b   }else if( pLink
2be0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 4c 69 6e 6b  ->pSchema==pLink
2bf0: 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 29 7b 0a  ->pTabSchema ){.
2c00: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
2c10: 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  b;.      int n =
2c20: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c30: 28 70 4c 69 6e 6b 2d 3e 74 61 62 6c 65 29 3b 0a  (pLink->table);.
2c40: 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
2c50: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 4c  ite3HashFind(&pL
2c60: 69 6e 6b 2d 3e 70 54 61 62 53 63 68 65 6d 61 2d  ink->pTabSchema-
2c70: 3e 74 62 6c 48 61 73 68 2c 20 70 4c 69 6e 6b 2d  >tblHash, pLink-
2c80: 3e 74 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20  >table, n);.    
2c90: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
2ca0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 6e 6b  0 );.      pLink
2cb0: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
2cc0: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20  pTrigger;.      
2cd0: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 20 3d  pTab->pTrigger =
2ce0: 20 70 4c 69 6e 6b 3b 0a 20 20 20 20 7d 0a 20 20   pLink;.    }.  
2cf0: 7d 0a 0a 74 72 69 67 67 65 72 66 69 6e 69 73 68  }..triggerfinish
2d00: 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
2d10: 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72  te3DeleteTrigger
2d20: 28 64 62 2c 20 70 54 72 69 67 29 3b 0a 20 20 61  (db, pTrig);.  a
2d30: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
2d40: 70 4e 65 77 54 72 69 67 67 65 72 20 29 3b 0a 20  pNewTrigger );. 
2d50: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72   sqlite3DeleteTr
2d60: 69 67 67 65 72 53 74 65 70 28 64 62 2c 20 70 53  iggerStep(db, pS
2d70: 74 65 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  tepList);.}../*.
2d80: 2a 2a 20 54 75 72 6e 20 61 20 53 45 4c 45 43 54  ** Turn a SELECT
2d90: 20 73 74 61 74 65 6d 65 6e 74 20 28 74 68 61 74   statement (that
2da0: 20 74 68 65 20 70 53 65 6c 65 63 74 20 70 61 72   the pSelect par
2db0: 61 6d 65 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ameter points to
2dc0: 29 20 69 6e 74 6f 0a 2a 2a 20 61 20 74 72 69 67  ) into.** a trig
2dd0: 67 65 72 20 73 74 65 70 2e 20 20 52 65 74 75 72  ger step.  Retur
2de0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
2df0: 20 54 72 69 67 67 65 72 53 74 65 70 20 73 74 72   TriggerStep str
2e00: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
2e10: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
2e20: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
2e30: 20 69 74 20 66 69 6e 64 73 20 61 20 53 45 4c 45   it finds a SELE
2e40: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 0a  CT statement in.
2e50: 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  ** body of a TRI
2e60: 47 47 45 52 2e 20 20 0a 2a 2f 0a 54 72 69 67 67  GGER.  .*/.Trigg
2e70: 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54  erStep *sqlite3T
2e80: 72 69 67 67 65 72 53 65 6c 65 63 74 53 74 65 70  riggerSelectStep
2e90: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
2ea0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2eb0: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
2ec0: 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 73 71  TriggerStep = sq
2ed0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
2ee0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72 69  o(db, sizeof(Tri
2ef0: 67 67 65 72 53 74 65 70 29 29 3b 0a 20 20 69 66  ggerStep));.  if
2f00: 28 20 70 54 72 69 67 67 65 72 53 74 65 70 3d 3d  ( pTriggerStep==
2f10: 30 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  0 ) {.    sqlite
2f20: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
2f30: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
2f40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2f50: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70  pTriggerStep->op
2f60: 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
2f70: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53  pTriggerStep->pS
2f80: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
2f90: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
2fa0: 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44 65 66  >orconf = OE_Def
2fb0: 61 75 6c 74 3b 0a 20 20 72 65 74 75 72 6e 20 70  ault;.  return p
2fc0: 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a  TriggerStep;.}..
2fd0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
2fe0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 20 6e  pace to hold a n
2ff0: 65 77 20 74 72 69 67 67 65 72 20 73 74 65 70 2e  ew trigger step.
3000: 20 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 64 20    The allocated 
3010: 73 70 61 63 65 0a 2a 2a 20 68 6f 6c 64 73 20 62  space.** holds b
3020: 6f 74 68 20 74 68 65 20 54 72 69 67 67 65 72 53  oth the TriggerS
3030: 74 65 70 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  tep object and t
3040: 68 65 20 54 72 69 67 67 65 72 53 74 65 70 2e 74  he TriggerStep.t
3050: 61 72 67 65 74 2e 7a 20 73 74 72 69 6e 67 2e 0a  arget.z string..
3060: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
3070: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
3080: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
3090: 6e 64 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  nd db->mallocFai
30a0: 6c 65 64 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  led is set..*/.s
30b0: 74 61 74 69 63 20 54 72 69 67 67 65 72 53 74 65  tatic TriggerSte
30c0: 70 20 2a 74 72 69 67 67 65 72 53 74 65 70 41 6c  p *triggerStepAl
30d0: 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
30e0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
30f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
3100: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
3110: 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20    u8 op,        
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3130: 20 54 72 69 67 67 65 72 20 6f 70 63 6f 64 65 20   Trigger opcode 
3140: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
3150: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
3160: 20 2f 2a 20 54 68 65 20 74 61 72 67 65 74 20 6e   /* The target n
3170: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  ame */.){.  Trig
3180: 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65  gerStep *pTrigge
3190: 72 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67  rStep;..  pTrigg
31a0: 65 72 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33  erStep = sqlite3
31b0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
31c0: 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53   sizeof(TriggerS
31d0: 74 65 70 29 20 2b 20 70 4e 61 6d 65 2d 3e 6e 29  tep) + pName->n)
31e0: 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  ;.  if( pTrigger
31f0: 53 74 65 70 20 29 7b 0a 20 20 20 20 63 68 61 72  Step ){.    char
3200: 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 54   *z = (char*)&pT
3210: 72 69 67 67 65 72 53 74 65 70 5b 31 5d 3b 0a 20  riggerStep[1];. 
3220: 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61     memcpy(z, pNa
3230: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
3240: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
3250: 65 70 2d 3e 74 61 72 67 65 74 2e 7a 20 3d 20 7a  ep->target.z = z
3260: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
3270: 65 70 2d 3e 74 61 72 67 65 74 2e 6e 20 3d 20 70  ep->target.n = p
3280: 4e 61 6d 65 2d 3e 6e 3b 0a 20 20 20 20 70 54 72  Name->n;.    pTr
3290: 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20  iggerStep->op = 
32a0: 6f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  op;.  }.  return
32b0: 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d   pTriggerStep;.}
32c0: 0a 0a 2f 2a 0a 2a 2a 20 42 75 69 6c 64 20 61 20  ../*.** Build a 
32d0: 74 72 69 67 67 65 72 20 73 74 65 70 20 6f 75 74  trigger step out
32e0: 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 73 74   of an INSERT st
32f0: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
3300: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
3310: 20 74 68 65 20 6e 65 77 20 74 72 69 67 67 65 72   the new trigger
3320: 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   step..**.** The
3330: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
3340: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
3350: 69 74 20 73 65 65 73 20 61 6e 20 49 4e 53 45 52  it sees an INSER
3360: 54 20 69 6e 73 69 64 65 20 74 68 65 0a 2a 2a 20  T inside the.** 
3370: 62 6f 64 79 20 6f 66 20 61 20 74 72 69 67 67 65  body of a trigge
3380: 72 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65  r..*/.TriggerSte
3390: 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65  p *sqlite3Trigge
33a0: 72 49 6e 73 65 72 74 53 74 65 70 28 0a 20 20 73  rInsertStep(.  s
33b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
33c0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
33d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
33e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
33f0: 4e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  Name,  /* Name o
3400: 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f  f the table into
3410: 20 77 68 69 63 68 20 77 65 20 69 6e 73 65 72 74   which we insert
3420: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43   */.  IdList *pC
3430: 6f 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20 4c 69 73  olumn,    /* Lis
3440: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
3450: 70 54 61 62 6c 65 4e 61 6d 65 20 74 6f 20 69 6e  pTableName to in
3460: 73 65 72 74 20 69 6e 74 6f 20 2a 2f 0a 20 20 45  sert into */.  E
3470: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
3480: 20 20 20 2f 2a 20 54 68 65 20 56 41 4c 55 45 20     /* The VALUE 
3490: 63 6c 61 75 73 65 3a 20 61 20 6c 69 73 74 20 6f  clause: a list o
34a0: 66 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 69  f values to be i
34b0: 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 53 65 6c  nserted */.  Sel
34c0: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
34d0: 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
34e0: 74 65 6d 65 6e 74 20 74 68 61 74 20 73 75 70 70  tement that supp
34f0: 6c 69 65 73 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lies values */. 
3500: 20 75 38 20 6f 72 63 6f 6e 66 20 20 20 20 20 20   u8 orconf      
3510: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66       /* The conf
3520: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 28  lict algorithm (
3530: 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 52 65 70  OE_Abort, OE_Rep
3540: 6c 61 63 65 2c 20 65 74 63 2e 29 20 2a 2f 0a 29  lace, etc.) */.)
3550: 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20  {.  TriggerStep 
3560: 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 0a  *pTriggerStep;..
3570: 20 20 61 73 73 65 72 74 28 70 45 4c 69 73 74 20    assert(pEList 
3580: 3d 3d 20 30 20 7c 7c 20 70 53 65 6c 65 63 74 20  == 0 || pSelect 
3590: 3d 3d 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  == 0);.  assert(
35a0: 70 45 4c 69 73 74 20 21 3d 20 30 20 7c 7c 20 70  pEList != 0 || p
35b0: 53 65 6c 65 63 74 20 21 3d 20 30 20 7c 7c 20 64  Select != 0 || d
35c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
35d0: 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  ;..  pTriggerSte
35e0: 70 20 3d 20 74 72 69 67 67 65 72 53 74 65 70 41  p = triggerStepA
35f0: 6c 6c 6f 63 61 74 65 28 64 62 2c 20 54 4b 5f 49  llocate(db, TK_I
3600: 4e 53 45 52 54 2c 20 70 54 61 62 6c 65 4e 61 6d  NSERT, pTableNam
3610: 65 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67  e);.  if( pTrigg
3620: 65 72 53 74 65 70 20 29 7b 0a 20 20 20 20 70 54  erStep ){.    pT
3630: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53 65 6c  riggerStep->pSel
3640: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
3650: 65 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65  ectDup(db, pSele
3660: 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ct, EXPRDUP_REDU
3670: 43 45 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65  CE);.    pTrigge
3680: 72 53 74 65 70 2d 3e 70 49 64 4c 69 73 74 20 3d  rStep->pIdList =
3690: 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 54   pColumn;.    pT
36a0: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70  riggerStep->pExp
36b0: 72 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  rList = sqlite3E
36c0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
36d0: 45 4c 69 73 74 2c 20 45 58 50 52 44 55 50 5f 52  EList, EXPRDUP_R
36e0: 45 44 55 43 45 29 3b 0a 20 20 20 20 70 54 72 69  EDUCE);.    pTri
36f0: 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66  ggerStep->orconf
3700: 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 7d 65 6c   = orconf;.  }el
3710: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  se{.    sqlite3I
3720: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
3730: 70 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20  pColumn);.  }.  
3740: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3750: 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
3760: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
3770: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
3780: 6c 65 63 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  lect);..  return
3790: 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d   pTriggerStep;.}
37a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
37b0: 74 20 61 20 74 72 69 67 67 65 72 20 73 74 65 70  t a trigger step
37c0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
37d0: 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
37e0: 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 0a  ment and return.
37f0: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
3800: 74 68 61 74 20 74 72 69 67 67 65 72 20 73 74 65  that trigger ste
3810: 70 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 63  p.  The parser c
3820: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
3830: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73 65 65  e when it.** see
3840: 73 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  s an UPDATE stat
3850: 65 6d 65 6e 74 20 69 6e 73 69 64 65 20 74 68 65  ement inside the
3860: 20 62 6f 64 79 20 6f 66 20 61 20 43 52 45 41 54   body of a CREAT
3870: 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a 54 72  E TRIGGER..*/.Tr
3880: 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74  iggerStep *sqlit
3890: 65 33 54 72 69 67 67 65 72 55 70 64 61 74 65 53  e3TriggerUpdateS
38a0: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  tep(.  sqlite3 *
38b0: 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  db,         /* T
38c0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
38d0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
38e0: 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20  n *pTableName,  
38f0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3900: 74 61 62 6c 65 20 74 6f 20 62 65 20 75 70 64 61  table to be upda
3910: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
3920: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f 2a  t *pEList,    /*
3930: 20 54 68 65 20 53 45 54 20 63 6c 61 75 73 65 3a   The SET clause:
3940: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20   list of column 
3950: 61 6e 64 20 6e 65 77 20 76 61 6c 75 65 73 20 2a  and new values *
3960: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
3970: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3980: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
3990: 20 20 75 38 20 6f 72 63 6f 6e 66 20 20 20 20 20    u8 orconf     
39a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
39b0: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
39c0: 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  . (OE_Abort, OE_
39d0: 49 67 6e 6f 72 65 2c 20 65 74 63 29 20 2a 2f 0a  Ignore, etc) */.
39e0: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
39f0: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a   *pTriggerStep;.
3a00: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 20  .  pTriggerStep 
3a10: 3d 20 74 72 69 67 67 65 72 53 74 65 70 41 6c 6c  = triggerStepAll
3a20: 6f 63 61 74 65 28 64 62 2c 20 54 4b 5f 55 50 44  ocate(db, TK_UPD
3a30: 41 54 45 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  ATE, pTableName)
3a40: 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  ;.  if( pTrigger
3a50: 53 74 65 70 20 29 7b 0a 20 20 20 20 70 54 72 69  Step ){.    pTri
3a60: 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c  ggerStep->pExprL
3a70: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
3a80: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c  rListDup(db, pEL
3a90: 69 73 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ist, EXPRDUP_RED
3aa0: 55 43 45 29 3b 0a 20 20 20 20 70 54 72 69 67 67  UCE);.    pTrigg
3ab0: 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d  erStep->pWhere =
3ac0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3ad0: 64 62 2c 20 70 57 68 65 72 65 2c 20 45 58 50 52  db, pWhere, EXPR
3ae0: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
3af0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f   pTriggerStep->o
3b00: 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a  rconf = orconf;.
3b10: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
3b20: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
3b30: 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
3b40: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
3b50: 20 70 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75   pWhere);.  retu
3b60: 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b  rn pTriggerStep;
3b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
3b80: 75 63 74 20 61 20 74 72 69 67 67 65 72 20 73 74  uct a trigger st
3b90: 65 70 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ep that implemen
3ba0: 74 73 20 61 20 44 45 4c 45 54 45 20 73 74 61 74  ts a DELETE stat
3bb0: 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  ement and return
3bc0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
3bd0: 20 74 68 61 74 20 74 72 69 67 67 65 72 20 73 74   that trigger st
3be0: 65 70 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ep.  The parser 
3bf0: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
3c00: 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73 65  ne when it.** se
3c10: 65 73 20 61 20 44 45 4c 45 54 45 20 73 74 61 74  es a DELETE stat
3c20: 65 6d 65 6e 74 20 69 6e 73 69 64 65 20 74 68 65  ement inside the
3c30: 20 62 6f 64 79 20 6f 66 20 61 20 43 52 45 41 54   body of a CREAT
3c40: 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a 54 72  E TRIGGER..*/.Tr
3c50: 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74  iggerStep *sqlit
3c60: 65 33 54 72 69 67 67 65 72 44 65 6c 65 74 65 53  e3TriggerDeleteS
3c70: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  tep(.  sqlite3 *
3c80: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
3c90: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
3ca0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
3cb0: 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20   *pTableName,   
3cc0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
3cd0: 66 72 6f 6d 20 77 68 69 63 68 20 72 6f 77 73 20  from which rows 
3ce0: 61 72 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  are deleted */. 
3cf0: 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 20 20   Expr *pWhere   
3d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3d10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
3d20: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
3d30: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a   *pTriggerStep;.
3d40: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 20  .  pTriggerStep 
3d50: 3d 20 74 72 69 67 67 65 72 53 74 65 70 41 6c 6c  = triggerStepAll
3d60: 6f 63 61 74 65 28 64 62 2c 20 54 4b 5f 44 45 4c  ocate(db, TK_DEL
3d70: 45 54 45 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  ETE, pTableName)
3d80: 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  ;.  if( pTrigger
3d90: 53 74 65 70 20 29 7b 0a 20 20 20 20 70 54 72 69  Step ){.    pTri
3da0: 67 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65  ggerStep->pWhere
3db0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
3dc0: 70 28 64 62 2c 20 70 57 68 65 72 65 2c 20 45 58  p(db, pWhere, EX
3dd0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
3de0: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
3df0: 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44 65 66  >orconf = OE_Def
3e00: 61 75 6c 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ault;.  }.  sqli
3e10: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3e20: 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 72 65 74  , pWhere);.  ret
3e30: 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70  urn pTriggerStep
3e40: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 63 75  ;.}../* .** Recu
3e50: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
3e60: 20 54 72 69 67 67 65 72 20 73 74 72 75 63 74 75   Trigger structu
3e70: 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  re.*/.void sqlit
3e80: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 28  e3DeleteTrigger(
3e90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 72 69  sqlite3 *db, Tri
3ea0: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 29 7b  gger *pTrigger){
3eb0: 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72 3d  .  if( pTrigger=
3ec0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
3ed0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
3ee0: 67 65 72 53 74 65 70 28 64 62 2c 20 70 54 72 69  gerStep(db, pTri
3ef0: 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69 73 74 29  gger->step_list)
3f00: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3f10: 65 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e  e(db, pTrigger->
3f20: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
3f30: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 72 69  3DbFree(db, pTri
3f40: 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20 20  gger->table);.  
3f50: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3f60: 65 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e  e(db, pTrigger->
3f70: 70 57 68 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65  pWhen);.  sqlite
3f80: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
3f90: 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c  , pTrigger->pCol
3fa0: 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  umns);.  sqlite3
3fb0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 72 69 67  DbFree(db, pTrig
3fc0: 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ger);.}../*.** T
3fd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3fe0: 63 61 6c 6c 65 64 20 74 6f 20 64 72 6f 70 20 61  called to drop a
3ff0: 20 74 72 69 67 67 65 72 20 66 72 6f 6d 20 74 68   trigger from th
4000: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
4010: 61 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  a. .**.** This m
4020: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 64 69 72  ay be called dir
4030: 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 70  ectly from the p
4040: 61 72 73 65 72 20 61 6e 64 20 74 68 65 72 65 66  arser and theref
4050: 6f 72 65 20 69 64 65 6e 74 69 66 69 65 73 0a 2a  ore identifies.*
4060: 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 62 79  * the trigger by
4070: 20 6e 61 6d 65 2e 20 20 54 68 65 20 73 71 6c 69   name.  The sqli
4080: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74  te3DropTriggerPt
4090: 72 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  r() routine does
40a0: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 6a 6f 62   the.** same job
40b0: 20 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65   as this routine
40c0: 20 65 78 63 65 70 74 20 69 74 20 74 61 6b 65 73   except it takes
40d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
40e0: 65 20 74 72 69 67 67 65 72 0a 2a 2a 20 69 6e 73  e trigger.** ins
40f0: 74 65 61 64 20 6f 66 20 74 68 65 20 74 72 69 67  tead of the trig
4100: 67 65 72 20 6e 61 6d 65 2e 0a 2a 2a 2f 0a 76 6f  ger name..**/.vo
4110: 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72  id sqlite3DropTr
4120: 69 67 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  igger(Parse *pPa
4130: 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
4140: 61 6d 65 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  ame, int noErr){
4150: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
4160: 67 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gger = 0;.  int 
4170: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
4180: 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  *zDb;.  const ch
4190: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74  ar *zName;.  int
41a0: 20 6e 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65   nName;.  sqlite
41b0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
41c0: 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d  db;..  if( db->m
41d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
41e0: 74 6f 20 64 72 6f 70 5f 74 72 69 67 67 65 72 5f  to drop_trigger_
41f0: 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66 28 20 53  cleanup;.  if( S
4200: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
4210: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
4220: 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
4230: 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65  drop_trigger_cle
4240: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  anup;.  }..  ass
4250: 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
4260: 3d 3d 31 20 29 3b 0a 20 20 7a 44 62 20 3d 20 70  ==1 );.  zDb = p
4270: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
4280: 62 61 73 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  base;.  zName = 
4290: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
42a0: 65 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  e;.  nName = sql
42b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
42c0: 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  me);.  for(i=OMI
42d0: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
42e0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
42f0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
4300: 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72  ^1 : i;  /* Sear
4310: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
4320: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
4330: 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  Db && sqlite3Str
4340: 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ICmp(db->aDb[j].
4350: 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 20 63 6f  zName, zDb) ) co
4360: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 54 72 69  ntinue;.    pTri
4370: 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 48 61  gger = sqlite3Ha
4380: 73 68 46 69 6e 64 28 26 28 64 62 2d 3e 61 44 62  shFind(&(db->aDb
4390: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69  [j].pSchema->tri
43a0: 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65 2c 20 6e  gHash), zName, n
43b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
43c0: 54 72 69 67 67 65 72 20 29 20 62 72 65 61 6b 3b  Trigger ) break;
43d0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 54 72 69  .  }.  if( !pTri
43e0: 67 67 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20  gger ){.    if( 
43f0: 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20  !noErr ){.      
4400: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4410: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
4420: 20 74 72 69 67 67 65 72 3a 20 25 53 22 2c 20 70   trigger: %S", p
4430: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
4440: 20 20 20 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72      goto drop_tr
4450: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
4460: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 72 6f 70   }.  sqlite3Drop
4470: 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73  TriggerPtr(pPars
4480: 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 0a 64  e, pTrigger);..d
4490: 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61  rop_trigger_clea
44a0: 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  nup:.  sqlite3Sr
44b0: 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
44c0: 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
44d0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
44e0: 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  r to the Table s
44f0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
4500: 20 74 61 62 6c 65 20 74 68 61 74 20 61 20 74 72   table that a tr
4510: 69 67 67 65 72 0a 2a 2a 20 69 73 20 73 65 74 20  igger.** is set 
4520: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  on..*/.static Ta
4530: 62 6c 65 20 2a 74 61 62 6c 65 4f 66 54 72 69 67  ble *tableOfTrig
4540: 67 65 72 28 54 72 69 67 67 65 72 20 2a 70 54 72  ger(Trigger *pTr
4550: 69 67 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  igger){.  int n 
4560: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
4570: 30 28 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c  0(pTrigger->tabl
4580: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e);.  return sql
4590: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 54  ite3HashFind(&pT
45a0: 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63 68 65  rigger->pTabSche
45b0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 54 72  ma->tblHash, pTr
45c0: 69 67 67 65 72 2d 3e 74 61 62 6c 65 2c 20 6e 29  igger->table, n)
45d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70  ;.}.../*.** Drop
45e0: 20 61 20 74 72 69 67 67 65 72 20 67 69 76 65 6e   a trigger given
45f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4600: 61 74 20 74 72 69 67 67 65 72 2e 20 0a 2a 2f 0a  at trigger. .*/.
4610: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
4620: 54 72 69 67 67 65 72 50 74 72 28 50 61 72 73 65  TriggerPtr(Parse
4630: 20 2a 70 50 61 72 73 65 2c 20 54 72 69 67 67 65   *pParse, Trigge
4640: 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 20  r *pTrigger){.  
4650: 54 61 62 6c 65 20 20 20 2a 70 54 61 62 6c 65 3b  Table   *pTable;
4660: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
4670: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4680: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
4690: 62 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  b;..  iDb = sqli
46a0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
46b0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 72  (pParse->db, pTr
46c0: 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 29 3b  igger->pSchema);
46d0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
46e0: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
46f0: 20 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 74   );.  pTable = t
4700: 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28 70 54  ableOfTrigger(pT
4710: 72 69 67 67 65 72 29 3b 0a 20 20 61 73 73 65 72  rigger);.  asser
4720: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 20 20 61  t( pTable );.  a
4730: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
4740: 53 63 68 65 6d 61 3d 3d 70 54 72 69 67 67 65 72  Schema==pTrigger
4750: 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 69 44 62  ->pSchema || iDb
4760: 3d 3d 31 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==1 );.#ifndef S
4770: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
4780: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
4790: 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
47a0: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 3b  TE_DROP_TRIGGER;
47b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
47c0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
47d0: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
47e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
47f0: 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
4800: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  Db);.    if( iDb
4810: 3d 3d 31 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  ==1 ) code = SQL
4820: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
4830: 49 47 47 45 52 3b 0a 20 20 20 20 69 66 28 20 73  IGGER;.    if( s
4840: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
4850: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
4860: 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 2c 20 70  rigger->zName, p
4870: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 44  Table->zName, zD
4880: 62 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  b) ||.      sqli
4890: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
48a0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
48b0: 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
48c0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
48d0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  n;.    }.  }.#en
48e0: 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
48f0: 74 65 20 63 6f 64 65 20 74 6f 20 64 65 73 74 72  te code to destr
4900: 6f 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  oy the database 
4910: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 74 72  record of the tr
4920: 69 67 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 61 73  igger..  */.  as
4930: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
4940: 29 3b 0a 20 20 69 66 28 20 28 76 20 3d 20 73 71  );.  if( (v = sq
4950: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
4960: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
4970: 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 73 74  int base;.    st
4980: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
4990: 70 4c 69 73 74 20 64 72 6f 70 54 72 69 67 67 65  pList dropTrigge
49a0: 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  r[] = {.      { 
49b0: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
49c0: 2c 20 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a  , ADDR(9),  0},.
49d0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
49e0: 67 38 2c 20 20 20 20 30 2c 20 31 2c 20 20 20 20  g8,    0, 1,    
49f0: 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a      0}, /* 1 */.
4a00: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
4a10: 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  n,     0, 1,    
4a20: 20 20 20 20 32 7d 2c 0a 20 20 20 20 20 20 7b 20      2},.      { 
4a30: 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 32  OP_Ne,         2
4a40: 2c 20 41 44 44 52 28 38 29 2c 20 20 31 7d 2c 0a  , ADDR(8),  1},.
4a50: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
4a60: 67 38 2c 20 20 20 20 30 2c 20 31 2c 20 20 20 20  g8,    0, 1,    
4a70: 20 20 20 20 30 7d 2c 20 2f 2a 20 34 3a 20 22 74      0}, /* 4: "t
4a80: 72 69 67 67 65 72 22 20 2a 2f 0a 20 20 20 20 20  rigger" */.     
4a90: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
4aa0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 32    0, 0,        2
4ab0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
4ac0: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 41 44 44  ,         2, ADD
4ad0: 52 28 38 29 2c 20 20 31 7d 2c 0a 20 20 20 20 20  R(8),  1},.     
4ae0: 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
4af0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
4b00: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
4b10: 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
4b20: 52 28 31 29 2c 20 20 30 7d 2c 20 2f 2a 20 38 20  R(1),  0}, /* 8 
4b30: 2a 2f 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 73  */.    };..    s
4b40: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
4b50: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
4b60: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
4b70: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
4b80: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
4b90: 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73  b);.    base = s
4ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
4bb0: 69 73 74 28 76 2c 20 20 41 72 72 61 79 53 69 7a  ist(v,  ArraySiz
4bc0: 65 28 64 72 6f 70 54 72 69 67 67 65 72 29 2c 20  e(dropTrigger), 
4bd0: 64 72 6f 70 54 72 69 67 67 65 72 29 3b 0a 20 20  dropTrigger);.  
4be0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4bf0: 6e 67 65 50 34 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP4(v, base+1,
4c00: 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65   pTrigger->zName
4c10: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4c20: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
4c30: 20 62 61 73 65 2b 34 2c 20 22 74 72 69 67 67 65   base+4, "trigge
4c40: 72 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  r", P4_STATIC);.
4c50: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
4c60: 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
4c70: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
4c80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4c90: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
4ca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4cb0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
4cc0: 54 72 69 67 67 65 72 2c 20 69 44 62 2c 20 30 2c  Trigger, iDb, 0,
4cd0: 20 30 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e   0, pTrigger->zN
4ce0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ame, 0);.    if(
4cf0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 33 20   pParse->nMem<3 
4d00: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
4d10: 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 7d  >nMem = 3;.    }
4d20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4d30: 6d 6f 76 65 20 61 20 74 72 69 67 67 65 72 20 66  move a trigger f
4d40: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
4d50: 6c 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  les of the sqlit
4d60: 65 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76  e* pointer..*/.v
4d70: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
4d80: 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67 65  kAndDeleteTrigge
4d90: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  r(sqlite3 *db, i
4da0: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
4db0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 48 61  ar *zName){.  Ha
4dc0: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 28 64 62  sh *pHash = &(db
4dd0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
4de0: 6d 61 2d 3e 74 72 69 67 48 61 73 68 29 3b 0a 20  ma->trigHash);. 
4df0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
4e00: 65 72 3b 0a 20 20 70 54 72 69 67 67 65 72 20 3d  er;.  pTrigger =
4e10: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
4e20: 72 74 28 70 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  rt(pHash, zName,
4e30: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
4e40: 28 7a 4e 61 6d 65 29 2c 20 30 29 3b 0a 20 20 69  (zName), 0);.  i
4e50: 66 28 20 41 4c 57 41 59 53 28 70 54 72 69 67 67  f( ALWAYS(pTrigg
4e60: 65 72 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  er) ){.    if( p
4e70: 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
4e80: 3d 3d 70 54 72 69 67 67 65 72 2d 3e 70 54 61 62  ==pTrigger->pTab
4e90: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
4ea0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 74 61  Table *pTab = ta
4eb0: 62 6c 65 4f 66 54 72 69 67 67 65 72 28 70 54 72  bleOfTrigger(pTr
4ec0: 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 54 72  igger);.      Tr
4ed0: 69 67 67 65 72 20 2a 2a 70 70 3b 0a 20 20 20 20  igger **pp;.    
4ee0: 20 20 66 6f 72 28 70 70 3d 26 70 54 61 62 2d 3e    for(pp=&pTab->
4ef0: 70 54 72 69 67 67 65 72 3b 20 2a 70 70 21 3d 70  pTrigger; *pp!=p
4f00: 54 72 69 67 67 65 72 3b 20 70 70 3d 26 28 28 2a  Trigger; pp=&((*
4f10: 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
4f20: 20 20 20 20 2a 70 70 20 3d 20 28 2a 70 70 29 2d      *pp = (*pp)-
4f30: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
4f40: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
4f50: 72 69 67 67 65 72 28 64 62 2c 20 70 54 72 69 67  rigger(db, pTrig
4f60: 67 65 72 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  ger);.    db->fl
4f70: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
4f80: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
4f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74  .}../*.** pEList
4fa0: 20 69 73 20 74 68 65 20 53 45 54 20 63 6c 61 75   is the SET clau
4fb0: 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20  se of an UPDATE 
4fc0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 45 61 63 68  statement.  Each
4fd0: 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 45 4c   entry.** in pEL
4fe0: 69 73 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ist is of the fo
4ff0: 72 6d 61 74 20 3c 69 64 3e 3d 3c 65 78 70 72 3e  rmat <id>=<expr>
5000: 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  .  If any of the
5010: 20 65 6e 74 72 69 65 73 0a 2a 2a 20 69 6e 20 70   entries.** in p
5020: 45 4c 69 73 74 20 68 61 76 65 20 61 6e 20 3c 69  EList have an <i
5030: 64 3e 20 77 68 69 63 68 20 6d 61 74 63 68 65 73  d> which matches
5040: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 69   an identifier i
5050: 6e 20 70 49 64 4c 69 73 74 2c 0a 2a 2a 20 74 68  n pIdList,.** th
5060: 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  en return TRUE. 
5070: 20 49 66 20 70 49 64 4c 69 73 74 3d 3d 4e 55 4c   If pIdList==NUL
5080: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  L, then it is co
5090: 6e 73 69 64 65 72 65 64 20 61 0a 2a 2a 20 77 69  nsidered a.** wi
50a0: 6c 64 63 61 72 64 20 74 68 61 74 20 6d 61 74 63  ldcard that matc
50b0: 68 65 73 20 61 6e 79 74 68 69 6e 67 2e 20 20 4c  hes anything.  L
50c0: 69 6b 65 77 69 73 65 20 69 66 20 70 45 4c 69 73  ikewise if pELis
50d0: 74 3d 3d 4e 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20  t==NULL then.** 
50e0: 69 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68  it matches anyth
50f0: 69 6e 67 20 73 6f 20 61 6c 77 61 79 73 20 72 65  ing so always re
5100: 74 75 72 6e 20 74 72 75 65 2e 20 20 52 65 74 75  turn true.  Retu
5110: 72 6e 20 66 61 6c 73 65 20 6f 6e 6c 79 0a 2a 2a  rn false only.**
5120: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
5130: 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  match..*/.static
5140: 20 69 6e 74 20 63 68 65 63 6b 43 6f 6c 75 6d 6e   int checkColumn
5150: 4f 76 65 72 6c 61 70 28 49 64 4c 69 73 74 20 2a  Overlap(IdList *
5160: 70 49 64 4c 69 73 74 2c 20 45 78 70 72 4c 69 73  pIdList, ExprLis
5170: 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e  t *pEList){.  in
5180: 74 20 65 3b 0a 20 20 69 66 28 20 70 49 64 4c 69  t e;.  if( pIdLi
5190: 73 74 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70  st==0 || NEVER(p
51a0: 45 4c 69 73 74 3d 3d 30 29 20 29 20 72 65 74 75  EList==0) ) retu
51b0: 72 6e 20 31 3b 0a 20 20 66 6f 72 28 65 3d 30 3b  rn 1;.  for(e=0;
51c0: 20 65 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   e<pEList->nExpr
51d0: 3b 20 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; e++){.    if( 
51e0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
51f0: 65 78 28 70 49 64 4c 69 73 74 2c 20 70 45 4c 69  ex(pIdList, pELi
5200: 73 74 2d 3e 61 5b 65 5d 2e 7a 4e 61 6d 65 29 3e  st->a[e].zName)>
5210: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
5220: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 20 0a   }.  return 0; .
5230: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5240: 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 72  a list of all tr
5250: 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65 20  iggers on table 
5260: 70 54 61 62 20 69 66 20 74 68 65 72 65 20 65 78  pTab if there ex
5270: 69 73 74 73 20 61 74 20 6c 65 61 73 74 0a 2a 2a  ists at least.**
5280: 20 6f 6e 65 20 74 72 69 67 67 65 72 20 74 68 61   one trigger tha
5290: 74 20 6d 75 73 74 20 62 65 20 66 69 72 65 64 20  t must be fired 
52a0: 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f  when an operatio
52b0: 6e 20 6f 66 20 74 79 70 65 20 27 6f 70 27 20 69  n of type 'op' i
52c0: 73 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s .** performed 
52d0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e  on the table, an
52e0: 64 2c 20 69 66 20 74 68 61 74 20 6f 70 65 72 61  d, if that opera
52f0: 74 69 6f 6e 20 69 73 20 61 6e 20 55 50 44 41 54  tion is an UPDAT
5300: 45 2c 20 69 66 20 61 74 0a 2a 2a 20 6c 65 61 73  E, if at.** leas
5310: 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c  t one of the col
5320: 75 6d 6e 73 20 69 6e 20 70 43 68 61 6e 67 65 73  umns in pChanges
5330: 20 69 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69   is being modifi
5340: 65 64 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 20 2a  ed..*/.Trigger *
5350: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 73 45  sqlite3TriggersE
5360: 78 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  xist(.  Parse *p
5370: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
5380: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
5390: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
53a0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
53b0: 20 54 68 65 20 74 61 62 6c 65 20 74 68 65 20 63   The table the c
53c0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 72 69 67  ontains the trig
53d0: 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  gers */.  int op
53e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
53f0: 20 20 2f 2a 20 6f 6e 65 20 6f 66 20 54 4b 5f 44    /* one of TK_D
5400: 45 4c 45 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54  ELETE, TK_INSERT
5410: 2c 20 54 4b 5f 55 50 44 41 54 45 20 2a 2f 0a 20  , TK_UPDATE */. 
5420: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
5430: 67 65 73 2c 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ges,     /* Colu
5440: 6d 6e 73 20 74 68 61 74 20 63 68 61 6e 67 65 20  mns that change 
5450: 69 6e 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  in an UPDATE sta
5460: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
5470: 2a 70 4d 61 73 6b 20 20 20 20 20 20 20 20 20 20  *pMask          
5480: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b      /* OUT: Mask
5490: 20 6f 66 20 54 52 49 47 47 45 52 5f 42 45 46 4f   of TRIGGER_BEFO
54a0: 52 45 7c 54 52 49 47 47 45 52 5f 41 46 54 45 52  RE|TRIGGER_AFTER
54b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6d 61 73   */.){.  int mas
54c0: 6b 20 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72  k = 0;.  Trigger
54d0: 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   *pList = sqlite
54e0: 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
54f0: 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 54 72  rse, pTab);.  Tr
5500: 69 67 67 65 72 20 2a 70 3b 0a 20 20 61 73 73 65  igger *p;.  asse
5510: 72 74 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  rt( pList==0 || 
5520: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 3d  IsVirtual(pTab)=
5530: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c  =0 );.  for(p=pL
5540: 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  ist; p; p=p->pNe
5550: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
5560: 6f 70 3d 3d 6f 70 20 26 26 20 63 68 65 63 6b 43  op==op && checkC
5570: 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e  olumnOverlap(p->
5580: 70 43 6f 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67  pColumns, pChang
5590: 65 73 29 20 29 7b 0a 20 20 20 20 20 20 6d 61 73  es) ){.      mas
55a0: 6b 20 7c 3d 20 70 2d 3e 74 72 5f 74 6d 3b 0a 20  k |= p->tr_tm;. 
55b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
55c0: 4d 61 73 6b 20 29 7b 0a 20 20 20 20 2a 70 4d 61  Mask ){.    *pMa
55d0: 73 6b 20 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  sk = mask;.  }. 
55e0: 20 72 65 74 75 72 6e 20 28 6d 61 73 6b 20 3f 20   return (mask ? 
55f0: 70 4c 69 73 74 20 3a 20 30 29 3b 0a 7d 0a 0a 2f  pList : 0);.}../
5600: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65  *.** Convert the
5610: 20 70 53 74 65 70 2d 3e 74 61 72 67 65 74 20 74   pStep->target t
5620: 6f 6b 65 6e 20 69 6e 74 6f 20 61 20 53 72 63 4c  oken into a SrcL
5630: 69 73 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ist and return a
5640: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
5650: 68 61 74 20 53 72 63 4c 69 73 74 2e 0a 2a 2a 0a  hat SrcList..**.
5660: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5670: 61 64 64 73 20 61 20 73 70 65 63 69 66 69 63 20  adds a specific 
5680: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2c 20 69  database name, i
5690: 66 20 6e 65 65 64 65 64 2c 20 74 6f 20 74 68 65  f needed, to the
56a0: 20 74 61 72 67 65 74 20 77 68 65 6e 0a 2a 2a 20   target when.** 
56b0: 66 6f 72 6d 69 6e 67 20 74 68 65 20 53 72 63 4c  forming the SrcL
56c0: 69 73 74 2e 20 20 54 68 69 73 20 70 72 65 76 65  ist.  This preve
56d0: 6e 74 73 20 61 20 74 72 69 67 67 65 72 20 69 6e  nts a trigger in
56e0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 72   one database fr
56f0: 6f 6d 0a 2a 2a 20 72 65 66 65 72 72 69 6e 67 20  om.** referring 
5700: 74 6f 20 61 20 74 61 72 67 65 74 20 69 6e 20 61  to a target in a
5710: 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 2e  nother database.
5720: 20 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 69    An exception i
5730: 73 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 74 72  s when the.** tr
5740: 69 67 67 65 72 20 69 73 20 69 6e 20 54 45 4d 50  igger is in TEMP
5750: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 69   in which case i
5760: 74 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 61  t can refer to a
5770: 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ny other databas
5780: 65 20 69 74 0a 2a 2a 20 77 61 6e 74 73 2e 0a 2a  e it.** wants..*
5790: 2f 0a 73 74 61 74 69 63 20 53 72 63 4c 69 73 74  /.static SrcList
57a0: 20 2a 74 61 72 67 65 74 53 72 63 4c 69 73 74 28   *targetSrcList(
57b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
57c0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
57d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
57e0: 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20  /.  TriggerStep 
57f0: 2a 70 53 74 65 70 20 20 20 2f 2a 20 54 68 65 20  *pStep   /* The 
5800: 74 72 69 67 67 65 72 20 63 6f 6e 74 61 69 6e 69  trigger containi
5810: 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 74 6f  ng the target to
5820: 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ken */.){.  int 
5830: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
5840: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
5850: 20 64 61 74 61 62 61 73 65 20 74 6f 20 75 73 65   database to use
5860: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
5870: 53 72 63 3b 20 20 20 20 20 20 20 2f 2a 20 53 72  Src;       /* Sr
5880: 63 4c 69 73 74 20 74 6f 20 62 65 20 72 65 74 75  cList to be retu
5890: 72 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  rned */..  pSrc 
58a0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
58b0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64  Append(pParse->d
58c0: 62 2c 20 30 2c 20 26 70 53 74 65 70 2d 3e 74 61  b, 0, &pStep->ta
58d0: 72 67 65 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  rget, 0);.  if( 
58e0: 70 53 72 63 20 29 7b 0a 20 20 20 20 61 73 73 65  pSrc ){.    asse
58f0: 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 30  rt( pSrc->nSrc>0
5900: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
5910: 70 53 72 63 2d 3e 61 21 3d 30 20 29 3b 0a 20 20  pSrc->a!=0 );.  
5920: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
5930: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
5940: 72 73 65 2d 3e 64 62 2c 20 70 53 74 65 70 2d 3e  rse->db, pStep->
5950: 70 54 72 69 67 2d 3e 70 53 63 68 65 6d 61 29 3b  pTrig->pSchema);
5960: 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20  .    if( iDb==0 
5970: 7c 7c 20 69 44 62 3e 3d 32 20 29 7b 0a 20 20 20  || iDb>=2 ){.   
5980: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
5990: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20   pParse->db;.   
59a0: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 70     assert( iDb<p
59b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29  Parse->db->nDb )
59c0: 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  ;.      pSrc->a[
59d0: 70 53 72 63 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 44  pSrc->nSrc-1].zD
59e0: 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
59f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 64 62  3DbStrDup(db, db
5a00: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
5a10: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
5a20: 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 2f  eturn pSrc;.}../
5a30: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
5a40: 42 45 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  BE code for the 
5a50: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
5a60: 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  e the body of a 
5a70: 73 69 6e 67 6c 65 20 0a 2a 2a 20 74 72 69 67 67  single .** trigg
5a80: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
5a90: 74 20 63 6f 64 65 54 72 69 67 67 65 72 50 72 6f  t codeTriggerPro
5aa0: 67 72 61 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  gram(.  Parse *p
5ab0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
5ac0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5ad0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69  context */.  Tri
5ae0: 67 67 65 72 53 74 65 70 20 2a 70 53 74 65 70 4c  ggerStep *pStepL
5af0: 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ist,   /* List o
5b00: 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  f statements ins
5b10: 69 64 65 20 74 68 65 20 74 72 69 67 67 65 72 20  ide the trigger 
5b20: 62 6f 64 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  body */.  int or
5b30: 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 20  conf            
5b40: 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
5b50: 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41  algorithm. (OE_A
5b60: 62 6f 72 74 2c 20 65 74 63 29 20 2a 2f 20 20 0a  bort, etc) */  .
5b70: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
5b80: 20 2a 70 53 74 65 70 3b 0a 20 20 56 64 62 65 20   *pStep;.  Vdbe 
5b90: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
5ba0: 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  be;.  sqlite3 *d
5bb0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5bc0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
5bd0: 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 26  e->pTriggerTab &
5be0: 26 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  & pParse->pTople
5bf0: 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  vel );.  assert(
5c00: 20 70 53 74 65 70 4c 69 73 74 20 29 3b 0a 20 20   pStepList );.  
5c10: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
5c20: 20 20 66 6f 72 28 70 53 74 65 70 3d 70 53 74 65    for(pStep=pSte
5c30: 70 4c 69 73 74 3b 20 70 53 74 65 70 3b 20 70 53  pList; pStep; pS
5c40: 74 65 70 3d 70 53 74 65 70 2d 3e 70 4e 65 78 74  tep=pStep->pNext
5c50: 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
5c60: 20 6f 75 74 20 74 68 65 20 4f 4e 20 43 4f 4e 46   out the ON CONF
5c70: 4c 49 43 54 20 70 6f 6c 69 63 79 20 74 68 61 74  LICT policy that
5c80: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
5c90: 72 20 74 68 69 73 20 73 74 65 70 0a 20 20 20 20  r this step.    
5ca0: 2a 2a 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  ** of the trigge
5cb0: 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74 68  r program. If th
5cc0: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  e statement that
5cd0: 20 63 61 75 73 65 64 20 74 68 69 73 20 74 72 69   caused this tri
5ce0: 67 67 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 66  gger.    ** to f
5cf0: 69 72 65 20 68 61 64 20 61 6e 20 65 78 70 6c 69  ire had an expli
5d00: 63 69 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 2c  cit ON CONFLICT,
5d10: 20 74 68 65 6e 20 75 73 65 20 69 74 2e 20 4f 74   then use it. Ot
5d20: 68 65 72 77 69 73 65 2c 20 75 73 65 0a 20 20 20  herwise, use.   
5d30: 20 2a 2a 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c   ** the ON CONFL
5d40: 49 43 54 20 70 6f 6c 69 63 79 20 74 68 61 74 20  ICT policy that 
5d50: 77 61 73 20 73 70 65 63 69 66 69 65 64 20 61 73  was specified as
5d60: 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 69   part of the tri
5d70: 67 67 65 72 0a 20 20 20 20 2a 2a 20 73 74 65 70  gger.    ** step
5d80: 20 73 74 61 74 65 6d 65 6e 74 2e 20 45 78 61 6d   statement. Exam
5d90: 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
5da0: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 52 49 47  **   CREATE TRIG
5db0: 47 45 52 20 41 46 54 45 52 20 49 4e 53 45 52 54  GER AFTER INSERT
5dc0: 20 4f 4e 20 74 31 20 42 45 47 49 4e 3b 0a 20 20   ON t1 BEGIN;.  
5dd0: 20 20 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20    **     INSERT 
5de0: 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  OR REPLACE INTO 
5df0: 74 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 61 2c  t2 VALUES(new.a,
5e00: 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20 2a 2a 20   new.b);.    ** 
5e10: 20 20 45 4e 44 3b 0a 20 20 20 20 2a 2a 0a 20 20    END;.    **.  
5e20: 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e    **   INSERT IN
5e30: 54 4f 20 74 31 20 2e 2e 2e 20 3b 20 20 20 20 20  TO t1 ... ;     
5e40: 20 20 20 20 20 20 20 2d 2d 20 69 6e 73 65 72 74         -- insert
5e50: 20 69 6e 74 6f 20 74 32 20 75 73 65 73 20 52 45   into t2 uses RE
5e60: 50 4c 41 43 45 20 70 6f 6c 69 63 79 0a 20 20 20  PLACE policy.   
5e70: 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 4f 52 20   **   INSERT OR 
5e80: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20 2e  IGNORE INTO t1 .
5e90: 2e 2e 20 3b 20 20 2d 2d 20 69 6e 73 65 72 74 20  .. ;  -- insert 
5ea0: 69 6e 74 6f 20 74 32 20 75 73 65 73 20 49 47 4e  into t2 uses IGN
5eb0: 4f 52 45 20 70 6f 6c 69 63 79 0a 20 20 20 20 2a  ORE policy.    *
5ec0: 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 4f  /.    pParse->eO
5ed0: 72 63 6f 6e 66 20 3d 20 28 6f 72 63 6f 6e 66 3d  rconf = (orconf=
5ee0: 3d 4f 45 5f 44 65 66 61 75 6c 74 29 3f 70 53 74  =OE_Default)?pSt
5ef0: 65 70 2d 3e 6f 72 63 6f 6e 66 3a 28 75 38 29 6f  ep->orconf:(u8)o
5f00: 72 63 6f 6e 66 3b 0a 0a 20 20 20 20 73 77 69 74  rconf;..    swit
5f10: 63 68 28 20 70 53 74 65 70 2d 3e 6f 70 20 29 7b  ch( pStep->op ){
5f20: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55  .      case TK_U
5f30: 50 44 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 20  PDATE: {.       
5f40: 20 73 71 6c 69 74 65 33 55 70 64 61 74 65 28 70   sqlite3Update(p
5f50: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
5f60: 20 20 74 61 72 67 65 74 53 72 63 4c 69 73 74 28    targetSrcList(
5f70: 70 50 61 72 73 65 2c 20 70 53 74 65 70 29 2c 0a  pParse, pStep),.
5f80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5f90: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
5fa0: 20 70 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73   pStep->pExprLis
5fb0: 74 2c 20 30 29 2c 20 0a 20 20 20 20 20 20 20 20  t, 0), .        
5fc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
5fd0: 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 57 68 65  (db, pStep->pWhe
5fe0: 72 65 2c 20 30 29 2c 20 0a 20 20 20 20 20 20 20  re, 0), .       
5ff0: 20 20 20 70 50 61 72 73 65 2d 3e 65 4f 72 63 6f     pParse->eOrco
6000: 6e 66 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  nf.        );.  
6010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6020: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
6030: 54 4b 5f 49 4e 53 45 52 54 3a 20 7b 0a 20 20 20  TK_INSERT: {.   
6040: 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e 73 65       sqlite3Inse
6050: 72 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  rt(pParse, .    
6060: 20 20 20 20 20 20 74 61 72 67 65 74 53 72 63 4c        targetSrcL
6070: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 74 65  ist(pParse, pSte
6080: 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  p),.          sq
6090: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
60a0: 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 45 78 70  (db, pStep->pExp
60b0: 72 4c 69 73 74 2c 20 30 29 2c 20 0a 20 20 20 20  rList, 0), .    
60c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
60d0: 65 63 74 44 75 70 28 64 62 2c 20 70 53 74 65 70  ectDup(db, pStep
60e0: 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 2c 20 0a  ->pSelect, 0), .
60f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6100: 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70  3IdListDup(db, p
6110: 53 74 65 70 2d 3e 70 49 64 4c 69 73 74 29 2c 20  Step->pIdList), 
6120: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
6130: 65 2d 3e 65 4f 72 63 6f 6e 66 0a 20 20 20 20 20  e->eOrconf.     
6140: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72     );.        br
6150: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
6160: 20 20 20 63 61 73 65 20 54 4b 5f 44 45 4c 45 54     case TK_DELET
6170: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
6180: 69 74 65 33 44 65 6c 65 74 65 46 72 6f 6d 28 70  ite3DeleteFrom(p
6190: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
61a0: 20 20 74 61 72 67 65 74 53 72 63 4c 69 73 74 28    targetSrcList(
61b0: 70 50 61 72 73 65 2c 20 70 53 74 65 70 29 2c 0a  pParse, pStep),.
61c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
61d0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74  3ExprDup(db, pSt
61e0: 65 70 2d 3e 70 57 68 65 72 65 2c 20 30 29 0a 20  ep->pWhere, 0). 
61f0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
6200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6210: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
6220: 61 73 73 65 72 74 28 20 70 53 74 65 70 2d 3e 6f  assert( pStep->o
6230: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20  p==TK_SELECT ); 
6240: 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
6250: 44 65 73 74 20 73 44 65 73 74 3b 0a 20 20 20 20  Dest sDest;.    
6260: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
6270: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
6280: 65 63 74 44 75 70 28 64 62 2c 20 70 53 74 65 70  ectDup(db, pStep
6290: 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
62a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
62b0: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 73 44  lectDestInit(&sD
62c0: 65 73 74 2c 20 53 52 54 5f 44 69 73 63 61 72 64  est, SRT_Discard
62d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
62e0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
62f0: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 73 44  se, pSelect, &sD
6300: 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  est);.        sq
6310: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
6320: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
6330: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6340: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20       }.    } .  
6350: 20 20 69 66 28 20 70 53 74 65 70 2d 3e 6f 70 21    if( pStep->op!
6360: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
6370: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6380: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp0(v, OP_Rese
6390: 74 43 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  tCount);.    }. 
63a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
63b0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
63c0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
63d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
63e0: 65 64 20 74 6f 20 61 64 64 20 56 64 62 65 43 6f  ed to add VdbeCo
63f0: 6d 6d 65 6e 74 28 29 20 61 6e 6e 6f 74 61 74 69  mment() annotati
6400: 6f 6e 73 20 74 6f 20 61 20 56 44 42 45 0a 2a 2a  ons to a VDBE.**
6410: 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73 20   program. It is 
6420: 6e 6f 74 20 75 73 65 64 20 69 6e 20 70 72 6f 64  not used in prod
6430: 75 63 74 69 6f 6e 20 63 6f 64 65 2c 20 6f 6e 6c  uction code, onl
6440: 79 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e  y for debugging.
6450: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
6460: 20 63 68 61 72 20 2a 6f 6e 45 72 72 6f 72 54 65   char *onErrorTe
6470: 78 74 28 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  xt(int onError){
6480: 0a 20 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72  .  switch( onErr
6490: 6f 72 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f  or ){.    case O
64a0: 45 5f 41 62 6f 72 74 3a 20 20 20 20 72 65 74 75  E_Abort:    retu
64b0: 72 6e 20 22 61 62 6f 72 74 22 3b 0a 20 20 20 20  rn "abort";.    
64c0: 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b  case OE_Rollback
64d0: 3a 20 72 65 74 75 72 6e 20 22 72 6f 6c 6c 62 61  : return "rollba
64e0: 63 6b 22 3b 0a 20 20 20 20 63 61 73 65 20 4f 45  ck";.    case OE
64f0: 5f 46 61 69 6c 3a 20 20 20 20 20 72 65 74 75 72  _Fail:     retur
6500: 6e 20 22 66 61 69 6c 22 3b 0a 20 20 20 20 63 61  n "fail";.    ca
6510: 73 65 20 4f 45 5f 52 65 70 6c 61 63 65 3a 20 20  se OE_Replace:  
6520: 72 65 74 75 72 6e 20 22 72 65 70 6c 61 63 65 22  return "replace"
6530: 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67  ;.    case OE_Ig
6540: 6e 6f 72 65 3a 20 20 20 72 65 74 75 72 6e 20 22  nore:   return "
6550: 69 67 6e 6f 72 65 22 3b 0a 20 20 20 20 63 61 73  ignore";.    cas
6560: 65 20 4f 45 5f 44 65 66 61 75 6c 74 3a 20 20 72  e OE_Default:  r
6570: 65 74 75 72 6e 20 22 64 65 66 61 75 6c 74 22 3b  eturn "default";
6580: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 6e  .  }.  return "n
6590: 2f 61 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  /a";.}.#endif../
65a0: 2a 0a 2a 2a 20 50 61 72 73 65 20 63 6f 6e 74 65  *.** Parse conte
65b0: 78 74 20 73 74 72 75 63 74 75 72 65 20 70 46 72  xt structure pFr
65c0: 6f 6d 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  om has just been
65d0: 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
65e0: 61 20 73 75 62 2d 76 64 62 65 0a 2a 2a 20 28 74  a sub-vdbe.** (t
65f0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 29 2e  rigger program).
6600: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
6610: 20 6f 63 63 75 72 72 65 64 2c 20 74 72 61 6e 73   occurred, trans
6620: 66 65 72 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  fer error inform
6630: 61 74 69 6f 6e 0a 2a 2a 20 66 72 6f 6d 20 70 46  ation.** from pF
6640: 72 6f 6d 20 74 6f 20 70 54 6f 2e 0a 2a 2f 0a 73  rom to pTo..*/.s
6650: 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73  tatic void trans
6660: 66 65 72 50 61 72 73 65 45 72 72 6f 72 28 50 61  ferParseError(Pa
6670: 72 73 65 20 2a 70 54 6f 2c 20 50 61 72 73 65 20  rse *pTo, Parse 
6680: 2a 70 46 72 6f 6d 29 7b 0a 20 20 61 73 73 65 72  *pFrom){.  asser
6690: 74 28 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73  t( pFrom->zErrMs
66a0: 67 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 6e  g==0 || pFrom->n
66b0: 45 72 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Err );.  assert(
66c0: 20 70 54 6f 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30   pTo->zErrMsg==0
66d0: 20 7c 7c 20 70 54 6f 2d 3e 6e 45 72 72 20 29 3b   || pTo->nErr );
66e0: 0a 20 20 69 66 28 20 70 54 6f 2d 3e 6e 45 72 72  .  if( pTo->nErr
66f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e  ==0 ){.    pTo->
6700: 7a 45 72 72 4d 73 67 20 3d 20 70 46 72 6f 6d 2d  zErrMsg = pFrom-
6710: 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 54  >zErrMsg;.    pT
6720: 6f 2d 3e 6e 45 72 72 20 3d 20 70 46 72 6f 6d 2d  o->nErr = pFrom-
6730: 3e 6e 45 72 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >nErr;.  }else{.
6740: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6750: 65 28 70 46 72 6f 6d 2d 3e 64 62 2c 20 70 46 72  e(pFrom->db, pFr
6760: 6f 6d 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  om->zErrMsg);.  
6770: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
6780: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
6790: 20 6e 65 77 20 54 72 69 67 67 65 72 50 72 67 20   new TriggerPrg 
67a0: 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 73 75  object with a su
67b0: 62 2d 70 72 6f 67 72 61 6d 20 0a 2a 2a 20 69 6d  b-program .** im
67c0: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 72 69 67 67  plementing trigg
67d0: 65 72 20 70 54 72 69 67 67 65 72 20 77 69 74 68  er pTrigger with
67e0: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c   ON CONFLICT pol
67f0: 69 63 79 20 6f 72 63 6f 6e 66 2e 0a 2a 2f 0a 73  icy orconf..*/.s
6800: 74 61 74 69 63 20 54 72 69 67 67 65 72 50 72 67  tatic TriggerPrg
6810: 20 2a 63 6f 64 65 52 6f 77 54 72 69 67 67 65 72   *codeRowTrigger
6820: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6830: 65 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72  e,       /* Curr
6840: 65 6e 74 20 70 61 72 73 65 20 63 6f 6e 74 65 78  ent parse contex
6850: 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a  t */.  Trigger *
6860: 70 54 72 69 67 67 65 72 2c 20 20 20 2f 2a 20 54  pTrigger,   /* T
6870: 72 69 67 67 65 72 20 74 6f 20 63 6f 64 65 20 2a  rigger to code *
6880: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
6890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
68a0: 74 61 62 6c 65 20 70 54 72 69 67 67 65 72 20 69  table pTrigger i
68b0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 2a 2f  s attached to */
68c0: 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20  .  int orconf   
68d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f          /* ON CO
68e0: 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 74 6f  NFLICT policy to
68f0: 20 63 6f 64 65 20 74 72 69 67 67 65 72 20 70 72   code trigger pr
6900: 6f 67 72 61 6d 20 77 69 74 68 20 2a 2f 0a 29 7b  ogram with */.){
6910: 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 20 3d  .  Parse *pTop =
6920: 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
6930: 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
6940: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
6950: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
6960: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
6970: 2a 2f 0a 20 20 54 72 69 67 67 65 72 50 72 67 20  */.  TriggerPrg 
6980: 2a 70 50 72 67 3b 20 20 20 20 20 20 20 20 20 20  *pPrg;          
6990: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
69a0: 75 72 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  urn */.  Expr *p
69b0: 57 68 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  When = 0;       
69c0: 20 20 20 20 20 2f 2a 20 44 75 70 6c 69 63 61 74       /* Duplicat
69d0: 65 20 6f 66 20 74 72 69 67 67 65 72 20 57 48 45  e of trigger WHE
69e0: 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
69f0: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a10: 20 54 65 6d 70 6f 72 61 72 79 20 56 4d 20 2a 2f   Temporary VM */
6a20: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
6a30: 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  NC;            /
6a40: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
6a50: 6f 72 20 73 75 62 2d 76 64 62 65 20 2a 2f 0a 20  or sub-vdbe */. 
6a60: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 50 72   SubProgram *pPr
6a70: 6f 67 72 61 6d 20 3d 20 30 3b 20 20 20 2f 2a 20  ogram = 0;   /* 
6a80: 53 75 62 2d 76 64 62 65 20 66 6f 72 20 74 72 69  Sub-vdbe for tri
6a90: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 2a 2f 0a  gger program */.
6aa0: 20 20 50 61 72 73 65 20 2a 70 53 75 62 50 61 72    Parse *pSubPar
6ab0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se;           /*
6ac0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 66   Parse context f
6ad0: 6f 72 20 73 75 62 2d 76 64 62 65 20 2a 2f 0a 20  or sub-vdbe */. 
6ae0: 20 69 6e 74 20 69 45 6e 64 54 72 69 67 67 65 72   int iEndTrigger
6af0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
6b00: 4c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  Label to jump to
6b10: 20 69 66 20 57 48 45 4e 20 69 73 20 66 61 6c 73   if WHEN is fals
6b20: 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
6b30: 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 3d  pTrigger->zName=
6b40: 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 74 61 62 6c  =0 || pTab==tabl
6b50: 65 4f 66 54 72 69 67 67 65 72 28 70 54 72 69 67  eOfTrigger(pTrig
6b60: 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  ger) );..  /* Al
6b70: 6c 6f 63 61 74 65 20 74 68 65 20 54 72 69 67 67  locate the Trigg
6b80: 65 72 50 72 67 20 61 6e 64 20 53 75 62 50 72 6f  erPrg and SubPro
6b90: 67 72 61 6d 20 6f 62 6a 65 63 74 73 2e 20 54 6f  gram objects. To
6ba0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
6bb0: 79 0a 20 20 2a 2a 20 61 72 65 20 66 72 65 65 64  y.  ** are freed
6bc0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
6bd0: 75 72 73 2c 20 6c 69 6e 6b 20 74 68 65 6d 20 69  urs, link them i
6be0: 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 54  nto the Parse.pT
6bf0: 72 69 67 67 65 72 50 72 67 20 0a 20 20 2a 2a 20  riggerPrg .  ** 
6c00: 6c 69 73 74 20 6f 66 20 74 68 65 20 74 6f 70 2d  list of the top-
6c10: 6c 65 76 65 6c 20 50 61 72 73 65 20 6f 62 6a 65  level Parse obje
6c20: 63 74 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  ct sooner rather
6c30: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 20 2a 2f   than later.  */
6c40: 0a 20 20 70 50 72 67 20 3d 20 73 71 6c 69 74 65  .  pPrg = sqlite
6c50: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
6c60: 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72  , sizeof(Trigger
6c70: 50 72 67 29 29 3b 0a 20 20 69 66 28 20 21 70 50  Prg));.  if( !pP
6c80: 72 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rg ) return 0;. 
6c90: 20 70 50 72 67 2d 3e 70 4e 65 78 74 20 3d 20 70   pPrg->pNext = p
6ca0: 54 6f 70 2d 3e 70 54 72 69 67 67 65 72 50 72 67  Top->pTriggerPrg
6cb0: 3b 0a 20 20 70 54 6f 70 2d 3e 70 54 72 69 67 67  ;.  pTop->pTrigg
6cc0: 65 72 50 72 67 20 3d 20 70 50 72 67 3b 0a 20 20  erPrg = pPrg;.  
6cd0: 70 50 72 67 2d 3e 70 50 72 6f 67 72 61 6d 20 3d  pPrg->pProgram =
6ce0: 20 70 50 72 6f 67 72 61 6d 20 3d 20 73 71 6c 69   pProgram = sqli
6cf0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
6d00: 64 62 2c 20 73 69 7a 65 6f 66 28 53 75 62 50 72  db, sizeof(SubPr
6d10: 6f 67 72 61 6d 29 29 3b 0a 20 20 69 66 28 20 21  ogram));.  if( !
6d20: 70 50 72 6f 67 72 61 6d 20 29 20 72 65 74 75 72  pProgram ) retur
6d30: 6e 20 30 3b 0a 20 20 70 50 72 6f 67 72 61 6d 2d  n 0;.  pProgram-
6d40: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 50 72  >nRef = 1;.  pPr
6d50: 67 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54  g->pTrigger = pT
6d60: 72 69 67 67 65 72 3b 0a 20 20 70 50 72 67 2d 3e  rigger;.  pPrg->
6d70: 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b  orconf = orconf;
6d80: 0a 20 20 70 50 72 67 2d 3e 6f 6c 64 6d 61 73 6b  .  pPrg->oldmask
6d90: 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 0a   = 0xffffffff;..
6da0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
6db0: 64 20 70 6f 70 75 6c 61 74 65 20 61 20 6e 65 77  d populate a new
6dc0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 74   Parse context t
6dd0: 6f 20 75 73 65 20 66 6f 72 20 63 6f 64 69 6e 67  o use for coding
6de0: 20 74 68 65 20 0a 20 20 2a 2a 20 74 72 69 67 67   the .  ** trigg
6df0: 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20  er sub-program. 
6e00: 20 2a 2f 0a 20 20 70 53 75 62 50 61 72 73 65 20   */.  pSubParse 
6e10: 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
6e20: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
6e30: 6f 66 28 50 61 72 73 65 29 29 3b 0a 20 20 69 66  of(Parse));.  if
6e40: 28 20 21 70 53 75 62 50 61 72 73 65 20 29 20 72  ( !pSubParse ) r
6e50: 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73 65  eturn 0;.  memse
6e60: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
6e70: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
6e80: 50 61 72 73 65 20 3d 20 70 53 75 62 50 61 72 73  Parse = pSubPars
6e90: 65 3b 0a 20 20 70 53 75 62 50 61 72 73 65 2d 3e  e;.  pSubParse->
6ea0: 64 62 20 3d 20 64 62 3b 0a 20 20 70 53 75 62 50  db = db;.  pSubP
6eb0: 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
6ec0: 62 20 3d 20 70 54 61 62 3b 0a 20 20 70 53 75 62  b = pTab;.  pSub
6ed0: 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
6ee0: 20 3d 20 70 54 6f 70 3b 0a 20 20 70 53 75 62 50   = pTop;.  pSubP
6ef0: 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
6f00: 78 74 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 7a  xt = pTrigger->z
6f10: 4e 61 6d 65 3b 0a 20 20 70 53 75 62 50 61 72 73  Name;.  pSubPars
6f20: 65 2d 3e 65 54 72 69 67 67 65 72 4f 70 20 3d 20  e->eTriggerOp = 
6f30: 70 54 72 69 67 67 65 72 2d 3e 6f 70 3b 0a 0a 20  pTrigger->op;.. 
6f40: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
6f50: 64 62 65 28 70 53 75 62 50 61 72 73 65 29 3b 0a  dbe(pSubParse);.
6f60: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 56    if( v ){.    V
6f70: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
6f80: 53 74 61 72 74 3a 20 25 73 2e 25 73 20 28 25 73  Start: %s.%s (%s
6f90: 20 25 73 25 73 25 73 20 4f 4e 20 25 73 29 22 2c   %s%s%s ON %s)",
6fa0: 20 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72   .      pTrigger
6fb0: 2d 3e 7a 4e 61 6d 65 2c 20 6f 6e 45 72 72 6f 72  ->zName, onError
6fc0: 54 65 78 74 28 6f 72 63 6f 6e 66 29 2c 0a 20 20  Text(orconf),.  
6fd0: 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e 74      (pTrigger->t
6fe0: 72 5f 74 6d 3d 3d 54 52 49 47 47 45 52 5f 42 45  r_tm==TRIGGER_BE
6ff0: 46 4f 52 45 20 3f 20 22 42 45 46 4f 52 45 22 20  FORE ? "BEFORE" 
7000: 3a 20 22 41 46 54 45 52 22 29 2c 0a 20 20 20 20  : "AFTER"),.    
7010: 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e 6f      (pTrigger->o
7020: 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 3f 20 22  p==TK_UPDATE ? "
7030: 55 50 44 41 54 45 22 20 3a 20 22 22 29 2c 0a 20  UPDATE" : ""),. 
7040: 20 20 20 20 20 20 20 28 70 54 72 69 67 67 65 72         (pTrigger
7050: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20  ->op==TK_INSERT 
7060: 3f 20 22 49 4e 53 45 52 54 22 20 3a 20 22 22 29  ? "INSERT" : "")
7070: 2c 0a 20 20 20 20 20 20 20 20 28 70 54 72 69 67  ,.        (pTrig
7080: 67 65 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 45 4c 45  ger->op==TK_DELE
7090: 54 45 20 3f 20 22 44 45 4c 45 54 45 22 20 3a 20  TE ? "DELETE" : 
70a0: 22 22 29 2c 0a 20 20 20 20 20 20 70 54 61 62 2d  ""),.      pTab-
70b0: 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 23  >zName.    ));.#
70c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
70d0: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 73 71 6c  IT_TRACE.    sql
70e0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
70f0: 28 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 73  (v, -1, .      s
7100: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
7110: 2c 20 22 2d 2d 20 54 52 49 47 47 45 52 20 25 73  , "-- TRIGGER %s
7120: 22 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61  ", pTrigger->zNa
7130: 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  me), P4_DYNAMIC.
7140: 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20      );.#endif.. 
7150: 20 20 20 2f 2a 20 49 66 20 6f 6e 65 20 77 61 73     /* If one was
7160: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 64 65   specified, code
7170: 20 74 68 65 20 57 48 45 4e 20 63 6c 61 75 73 65   the WHEN clause
7180: 2e 20 49 66 20 69 74 20 65 76 61 6c 75 61 74 65  . If it evaluate
7190: 73 20 74 6f 20 66 61 6c 73 65 0a 20 20 20 20 2a  s to false.    *
71a0: 2a 20 28 6f 72 20 4e 55 4c 4c 29 20 74 68 65 20  * (or NULL) the 
71b0: 73 75 62 2d 76 64 62 65 20 69 73 20 69 6d 6d 65  sub-vdbe is imme
71c0: 64 69 61 74 65 6c 79 20 68 61 6c 74 65 64 20 62  diately halted b
71d0: 79 20 6a 75 6d 70 69 6e 67 20 74 6f 20 74 68 65  y jumping to the
71e0: 20 0a 20 20 20 20 2a 2a 20 4f 50 5f 48 61 6c 74   .    ** OP_Halt
71f0: 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 68 65   inserted at the
7200: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
7210: 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ram.  */.    if(
7220: 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e   pTrigger->pWhen
7230: 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 6e 20   ){.      pWhen 
7240: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7250: 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70  (db, pTrigger->p
7260: 57 68 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  When, 0);.      
7270: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73  if( SQLITE_OK==s
7280: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
7290: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 57 68  rNames(&sNC, pWh
72a0: 65 6e 29 20 0a 20 20 20 20 20 20 20 26 26 20 64  en) .       && d
72b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
72c0: 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =0 .      ){.   
72d0: 20 20 20 20 20 69 45 6e 64 54 72 69 67 67 65 72       iEndTrigger
72e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
72f0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
7300: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
7310: 66 46 61 6c 73 65 28 70 53 75 62 50 61 72 73 65  fFalse(pSubParse
7320: 2c 20 70 57 68 65 6e 2c 20 69 45 6e 64 54 72 69  , pWhen, iEndTri
7330: 67 67 65 72 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  gger, SQLITE_JUM
7340: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
7350: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
7360: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57  xprDelete(db, pW
7370: 68 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  hen);.    }..   
7380: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 74 72 69   /* Code the tri
7390: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 69 6e 74  gger program int
73a0: 6f 20 74 68 65 20 73 75 62 2d 76 64 62 65 2e 20  o the sub-vdbe. 
73b0: 2a 2f 0a 20 20 20 20 63 6f 64 65 54 72 69 67 67  */.    codeTrigg
73c0: 65 72 50 72 6f 67 72 61 6d 28 70 53 75 62 50 61  erProgram(pSubPa
73d0: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 73  rse, pTrigger->s
73e0: 74 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e 66  tep_list, orconf
73f0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
7400: 74 20 61 6e 20 4f 50 5f 48 61 6c 74 20 61 74 20  t an OP_Halt at 
7410: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
7420: 75 62 2d 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20  ub-program. */. 
7430: 20 20 20 69 66 28 20 69 45 6e 64 54 72 69 67 67     if( iEndTrigg
7440: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
7450: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
7460: 62 65 6c 28 76 2c 20 69 45 6e 64 54 72 69 67 67  bel(v, iEndTrigg
7470: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
7480: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7490: 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 20 20  (v, OP_Halt);.  
74a0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
74b0: 2c 20 22 45 6e 64 3a 20 25 73 2e 25 73 22 2c 20  , "End: %s.%s", 
74c0: 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 2c  pTrigger->zName,
74d0: 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72 63   onErrorText(orc
74e0: 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 74 72 61  onf)));..    tra
74f0: 6e 73 66 65 72 50 61 72 73 65 45 72 72 6f 72 28  nsferParseError(
7500: 70 50 61 72 73 65 2c 20 70 53 75 62 50 61 72 73  pParse, pSubPars
7510: 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  e);.    if( db->
7520: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
7530: 29 7b 0a 20 20 20 20 20 20 70 50 72 6f 67 72 61  ){.      pProgra
7540: 6d 2d 3e 61 4f 70 20 3d 20 73 71 6c 69 74 65 33  m->aOp = sqlite3
7550: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
7560: 76 2c 20 26 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f  v, &pProgram->nO
7570: 70 2c 20 26 70 54 6f 70 2d 3e 6e 4d 61 78 41 72  p, &pTop->nMaxAr
7580: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  g);.    }.    pP
7590: 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 3d 20 70  rogram->nMem = p
75a0: 53 75 62 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  SubParse->nMem;.
75b0: 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43      pProgram->nC
75c0: 73 72 20 3d 20 70 53 75 62 50 61 72 73 65 2d 3e  sr = pSubParse->
75d0: 6e 54 61 62 3b 0a 20 20 20 20 70 50 72 6f 67 72  nTab;.    pProgr
75e0: 61 6d 2d 3e 74 6f 6b 65 6e 20 3d 20 28 76 6f 69  am->token = (voi
75f0: 64 20 2a 29 70 54 72 69 67 67 65 72 3b 0a 20 20  d *)pTrigger;.  
7600: 20 20 70 50 72 67 2d 3e 6f 6c 64 6d 61 73 6b 20    pPrg->oldmask 
7610: 3d 20 70 53 75 62 50 61 72 73 65 2d 3e 6f 6c 64  = pSubParse->old
7620: 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  mask;.    sqlite
7630: 33 56 64 62 65 44 65 6c 65 74 65 28 76 29 3b 0a  3VdbeDelete(v);.
7640: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21    }..  assert( !
7650: 70 53 75 62 50 61 72 73 65 2d 3e 70 41 69 6e 63  pSubParse->pAinc
7660: 20 20 20 20 20 20 20 26 26 20 21 70 53 75 62 50         && !pSubP
7670: 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  arse->pZombieTab
7680: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
7690: 53 75 62 50 61 72 73 65 2d 3e 70 54 72 69 67 67  SubParse->pTrigg
76a0: 65 72 50 72 67 20 26 26 20 21 70 53 75 62 50 61  erPrg && !pSubPa
76b0: 72 73 65 2d 3e 6e 4d 61 78 41 72 67 20 29 3b 0a  rse->nMaxArg );.
76c0: 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72    sqlite3StackFr
76d0: 65 65 28 64 62 2c 20 70 53 75 62 50 61 72 73 65  ee(db, pSubParse
76e0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 72  );..  return pPr
76f0: 67 3b 0a 7d 0a 20 20 20 20 0a 2f 2a 0a 2a 2a 20  g;.}.    ./*.** 
7700: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
7710: 20 74 6f 20 61 20 54 72 69 67 67 65 72 50 72 67   to a TriggerPrg
7720: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69   object containi
7730: 6e 67 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  ng the sub-progr
7740: 61 6d 20 66 6f 72 0a 2a 2a 20 74 72 69 67 67 65  am for.** trigge
7750: 72 20 70 54 72 69 67 67 65 72 20 77 69 74 68 20  r pTrigger with 
7760: 64 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c  default ON CONFL
7770: 49 43 54 20 61 6c 67 6f 72 69 74 68 6d 20 6f 72  ICT algorithm or
7780: 63 6f 6e 66 2e 20 49 66 20 6e 6f 20 73 75 63 68  conf. If no such
7790: 0a 2a 2a 20 54 72 69 67 67 65 72 50 72 67 20 6f  .** TriggerPrg o
77a0: 62 6a 65 63 74 20 65 78 69 73 74 73 2c 20 61 20  bject exists, a 
77b0: 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  new object is al
77c0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
77d0: 6c 61 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  lated before.** 
77e0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
77f0: 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67 67 65  */.static Trigge
7800: 72 50 72 67 20 2a 67 65 74 52 6f 77 54 72 69 67  rPrg *getRowTrig
7810: 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ger(.  Parse *pP
7820: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 43  arse,       /* C
7830: 75 72 72 65 6e 74 20 70 61 72 73 65 20 63 6f 6e  urrent parse con
7840: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
7850: 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f  r *pTrigger,   /
7860: 2a 20 54 72 69 67 67 65 72 20 74 6f 20 63 6f 64  * Trigger to cod
7870: 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
7880: 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab,         /* T
7890: 68 65 20 74 61 62 6c 65 20 74 72 69 67 67 65 72  he table trigger
78a0: 20 70 54 72 69 67 67 65 72 20 69 73 20 61 74 74   pTrigger is att
78b0: 61 63 68 65 64 20 74 6f 20 2a 2f 0a 20 20 69 6e  ached to */.  in
78c0: 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20  t orconf        
78d0: 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     /* ON CONFLIC
78e0: 54 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a  T algorithm. */.
78f0: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 52 6f 6f  ){.  Parse *pRoo
7900: 74 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  t = sqlite3Parse
7910: 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
7920: 3b 0a 20 20 54 72 69 67 67 65 72 50 72 67 20 2a  ;.  TriggerPrg *
7930: 70 50 72 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  pPrg;..  assert(
7940: 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65   pTrigger->zName
7950: 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 74 61 62  ==0 || pTab==tab
7960: 6c 65 4f 66 54 72 69 67 67 65 72 28 70 54 72 69  leOfTrigger(pTri
7970: 67 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  gger) );..  /* I
7980: 74 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68  t may be that th
7990: 69 73 20 74 72 69 67 67 65 72 20 68 61 73 20 61  is trigger has a
79a0: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64 65  lready been code
79b0: 64 20 28 6f 72 20 69 73 20 69 6e 20 74 68 65 0a  d (or is in the.
79c0: 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
79d0: 62 65 69 6e 67 20 63 6f 64 65 64 29 2e 20 49 66  being coded). If
79e0: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
79f0: 65 2c 20 74 68 65 6e 20 61 6e 20 65 6e 74 72 79  e, then an entry
7a00: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6d 61 74   with.  ** a mat
7a10: 63 68 69 6e 67 20 54 72 69 67 67 65 72 50 72 67  ching TriggerPrg
7a20: 2e 70 54 72 69 67 67 65 72 20 66 69 65 6c 64 20  .pTrigger field 
7a30: 77 69 6c 6c 20 62 65 20 70 72 65 73 65 6e 74 20  will be present 
7a40: 73 6f 6d 65 77 68 65 72 65 0a 20 20 2a 2a 20 69  somewhere.  ** i
7a50: 6e 20 74 68 65 20 50 61 72 73 65 2e 70 54 72 69  n the Parse.pTri
7a60: 67 67 65 72 50 72 67 20 6c 69 73 74 2e 20 53 65  ggerPrg list. Se
7a70: 61 72 63 68 20 66 6f 72 20 73 75 63 68 20 61 6e  arch for such an
7a80: 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 66 6f   entry.  */.  fo
7a90: 72 28 70 50 72 67 3d 70 52 6f 6f 74 2d 3e 70 54  r(pPrg=pRoot->pT
7aa0: 72 69 67 67 65 72 50 72 67 3b 20 0a 20 20 20 20  riggerPrg; .    
7ab0: 20 20 70 50 72 67 20 26 26 20 28 70 50 72 67 2d    pPrg && (pPrg-
7ac0: 3e 70 54 72 69 67 67 65 72 21 3d 70 54 72 69 67  >pTrigger!=pTrig
7ad0: 67 65 72 20 7c 7c 20 70 50 72 67 2d 3e 6f 72 63  ger || pPrg->orc
7ae0: 6f 6e 66 21 3d 6f 72 63 6f 6e 66 29 3b 20 0a 20  onf!=orconf); . 
7af0: 20 20 20 20 20 70 50 72 67 3d 70 50 72 67 2d 3e       pPrg=pPrg->
7b00: 70 4e 65 78 74 0a 20 20 29 3b 0a 0a 20 20 2f 2a  pNext.  );..  /*
7b10: 20 49 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   If an existing 
7b20: 54 72 69 67 67 65 72 50 72 67 20 63 6f 75 6c 64  TriggerPrg could
7b30: 20 6e 6f 74 20 62 65 20 6c 6f 63 61 74 65 64 2c   not be located,
7b40: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
7b50: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 72  e. */.  if( !pPr
7b60: 67 20 29 7b 0a 20 20 20 20 70 50 72 67 20 3d 20  g ){.    pPrg = 
7b70: 63 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70  codeRowTrigger(p
7b80: 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c  Parse, pTrigger,
7b90: 20 70 54 61 62 2c 20 6f 72 63 6f 6e 66 29 3b 0a   pTab, orconf);.
7ba0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
7bb0: 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  rg;.}../*.** Gen
7bc0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
7bd0: 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  he trigger progr
7be0: 61 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  am associated wi
7bf0: 74 68 20 74 72 69 67 67 65 72 20 70 20 6f 6e 20  th trigger p on 
7c00: 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 2e 20  .** table pTab. 
7c10: 54 68 65 20 72 65 67 2c 20 6f 72 63 6f 6e 66 20  The reg, orconf 
7c20: 61 6e 64 20 69 67 6e 6f 72 65 4a 75 6d 70 20 70  and ignoreJump p
7c30: 61 72 61 6d 65 74 65 72 73 20 70 61 73 73 65 64  arameters passed
7c40: 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63   to this.** func
7c50: 74 69 6f 6e 20 61 72 65 20 74 68 65 20 73 61 6d  tion are the sam
7c60: 65 20 61 73 20 74 68 6f 73 65 20 64 65 73 63 72  e as those descr
7c70: 69 62 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ibed in the head
7c80: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a  er function for.
7c90: 2a 2a 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f  ** sqlite3CodeRo
7ca0: 77 54 72 69 67 67 65 72 28 29 0a 2a 2f 0a 76 6f  wTrigger().*/.vo
7cb0: 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f  id sqlite3CodeRo
7cc0: 77 54 72 69 67 67 65 72 44 69 72 65 63 74 28 0a  wTriggerDirect(.
7cd0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7ce0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
7cf0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69  context */.  Tri
7d00: 67 67 65 72 20 2a 70 2c 20 20 20 20 20 20 20 20  gger *p,        
7d10: 20 20 2f 2a 20 54 72 69 67 67 65 72 20 74 6f 20    /* Trigger to 
7d20: 63 6f 64 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  code */.  Table 
7d30: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  *pTab,         /
7d40: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 63  * The table to c
7d50: 6f 64 65 20 74 72 69 67 67 65 72 73 20 66 72 6f  ode triggers fro
7d60: 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 2c 20  m */.  int reg, 
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
7d80: 65 67 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  eg array contain
7d90: 69 6e 67 20 4f 4c 44 2e 2a 20 61 6e 64 20 4e 45  ing OLD.* and NE
7da0: 57 2e 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  W.* values */.  
7db0: 69 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20 20 20  int orconf,     
7dc0: 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c       /* ON CONFL
7dd0: 49 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 20 20  ICT policy */.  
7de0: 69 6e 74 20 69 67 6e 6f 72 65 4a 75 6d 70 20 20  int ignoreJump  
7df0: 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
7e00: 69 6f 6e 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66  ion to jump to f
7e10: 6f 72 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29  or RAISE(IGNORE)
7e20: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
7e30: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
7e40: 65 28 70 50 61 72 73 65 29 3b 20 2f 2a 20 4d 61  e(pParse); /* Ma
7e50: 69 6e 20 56 4d 20 2a 2f 0a 20 20 54 72 69 67 67  in VM */.  Trigg
7e60: 65 72 50 72 67 20 2a 70 50 72 67 3b 0a 20 20 70  erPrg *pPrg;.  p
7e70: 50 72 67 20 3d 20 67 65 74 52 6f 77 54 72 69 67  Prg = getRowTrig
7e80: 67 65 72 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ger(pParse, p, p
7e90: 54 61 62 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20  Tab, orconf);.  
7ea0: 61 73 73 65 72 74 28 20 70 50 72 67 20 7c 7c 20  assert( pPrg || 
7eb0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
7ec0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
7ed0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f  ocFailed );..  /
7ee0: 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 50 72  * Code the OP_Pr
7ef0: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
7f00: 74 68 65 20 70 61 72 65 6e 74 20 56 44 42 45 2e  the parent VDBE.
7f10: 20 50 34 20 6f 66 20 74 68 65 20 4f 50 5f 50 72   P4 of the OP_Pr
7f20: 6f 67 72 61 6d 20 0a 20 20 2a 2a 20 69 73 20 61  ogram .  ** is a
7f30: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7f40: 73 75 62 2d 76 64 62 65 20 63 6f 6e 74 61 69 6e  sub-vdbe contain
7f50: 69 6e 67 20 74 68 65 20 74 72 69 67 67 65 72 20  ing the trigger 
7f60: 70 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 69  program.  */.  i
7f70: 66 28 20 70 50 72 67 20 29 7b 0a 20 20 20 20 73  f( pPrg ){.    s
7f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7f90: 28 76 2c 20 4f 50 5f 50 72 6f 67 72 61 6d 2c 20  (v, OP_Program, 
7fa0: 72 65 67 2c 20 69 67 6e 6f 72 65 4a 75 6d 70 2c  reg, ignoreJump,
7fb0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29   ++pParse->nMem)
7fc0: 3b 0a 20 20 20 20 70 50 72 67 2d 3e 70 50 72 6f  ;.    pPrg->pPro
7fd0: 67 72 61 6d 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  gram->nRef++;.  
7fe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7ff0: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f  ngeP4(v, -1, (co
8000: 6e 73 74 20 63 68 61 72 20 2a 29 70 50 72 67 2d  nst char *)pPrg-
8010: 3e 70 50 72 6f 67 72 61 6d 2c 20 50 34 5f 53 55  >pProgram, P4_SU
8020: 42 50 52 4f 47 52 41 4d 29 3b 0a 20 20 20 20 56  BPROGRAM);.    V
8030: 64 62 65 43 6f 6d 6d 65 6e 74 28 0a 20 20 20 20  dbeComment(.    
8040: 20 20 20 20 28 76 2c 20 22 43 61 6c 6c 3a 20 25      (v, "Call: %
8050: 73 2e 25 73 22 2c 20 28 70 2d 3e 7a 4e 61 6d 65  s.%s", (p->zName
8060: 3f 70 2d 3e 7a 4e 61 6d 65 3a 22 66 6b 65 79 22  ?p->zName:"fkey"
8070: 29 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f  ), onErrorText(o
8080: 72 63 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 2f  rconf)));..    /
8090: 2a 20 53 65 74 20 74 68 65 20 50 35 20 6f 70 65  * Set the P5 ope
80a0: 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f 50  rand of the OP_P
80b0: 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69  rogram instructi
80c0: 6f 6e 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 69  on to non-zero i
80d0: 66 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  f.    ** recursi
80e0: 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  ve invocation of
80f0: 20 74 68 69 73 20 74 72 69 67 67 65 72 20 70 72   this trigger pr
8100: 6f 67 72 61 6d 20 69 73 20 64 69 73 61 6c 6c 6f  ogram is disallo
8110: 77 65 64 2e 20 52 65 63 75 72 73 69 76 65 0a 20  wed. Recursive. 
8120: 20 20 20 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e     ** invocation
8130: 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 69   is disallowed i
8140: 66 20 28 61 29 20 74 68 65 20 73 75 62 2d 70 72  f (a) the sub-pr
8150: 6f 67 72 61 6d 20 69 73 20 72 65 61 6c 6c 79 20  ogram is really 
8160: 61 20 74 72 69 67 67 65 72 2c 0a 20 20 20 20 2a  a trigger,.    *
8170: 2a 20 6e 6f 74 20 61 20 66 6f 72 65 69 67 6e 20  * not a foreign 
8180: 6b 65 79 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20  key action, and 
8190: 28 62 29 20 74 68 65 20 66 6c 61 67 20 74 6f 20  (b) the flag to 
81a0: 65 6e 61 62 6c 65 20 72 65 63 75 72 73 69 76 65  enable recursive
81b0: 20 74 72 69 67 67 65 72 73 0a 20 20 20 20 2a 2a   triggers.    **
81c0: 20 69 73 20 63 6c 65 61 72 2e 20 20 2a 2f 0a 20   is clear.  */. 
81d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
81e0: 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 28 70  angeP5(v, (u8)(p
81f0: 2d 3e 7a 4e 61 6d 65 20 26 26 20 21 28 70 50 61  ->zName && !(pPa
8200: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  rse->db->flags&S
8210: 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72  QLITE_RecTrigger
8220: 73 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  s)));.  }.}../*.
8230: 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
8240: 64 20 74 6f 20 63 6f 64 65 20 74 68 65 20 72 65  d to code the re
8250: 71 75 69 72 65 64 20 46 4f 52 20 45 41 43 48 20  quired FOR EACH 
8260: 52 4f 57 20 74 72 69 67 67 65 72 73 20 66 6f 72  ROW triggers for
8270: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a   an operation.**
8280: 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 2e 20   on table pTab. 
8290: 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  The operation to
82a0: 20 63 6f 64 65 20 74 72 69 67 67 65 72 73 20 66   code triggers f
82b0: 6f 72 20 28 49 4e 53 45 52 54 2c 20 55 50 44 41  or (INSERT, UPDA
82c0: 54 45 20 6f 72 20 44 45 4c 45 54 45 29 0a 2a 2a  TE or DELETE).**
82d0: 20 69 73 20 67 69 76 65 6e 20 62 79 20 74 68 65   is given by the
82e0: 20 6f 70 20 70 61 72 61 6d 61 74 65 72 2e 20 54   op paramater. T
82f0: 68 65 20 74 72 5f 74 6d 20 70 61 72 61 6d 65 74  he tr_tm paramet
8300: 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  er determines wh
8310: 65 74 68 65 72 20 74 68 65 0a 2a 2a 20 42 45 46  ether the.** BEF
8320: 4f 52 45 20 6f 72 20 41 46 54 45 52 20 74 72 69  ORE or AFTER tri
8330: 67 67 65 72 73 20 61 72 65 20 63 6f 64 65 64 2e  ggers are coded.
8340: 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
8350: 6e 20 69 73 20 61 6e 20 55 50 44 41 54 45 2c 20  n is an UPDATE, 
8360: 74 68 65 6e 0a 2a 2a 20 70 61 72 61 6d 65 74 65  then.** paramete
8370: 72 20 70 43 68 61 6e 67 65 73 20 69 73 20 70 61  r pChanges is pa
8380: 73 73 65 64 20 74 68 65 20 6c 69 73 74 20 6f 66  ssed the list of
8390: 20 63 6f 6c 75 6d 6e 73 20 62 65 69 6e 67 20 6d   columns being m
83a0: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  odified..**.** I
83b0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74  f there are no t
83c0: 72 69 67 67 65 72 73 20 74 68 61 74 20 66 69 72  riggers that fir
83d0: 65 20 61 74 20 74 68 65 20 73 70 65 63 69 66 69  e at the specifi
83e0: 65 64 20 74 69 6d 65 20 66 6f 72 20 74 68 65 20  ed time for the 
83f0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 6f 70 65  specified.** ope
8400: 72 61 74 69 6f 6e 20 6f 6e 20 70 54 61 62 2c 20  ration on pTab, 
8410: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
8420: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
8430: 54 68 65 20 72 65 67 20 61 72 67 75 6d 65 6e 74  The reg argument
8440: 20 69 73 20 74 68 65 20 61 64 64 72 65 73 73 20   is the address 
8450: 6f 66 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  of the first in 
8460: 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
8470: 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 63  sters .** that c
8480: 6f 6e 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  ontain the value
8490: 73 20 73 75 62 73 74 69 74 75 74 65 64 20 66 6f  s substituted fo
84a0: 72 20 74 68 65 20 6e 65 77 2e 2a 20 61 6e 64 20  r the new.* and 
84b0: 6f 6c 64 2e 2a 20 72 65 66 65 72 65 6e 63 65 73  old.* references
84c0: 0a 2a 2a 20 69 6e 20 74 68 65 20 74 72 69 67 67  .** in the trigg
84d0: 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 4e  er program. If N
84e0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
84f0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  f columns in tab
8500: 6c 65 20 70 54 61 62 0a 2a 2a 20 28 61 20 63 6f  le pTab.** (a co
8510: 70 79 20 6f 66 20 70 54 61 62 2d 3e 6e 43 6f 6c  py of pTab->nCol
8520: 29 2c 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  ), then register
8530: 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  s are populated 
8540: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
8550: 2a 20 20 20 52 65 67 69 73 74 65 72 20 20 20 20  *   Register    
8560: 20 20 20 43 6f 6e 74 61 69 6e 73 0a 2a 2a 20 20     Contains.**  
8570: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 72 65 67  -------.**   reg
85b0: 2b 30 20 20 20 20 20 20 20 20 20 20 4f 4c 44 2e  +0          OLD.
85c0: 72 6f 77 69 64 0a 2a 2a 20 20 20 72 65 67 2b 31  rowid.**   reg+1
85d0: 20 20 20 20 20 20 20 20 20 20 4f 4c 44 2e 2a 20            OLD.* 
85e0: 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 2d 6d 6f  value of left-mo
85f0: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 54 61  st column of pTa
8600: 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20 20 20 20  b.**   ...      
8610: 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 72        ....**   r
8620: 65 67 2b 4e 20 20 20 20 20 20 20 20 20 20 4f 4c  eg+N          OL
8630: 44 2e 2a 20 76 61 6c 75 65 20 6f 66 20 72 69 67  D.* value of rig
8640: 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ht-most column o
8650: 66 20 70 54 61 62 0a 2a 2a 20 20 20 72 65 67 2b  f pTab.**   reg+
8660: 4e 2b 31 20 20 20 20 20 20 20 20 4e 45 57 2e 72  N+1        NEW.r
8670: 6f 77 69 64 0a 2a 2a 20 20 20 72 65 67 2b 4e 2b  owid.**   reg+N+
8680: 32 20 20 20 20 20 20 20 20 4f 4c 44 2e 2a 20 76  2        OLD.* v
8690: 61 6c 75 65 20 6f 66 20 6c 65 66 74 2d 6d 6f 73  alue of left-mos
86a0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 54 61 62  t column of pTab
86b0: 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20 20 20 20 20  .**   ...       
86c0: 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 72 65       ....**   re
86d0: 67 2b 4e 2b 4e 2b 31 20 20 20 20 20 20 4e 45 57  g+N+N+1      NEW
86e0: 2e 2a 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68  .* value of righ
86f0: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
8700: 20 70 54 61 62 0a 2a 2a 0a 2a 2a 20 46 6f 72 20   pTab.**.** For 
8710: 4f 4e 20 44 45 4c 45 54 45 20 74 72 69 67 67 65  ON DELETE trigge
8720: 72 73 2c 20 74 68 65 20 72 65 67 69 73 74 65 72  rs, the register
8730: 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  s containing the
8740: 20 4e 45 57 2e 2a 20 76 61 6c 75 65 73 20 77 69   NEW.* values wi
8750: 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65 20 61  ll.** never be a
8760: 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 74  ccessed by the t
8770: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2c 20  rigger program, 
8780: 73 6f 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  so they are not 
8790: 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 0a 2a 2a  allocated or .**
87a0: 20 70 6f 70 75 6c 61 74 65 64 20 62 79 20 74 68   populated by th
87b0: 65 20 63 61 6c 6c 65 72 20 28 74 68 65 72 65 20  e caller (there 
87c0: 69 73 20 6e 6f 20 64 61 74 61 20 74 6f 20 70 6f  is no data to po
87d0: 70 75 6c 61 74 65 20 74 68 65 6d 20 77 69 74 68  pulate them with
87e0: 20 61 6e 79 77 61 79 29 2e 20 0a 2a 2a 20 53 69   anyway). .** Si
87f0: 6d 69 6c 61 72 6c 79 2c 20 66 6f 72 20 4f 4e 20  milarly, for ON 
8800: 49 4e 53 45 52 54 20 74 72 69 67 67 65 72 73 20  INSERT triggers 
8810: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
8820: 64 20 69 6e 20 74 68 65 20 4f 4c 44 2e 2a 20 72  d in the OLD.* r
8830: 65 67 69 73 74 65 72 73 0a 2a 2a 20 61 72 65 20  egisters.** are 
8840: 6e 65 76 65 72 20 61 63 63 65 73 73 65 64 2c 20  never accessed, 
8850: 61 6e 64 20 73 6f 20 61 72 65 20 6e 6f 74 20 61  and so are not a
8860: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20  llocated by the 
8870: 63 61 6c 6c 65 72 2e 20 53 6f 2c 20 66 6f 72 20  caller. So, for 
8880: 61 6e 0a 2a 2a 20 4f 4e 20 49 4e 53 45 52 54 20  an.** ON INSERT 
8890: 74 72 69 67 67 65 72 2c 20 74 68 65 20 76 61 6c  trigger, the val
88a0: 75 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ue passed to thi
88b0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 70 61  s function as pa
88c0: 72 61 6d 65 74 65 72 20 72 65 67 0a 2a 2a 20 69  rameter reg.** i
88d0: 73 20 6e 6f 74 20 61 20 72 65 61 64 61 62 6c 65  s not a readable
88e0: 20 72 65 67 69 73 74 65 72 2c 20 61 6c 74 68 6f   register, altho
88f0: 75 67 68 20 72 65 67 69 73 74 65 72 73 20 28 72  ugh registers (r
8900: 65 67 2b 4e 29 20 74 68 72 6f 75 67 68 20 0a 2a  eg+N) through .*
8910: 2a 20 28 72 65 67 2b 4e 2b 4e 2b 31 29 20 61 72  * (reg+N+N+1) ar
8920: 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  e..**.** Paramet
8930: 65 72 20 6f 72 63 6f 6e 66 20 69 73 20 74 68 65  er orconf is the
8940: 20 64 65 66 61 75 6c 74 20 63 6f 6e 66 6c 69 63   default conflic
8950: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
8960: 6f 72 69 74 68 6d 20 66 6f 72 20 74 68 65 0a 2a  orithm for the.*
8970: 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  * trigger progra
8980: 6d 20 74 6f 20 75 73 65 20 28 52 45 50 4c 41 43  m to use (REPLAC
8990: 45 2c 20 49 47 4e 4f 52 45 20 65 74 63 2e 29 2e  E, IGNORE etc.).
89a0: 20 50 61 72 61 6d 65 74 65 72 20 69 67 6e 6f 72   Parameter ignor
89b0: 65 4a 75 6d 70 0a 2a 2a 20 69 73 20 74 68 65 20  eJump.** is the 
89c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
89d0: 20 63 6f 6e 74 72 6f 6c 20 73 68 6f 75 6c 64 20   control should 
89e0: 6a 75 6d 70 20 74 6f 20 69 66 20 61 20 74 72 69  jump to if a tri
89f0: 67 67 65 72 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  gger program.** 
8a00: 72 61 69 73 65 73 20 61 6e 20 49 47 4e 4f 52 45  raises an IGNORE
8a10: 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 76   exception..*/.v
8a20: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 52  oid sqlite3CodeR
8a30: 6f 77 54 72 69 67 67 65 72 28 0a 20 20 50 61 72  owTrigger(.  Par
8a40: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8a50: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
8a60: 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20  xt */.  Trigger 
8a70: 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f 2a 20  *pTrigger,   /* 
8a80: 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73  List of triggers
8a90: 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 20 2a   on table pTab *
8aa0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
8ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
8ac0: 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b  of TK_UPDATE, TK
8ad0: 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 44 45 4c 45  _INSERT, TK_DELE
8ae0: 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  TE */.  ExprList
8af0: 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f 2a 20   *pChanges,  /* 
8b00: 43 68 61 6e 67 65 73 20 6c 69 73 74 20 66 6f 72  Changes list for
8b10: 20 61 6e 79 20 55 50 44 41 54 45 20 4f 46 20 74   any UPDATE OF t
8b20: 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74  riggers */.  int
8b30: 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20 20   tr_tm,         
8b40: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 52 49 47    /* One of TRIG
8b50: 47 45 52 5f 42 45 46 4f 52 45 2c 20 54 52 49 47  GER_BEFORE, TRIG
8b60: 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54  GER_AFTER */.  T
8b70: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
8b80: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
8b90: 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72   to code trigger
8ba0: 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
8bb0: 72 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  reg,            
8bc0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 69 6e   /* The first in
8bd0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
8be0: 69 73 74 65 72 73 20 28 73 65 65 20 61 62 6f 76  isters (see abov
8bf0: 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f  e) */.  int orco
8c00: 6e 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nf,          /* 
8c10: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69  ON CONFLICT poli
8c20: 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67 6e 6f  cy */.  int igno
8c30: 72 65 4a 75 6d 70 20 20 20 20 20 20 20 2f 2a 20  reJump       /* 
8c40: 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6a  Instruction to j
8c50: 75 6d 70 20 74 6f 20 66 6f 72 20 52 41 49 53 45  ump to for RAISE
8c60: 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 29 7b 0a 20  (IGNORE) */.){. 
8c70: 20 54 72 69 67 67 65 72 20 2a 70 3b 20 20 20 20   Trigger *p;    
8c80: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
8c90: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
8ca0: 20 70 54 72 69 67 67 65 72 20 6c 69 73 74 20 2a   pTrigger list *
8cb0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  /..  assert( op=
8cc0: 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70  =TK_UPDATE || op
8cd0: 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  ==TK_INSERT || o
8ce0: 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 29 3b 0a  p==TK_DELETE );.
8cf0: 20 20 61 73 73 65 72 74 28 20 74 72 5f 74 6d 3d    assert( tr_tm=
8d00: 3d 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20  =TRIGGER_BEFORE 
8d10: 7c 7c 20 74 72 5f 74 6d 3d 3d 54 52 49 47 47 45  || tr_tm==TRIGGE
8d20: 52 5f 41 46 54 45 52 20 29 3b 0a 20 20 61 73 73  R_AFTER );.  ass
8d30: 65 72 74 28 20 28 6f 70 3d 3d 54 4b 5f 55 50 44  ert( (op==TK_UPD
8d40: 41 54 45 29 3d 3d 28 70 43 68 61 6e 67 65 73 21  ATE)==(pChanges!
8d50: 3d 30 29 20 29 3b 0a 0a 20 20 66 6f 72 28 70 3d  =0) );..  for(p=
8d60: 70 54 72 69 67 67 65 72 3b 20 70 3b 20 70 3d 70  pTrigger; p; p=p
8d70: 2d 3e 70 4e 65 78 74 29 7b 0a 0a 20 20 20 20 2f  ->pNext){..    /
8d80: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
8d90: 67 3a 20 20 54 68 65 20 73 63 68 65 6d 61 20 66  g:  The schema f
8da0: 6f 72 20 74 68 65 20 74 72 69 67 67 65 72 20 61  or the trigger a
8db0: 6e 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  nd for the table
8dc0: 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 77 61   are.    ** alwa
8dd0: 79 73 20 64 65 66 69 6e 65 64 2e 20 20 54 68 65  ys defined.  The
8de0: 20 74 72 69 67 67 65 72 20 6d 75 73 74 20 62 65   trigger must be
8df0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 73 63 68   in the same sch
8e00: 65 6d 61 20 61 73 20 74 68 65 20 74 61 62 6c 65  ema as the table
8e10: 0a 20 20 20 20 2a 2a 20 6f 72 20 65 6c 73 65 20  .    ** or else 
8e20: 69 74 20 6d 75 73 74 20 62 65 20 61 20 54 45 4d  it must be a TEM
8e30: 50 20 74 72 69 67 67 65 72 2e 20 2a 2f 0a 20 20  P trigger. */.  
8e40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63    assert( p->pSc
8e50: 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20 20 61  hema!=0 );.    a
8e60: 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 53 63  ssert( p->pTabSc
8e70: 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20 20 61  hema!=0 );.    a
8e80: 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d  ssert( p->pSchem
8e90: 61 3d 3d 70 2d 3e 70 54 61 62 53 63 68 65 6d 61  a==p->pTabSchema
8ea0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d   .         || p-
8eb0: 3e 70 53 63 68 65 6d 61 3d 3d 70 50 61 72 73 65  >pSchema==pParse
8ec0: 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ->db->aDb[1].pSc
8ed0: 68 65 6d 61 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  hema );..    /* 
8ee0: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
8ef0: 72 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 64 65  r we should code
8f00: 20 74 68 69 73 20 74 72 69 67 67 65 72 20 2a 2f   this trigger */
8f10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
8f20: 6f 70 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 74  op .     && p->t
8f30: 72 5f 74 6d 3d 3d 74 72 5f 74 6d 20 0a 20 20 20  r_tm==tr_tm .   
8f40: 20 20 26 26 20 63 68 65 63 6b 43 6f 6c 75 6d 6e    && checkColumn
8f50: 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f 6c 75  Overlap(p->pColu
8f60: 6d 6e 73 2c 20 70 43 68 61 6e 67 65 73 29 0a 20  mns, pChanges). 
8f70: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
8f80: 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65  te3CodeRowTrigge
8f90: 72 44 69 72 65 63 74 28 70 50 61 72 73 65 2c 20  rDirect(pParse, 
8fa0: 70 2c 20 70 54 61 62 2c 20 72 65 67 2c 20 6f 72  p, pTab, reg, or
8fb0: 63 6f 6e 66 2c 20 69 67 6e 6f 72 65 4a 75 6d 70  conf, ignoreJump
8fc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
8fd0: 2f 2a 0a 2a 2a 20 54 72 69 67 67 65 72 73 20 66  /*.** Triggers f
8fe0: 69 72 65 64 20 62 79 20 55 50 44 41 54 45 20 6f  ired by UPDATE o
8ff0: 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
9000: 6e 74 73 20 6d 61 79 20 61 63 63 65 73 73 20 76  nts may access v
9010: 61 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a 2a 20  alues stored.** 
9020: 69 6e 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  in the old.* pse
9030: 75 64 6f 2d 74 61 62 6c 65 2e 20 54 68 69 73 20  udo-table. This 
9040: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
9050: 20 61 20 33 32 2d 62 69 74 20 62 69 74 6d 61 73   a 32-bit bitmas
9060: 6b 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  k.** indicating 
9070: 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 6f 66  which columns of
9080: 20 74 68 65 20 6f 6c 64 2e 2a 20 74 61 62 6c 65   the old.* table
9090: 20 61 63 74 75 61 6c 6c 79 20 61 72 65 20 75 73   actually are us
90a0: 65 64 20 62 79 0a 2a 2a 20 74 72 69 67 67 65 72  ed by.** trigger
90b0: 73 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  s. This informat
90c0: 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65 64 20  ion may be used 
90d0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  by the caller to
90e0: 20 61 76 6f 69 64 20 68 61 76 69 6e 67 0a 2a 2a   avoid having.**
90f0: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 6e 74   to load the ent
9100: 69 72 65 20 6f 6c 64 2e 2a 20 72 65 63 6f 72 64  ire old.* record
9110: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 77 68 65   into memory whe
9120: 6e 20 65 78 65 63 75 74 69 6e 67 20 61 6e 20 55  n executing an U
9130: 50 44 41 54 45 0a 2a 2a 20 6f 72 20 44 45 4c 45  PDATE.** or DELE
9140: 54 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  TE command..**.*
9150: 2a 20 42 69 74 20 30 20 6f 66 20 74 68 65 20 72  * Bit 0 of the r
9160: 65 74 75 72 6e 65 64 20 6d 61 73 6b 20 69 73 20  eturned mask is 
9170: 73 65 74 20 69 66 20 74 68 65 20 6c 65 66 74 2d  set if the left-
9180: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
9190: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20  he.** table may 
91a0: 62 65 20 61 63 63 65 73 73 65 64 20 75 73 69 6e  be accessed usin
91b0: 67 20 61 6e 20 6f 6c 64 2e 3c 63 6f 6c 3e 20 72  g an old.<col> r
91c0: 65 66 65 72 65 6e 63 65 2e 20 42 69 74 20 31 20  eference. Bit 1 
91d0: 69 73 20 73 65 74 20 69 66 0a 2a 2a 20 74 68 65  is set if.** the
91e0: 20 73 65 63 6f 6e 64 20 6c 65 66 74 6d 6f 73 74   second leftmost
91f0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73   column value is
9200: 20 72 65 71 75 69 72 65 64 2c 20 61 6e 64 20 73   required, and s
9210: 6f 20 6f 6e 2e 20 49 66 20 74 68 65 72 65 0a 2a  o on. If there.*
9220: 2a 20 61 72 65 20 6d 6f 72 65 20 74 68 61 6e 20  * are more than 
9230: 33 32 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  32 columns in th
9240: 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 61 74 20  e table, and at 
9250: 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
9260: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 77 69 74 68   columns.** with
9270: 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
9280: 72 20 74 68 61 6e 20 33 32 20 6d 61 79 20 62 65  r than 32 may be
9290: 20 61 63 63 65 73 73 65 64 2c 20 30 78 66 66 66   accessed, 0xfff
92a0: 66 66 66 66 66 20 69 73 20 72 65 74 75 72 6e 65  fffff is returne
92b0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  d..**.** It is n
92c0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  ot possible to d
92d0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
92e0: 6f 6c 64 2e 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  old.rowid column
92f0: 20 69 73 20 61 63 63 65 73 73 65 64 0a 2a 2a 20   is accessed.** 
9300: 62 79 20 74 72 69 67 67 65 72 73 2e 20 54 68 65  by triggers. The
9310: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 61 6c 77   caller must alw
9320: 61 79 73 20 61 73 73 75 6d 65 20 74 68 61 74 20  ays assume that 
9330: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  it is..**.** The
9340: 72 65 20 69 73 20 6e 6f 20 65 71 75 69 76 61 6c  re is no equival
9350: 65 6e 74 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ent function for
9360: 20 6e 65 77 2e 2a 20 72 65 66 65 72 65 6e 63 65   new.* reference
9370: 73 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  s..*/.u32 sqlite
9380: 33 54 72 69 67 67 65 72 4f 6c 64 6d 61 73 6b 28  3TriggerOldmask(
9390: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
93a0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  ,       /* Parse
93b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72   context */.  Tr
93c0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c  igger *pTrigger,
93d0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72     /* List of tr
93e0: 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65 20  iggers on table 
93f0: 70 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pTab */.  ExprLi
9400: 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f  st *pChanges,  /
9410: 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74 20 66  * Changes list f
9420: 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20 4f 46  or any UPDATE OF
9430: 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 54   triggers */.  T
9440: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
9450: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
9460: 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72   to code trigger
9470: 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
9480: 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20  orconf          
9490: 20 2f 2a 20 44 65 66 61 75 6c 74 20 4f 4e 20 43   /* Default ON C
94a0: 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 66  ONFLICT policy f
94b0: 6f 72 20 74 72 69 67 67 65 72 20 73 74 65 70 73  or trigger steps
94c0: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
94d0: 6e 74 20 6f 70 20 3d 20 70 43 68 61 6e 67 65 73  nt op = pChanges
94e0: 20 3f 20 54 4b 5f 55 50 44 41 54 45 20 3a 20 54   ? TK_UPDATE : T
94f0: 4b 5f 44 45 4c 45 54 45 3b 0a 20 20 75 33 32 20  K_DELETE;.  u32 
9500: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 54 72 69 67  mask = 0;.  Trig
9510: 67 65 72 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 70  ger *p;..  for(p
9520: 3d 70 54 72 69 67 67 65 72 3b 20 70 3b 20 70 3d  =pTrigger; p; p=
9530: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
9540: 66 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20  f( p->op==op && 
9550: 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c  checkColumnOverl
9560: 61 70 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 70  ap(p->pColumns,p
9570: 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20 20  Changes) ){.    
9580: 20 20 54 72 69 67 67 65 72 50 72 67 20 2a 70 50    TriggerPrg *pP
9590: 72 67 3b 0a 20 20 20 20 20 20 70 50 72 67 20 3d  rg;.      pPrg =
95a0: 20 67 65 74 52 6f 77 54 72 69 67 67 65 72 28 70   getRowTrigger(p
95b0: 50 61 72 73 65 2c 20 70 2c 20 70 54 61 62 2c 20  Parse, p, pTab, 
95c0: 6f 72 63 6f 6e 66 29 3b 0a 20 20 20 20 20 20 69  orconf);.      i
95d0: 66 28 20 70 50 72 67 20 29 7b 0a 20 20 20 20 20  f( pPrg ){.     
95e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 70 50 72 67 2d     mask |= pPrg-
95f0: 3e 6f 6c 64 6d 61 73 6b 3b 0a 20 20 20 20 20 20  >oldmask;.      
9600: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
9610: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 23  eturn mask;.}..#
9620: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
9630: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
9640: 49 47 47 45 52 29 20 2a 2f 0a                    IGGER) */.