/ Hex Artifact Content
Login

Artifact 2305271878e95addc1c01361e5e8e342e87cba5efefdd7d3032687e5d67e05d1:


0000: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  /*.**.** The aut
0010: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0020: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0030: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0040: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0050: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0060: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0070: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0080: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0090: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00a0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00b0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00c0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00d0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00e0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
00f0: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0100: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0110: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0170: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
0180: 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 54  ementation for T
0190: 52 49 47 47 45 52 73 0a 2a 2f 0a 23 69 6e 63 6c  RIGGERs.*/.#incl
01a0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
01b0: 22 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  "..#ifndef SQLIT
01c0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f  E_OMIT_TRIGGER./
01d0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 6c 69  *.** Delete a li
01e0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 54 72 69  nked list of Tri
01f0: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
0200: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0210: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
0220: 72 53 74 65 70 28 73 71 6c 69 74 65 33 20 2a 64  rStep(sqlite3 *d
0230: 62 2c 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  b, TriggerStep *
0240: 70 54 72 69 67 67 65 72 53 74 65 70 29 7b 0a 20  pTriggerStep){. 
0250: 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
0260: 53 74 65 70 20 29 7b 0a 20 20 20 20 54 72 69 67  Step ){.    Trig
0270: 67 65 72 53 74 65 70 20 2a 20 70 54 6d 70 20 3d  gerStep * pTmp =
0280: 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 20   pTriggerStep;. 
0290: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 20     pTriggerStep 
02a0: 3d 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  = pTriggerStep->
02b0: 70 4e 65 78 74 3b 0a 0a 20 20 20 20 73 71 6c 69  pNext;..    sqli
02c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
02d0: 2c 20 70 54 6d 70 2d 3e 70 57 68 65 72 65 29 3b  , pTmp->pWhere);
02e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
02f0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0300: 54 6d 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b  Tmp->pExprList);
0310: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
0320: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6d  ctDelete(db, pTm
0330: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  p->pSelect);.   
0340: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
0350: 6c 65 74 65 28 64 62 2c 20 70 54 6d 70 2d 3e 70  lete(db, pTmp->p
0360: 49 64 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  IdList);.    sql
0370: 69 74 65 33 55 70 73 65 72 74 44 65 6c 65 74 65  ite3UpsertDelete
0380: 28 64 62 2c 20 70 54 6d 70 2d 3e 70 55 70 73 65  (db, pTmp->pUpse
0390: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
03a0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 2d  DbFree(db, pTmp-
03b0: 3e 7a 53 70 61 6e 29 3b 0a 0a 20 20 20 20 73 71  >zSpan);..    sq
03c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
03d0: 70 54 6d 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pTmp);.  }.}../*
03e0: 0a 2a 2a 20 47 69 76 65 6e 20 74 61 62 6c 65 20  .** Given table 
03f0: 70 54 61 62 2c 20 72 65 74 75 72 6e 20 61 20 6c  pTab, return a l
0400: 69 73 74 20 6f 66 20 61 6c 6c 20 74 68 65 20 74  ist of all the t
0410: 72 69 67 67 65 72 73 20 61 74 74 61 63 68 65 64  riggers attached
0420: 20 74 6f 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   to .** the tabl
0430: 65 2e 20 54 68 65 20 6c 69 73 74 20 69 73 20 63  e. The list is c
0440: 6f 6e 6e 65 63 74 65 64 20 62 79 20 54 72 69 67  onnected by Trig
0450: 67 65 72 2e 70 4e 65 78 74 20 70 6f 69 6e 74 65  ger.pNext pointe
0460: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  rs..**.** All of
0470: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 6f 6e   the triggers on
0480: 20 70 54 61 62 20 74 68 61 74 20 61 72 65 20 69   pTab that are i
0490: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
04a0: 61 73 65 20 61 73 20 70 54 61 62 0a 2a 2a 20 61  ase as pTab.** a
04b0: 72 65 20 61 6c 72 65 61 64 79 20 61 74 74 61 63  re already attac
04c0: 68 65 64 20 74 6f 20 70 54 61 62 2d 3e 70 54 72  hed to pTab->pTr
04d0: 69 67 67 65 72 2e 20 20 42 75 74 20 74 68 65 72  igger.  But ther
04e0: 65 20 6d 69 67 68 74 20 62 65 20 61 64 64 69 74  e might be addit
04f0: 69 6f 6e 61 6c 0a 2a 2a 20 74 72 69 67 67 65 72  ional.** trigger
0500: 73 20 6f 6e 20 70 54 61 62 20 69 6e 20 74 68 65  s on pTab in the
0510: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20 54   TEMP schema.  T
0520: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 65 70  his routine prep
0530: 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 54 45 4d 50  ends all.** TEMP
0540: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 70 54 61   triggers on pTa
0550: 62 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  b to the beginni
0560: 6e 67 20 6f 66 20 74 68 65 20 70 54 61 62 2d 3e  ng of the pTab->
0570: 70 54 72 69 67 67 65 72 20 6c 69 73 74 0a 2a 2a  pTrigger list.**
0580: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
0590: 20 63 6f 6d 62 69 6e 65 64 20 6c 69 73 74 2e 0a   combined list..
05a0: 2a 2a 0a 2a 2a 20 54 6f 20 73 74 61 74 65 20 69  **.** To state i
05b0: 74 20 61 6e 6f 74 68 65 72 20 77 61 79 3a 20 20  t another way:  
05c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
05d0: 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 61  urns a list of a
05e0: 6c 6c 20 74 72 69 67 67 65 72 73 0a 2a 2a 20 74  ll triggers.** t
05f0: 68 61 74 20 66 69 72 65 20 6f 66 66 20 6f 66 20  hat fire off of 
0600: 70 54 61 62 2e 20 20 54 68 65 20 6c 69 73 74 20  pTab.  The list 
0610: 77 69 6c 6c 20 69 6e 63 6c 75 64 65 20 61 6e 79  will include any
0620: 20 54 45 4d 50 20 74 72 69 67 67 65 72 73 20 6f   TEMP triggers o
0630: 6e 0a 2a 2a 20 70 54 61 62 20 61 73 20 77 65 6c  n.** pTab as wel
0640: 6c 20 61 73 20 74 68 65 20 74 72 69 67 67 65 72  l as the trigger
0650: 73 20 6c 69 73 65 64 20 69 6e 20 70 54 61 62 2d  s lised in pTab-
0660: 3e 70 54 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72  >pTrigger..*/.Tr
0670: 69 67 67 65 72 20 2a 73 71 6c 69 74 65 33 54 72  igger *sqlite3Tr
0680: 69 67 67 65 72 4c 69 73 74 28 50 61 72 73 65 20  iggerList(Parse 
0690: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
06a0: 70 54 61 62 29 7b 0a 20 20 53 63 68 65 6d 61 20  pTab){.  Schema 
06b0: 2a 20 63 6f 6e 73 74 20 70 54 6d 70 53 63 68 65  * const pTmpSche
06c0: 6d 61 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ma = pParse->db-
06d0: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[1].pSchema;
06e0: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 73  .  Trigger *pLis
06f0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
0700: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
0710: 6f 66 20 74 72 69 67 67 65 72 73 20 74 6f 20 72  of triggers to r
0720: 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  eturn */..  if( 
0730: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 54  pParse->disableT
0740: 72 69 67 67 65 72 73 20 29 7b 0a 20 20 20 20 72  riggers ){.    r
0750: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
0760: 69 66 28 20 70 54 6d 70 53 63 68 65 6d 61 21 3d  if( pTmpSchema!=
0770: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
0780: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
0790: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
07a0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
07b0: 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  Held(pParse->db,
07c0: 20 30 2c 20 70 54 6d 70 53 63 68 65 6d 61 29 20   0, pTmpSchema) 
07d0: 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  );.    for(p=sql
07e0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 54  iteHashFirst(&pT
07f0: 6d 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  mpSchema->trigHa
0800: 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  sh); p; p=sqlite
0810: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
0820: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
0830: 69 67 20 3d 20 28 54 72 69 67 67 65 72 20 2a 29  ig = (Trigger *)
0840: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
0850: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72  );.      if( pTr
0860: 69 67 2d 3e 70 54 61 62 53 63 68 65 6d 61 3d 3d  ig->pTabSchema==
0870: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 0a 20 20  pTab->pSchema.  
0880: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
0890: 65 33 53 74 72 49 43 6d 70 28 70 54 72 69 67 2d  e3StrICmp(pTrig-
08a0: 3e 74 61 62 6c 65 2c 20 70 54 61 62 2d 3e 7a 4e  >table, pTab->zN
08b0: 61 6d 65 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  ame) .      ){. 
08c0: 20 20 20 20 20 20 20 70 54 72 69 67 2d 3e 70 4e         pTrig->pN
08d0: 65 78 74 20 3d 20 28 70 4c 69 73 74 20 3f 20 70  ext = (pList ? p
08e0: 4c 69 73 74 20 3a 20 70 54 61 62 2d 3e 70 54 72  List : pTab->pTr
08f0: 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  igger);.        
0900: 70 4c 69 73 74 20 3d 20 70 54 72 69 67 3b 0a 20  pList = pTrig;. 
0910: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
0920: 0a 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73  ..  return (pLis
0930: 74 20 3f 20 70 4c 69 73 74 20 3a 20 70 54 61 62  t ? pList : pTab
0940: 2d 3e 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a  ->pTrigger);.}..
0950: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
0960: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
0970: 65 72 20 77 68 65 6e 20 69 74 20 73 65 65 73 20  er when it sees 
0980: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  a CREATE TRIGGER
0990: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 75 70   statement.** up
09a0: 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20 6f 66   to the point of
09b0: 20 74 68 65 20 42 45 47 49 4e 20 62 65 66 6f 72   the BEGIN befor
09c0: 65 20 74 68 65 20 74 72 69 67 67 65 72 20 61 63  e the trigger ac
09d0: 74 69 6f 6e 73 2e 20 20 41 20 54 72 69 67 67 65  tions.  A Trigge
09e0: 72 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69  r.** structure i
09f0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 61 73 65  s generated base
0a00: 64 20 6f 6e 20 74 68 65 20 69 6e 66 6f 72 6d 61  d on the informa
0a10: 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65 20 61  tion available a
0a20: 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  nd stored.** in 
0a30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
0a40: 67 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ger.  After the 
0a50: 74 72 69 67 67 65 72 20 61 63 74 69 6f 6e 73 20  trigger actions 
0a60: 68 61 76 65 20 62 65 65 6e 20 70 61 72 73 65 64  have been parsed
0a70: 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  , the.** sqlite3
0a80: 46 69 6e 69 73 68 54 72 69 67 67 65 72 28 29 20  FinishTrigger() 
0a90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
0aa0: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
0ab0: 68 65 20 74 72 69 67 67 65 72 0a 2a 2a 20 63 6f  he trigger.** co
0ac0: 6e 73 74 72 75 63 74 69 6f 6e 20 70 72 6f 63 65  nstruction proce
0ad0: 73 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ss..*/.void sqli
0ae0: 74 65 33 42 65 67 69 6e 54 72 69 67 67 65 72 28  te3BeginTrigger(
0af0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0b00: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
0b10: 72 73 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  rse context of t
0b20: 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45  he CREATE TRIGGE
0b30: 52 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  R statement */. 
0b40: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
0b50: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65       /* The name
0b60: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
0b70: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
0b80: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
0b90: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67  name of the trig
0ba0: 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f  ger */.  int tr_
0bb0: 74 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tm,          /* 
0bc0: 4f 6e 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45  One of TK_BEFORE
0bd0: 2c 20 54 4b 5f 41 46 54 45 52 2c 20 54 4b 5f 49  , TK_AFTER, TK_I
0be0: 4e 53 54 45 41 44 20 2a 2f 0a 20 20 69 6e 74 20  NSTEAD */.  int 
0bf0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
0c00: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e 53  /* One of TK_INS
0c10: 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20  ERT, TK_UPDATE, 
0c20: 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 49  TK_DELETE */.  I
0c30: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c  dList *pColumns,
0c40: 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73     /* column lis
0c50: 74 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  t if this is an 
0c60: 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67 65  UPDATE OF trigge
0c70: 72 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  r */.  SrcList *
0c80: 70 54 61 62 6c 65 4e 61 6d 65 2c 2f 2a 20 54 68  pTableName,/* Th
0c90: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0ca0: 62 6c 65 2f 76 69 65 77 20 74 68 65 20 74 72 69  ble/view the tri
0cb0: 67 67 65 72 20 61 70 70 6c 69 65 73 20 74 6f 20  gger applies to 
0cc0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 6e  */.  Expr *pWhen
0cd0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 4e  ,        /* WHEN
0ce0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
0cf0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
0d00: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
0d10: 54 45 4d 50 4f 52 41 52 59 20 6b 65 79 77 6f 72  TEMPORARY keywor
0d20: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0d30: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
0d40: 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73        /* Suppres
0d50: 73 20 65 72 72 6f 72 73 20 69 66 20 74 68 65 20  s errors if the 
0d60: 74 72 69 67 67 65 72 20 61 6c 72 65 61 64 79 20  trigger already 
0d70: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
0d80: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
0d90: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6e 65   = 0;  /* The ne
0da0: 77 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 54  w trigger */.  T
0db0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
0dc0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
0dd0: 74 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72  that the trigger
0de0: 20 66 69 72 65 73 20 6f 66 66 20 6f 66 20 2a 2f   fires off of */
0df0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
0e00: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61   0;        /* Na
0e10: 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  me of the trigge
0e20: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
0e30: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0e40: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
0e50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
0e60: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
0e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0e80: 20 64 61 74 61 62 61 73 65 20 74 6f 20 73 74 6f   database to sto
0e90: 72 65 20 74 68 65 20 74 72 69 67 67 65 72 20 69  re the trigger i
0ea0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
0eb0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
0ec0: 2a 20 54 68 65 20 75 6e 71 75 61 6c 69 66 69 65  * The unqualifie
0ed0: 64 20 64 62 20 6e 61 6d 65 20 2a 2f 0a 20 20 44  d db name */.  D
0ee0: 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
0ef0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20         /* State 
0f00: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 44  vector for the D
0f10: 42 20 66 69 78 65 72 20 2a 2f 0a 0a 20 20 61 73  B fixer */..  as
0f20: 73 65 72 74 28 20 70 4e 61 6d 65 31 21 3d 30 20  sert( pName1!=0 
0f30: 29 3b 20 20 20 2f 2a 20 70 4e 61 6d 65 31 2d 3e  );   /* pName1->
0f40: 7a 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 2c  z might be NULL,
0f50: 20 62 75 74 20 6e 6f 74 20 70 4e 61 6d 65 31 20   but not pName1 
0f60: 69 74 73 65 6c 66 20 2a 2f 0a 20 20 61 73 73 65  itself */.  asse
0f70: 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b  rt( pName2!=0 );
0f80: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
0f90: 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d  K_INSERT || op==
0fa0: 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d  TK_UPDATE || op=
0fb0: 3d 54 4b 5f 44 45 4c 45 54 45 20 29 3b 0a 20 20  =TK_DELETE );.  
0fc0: 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20  assert( op>0 && 
0fd0: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
0fe0: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 2f   isTemp ){.    /
0ff0: 2a 20 49 66 20 54 45 4d 50 20 77 61 73 20 73 70  * If TEMP was sp
1000: 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68  ecified, then th
1010: 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 6d  e trigger name m
1020: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
1030: 69 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ied. */.    if( 
1040: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
1050: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1060: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
1070: 6d 70 6f 72 61 72 79 20 74 72 69 67 67 65 72 20  mporary trigger 
1080: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 71 75 61  may not have qua
1090: 6c 69 66 69 65 64 20 6e 61 6d 65 22 29 3b 0a 20  lified name");. 
10a0: 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65       goto trigge
10b0: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  r_cleanup;.    }
10c0: 0a 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20  .    iDb = 1;.  
10d0: 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31    pName = pName1
10e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10f0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
1100: 20 64 62 20 74 68 61 74 20 74 68 65 20 74 72 69   db that the tri
1110: 67 67 65 72 20 77 69 6c 6c 20 62 65 20 63 72 65  gger will be cre
1120: 61 74 65 64 20 69 6e 20 2a 2f 0a 20 20 20 20 69  ated in */.    i
1130: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
1140: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
1150: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
1160: 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
1170: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
1180: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
1190: 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  anup;.    }.  }.
11a0: 20 20 69 66 28 20 21 70 54 61 62 6c 65 4e 61 6d    if( !pTableNam
11b0: 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e || db->mallocF
11c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
11d0: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
11e0: 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20 6c  p;.  }..  /* A l
11f0: 6f 6e 67 2d 73 74 61 6e 64 69 6e 67 20 70 61 72  ong-standing par
1200: 73 65 72 20 62 75 67 20 69 73 20 74 68 61 74 20  ser bug is that 
1210: 74 68 69 73 20 73 79 6e 74 61 78 20 77 61 73 20  this syntax was 
1220: 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1230: 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  **    CREATE TRI
1240: 47 47 45 52 20 61 74 74 61 63 68 65 64 2e 64 65  GGER attached.de
1250: 6d 6f 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  mo AFTER INSERT 
1260: 4f 4e 20 61 74 74 61 63 68 65 64 2e 74 61 62 20  ON attached.tab 
1270: 2e 2e 2e 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20  .....  **       
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e            ^^^^^^
12b0: 5e 5e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20  ^^.  **.  ** To 
12c0: 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
12d0: 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
12e0: 2c 20 69 67 6e 6f 72 65 20 74 68 65 20 64 61 74  , ignore the dat
12f0: 61 62 61 73 65 0a 20 20 2a 2a 20 6e 61 6d 65 20  abase.  ** name 
1300: 6f 6e 20 70 54 61 62 6c 65 4e 61 6d 65 20 69 66  on pTableName if
1310: 20 77 65 20 61 72 65 20 72 65 70 61 72 73 69 6e   we are reparsin
1320: 67 20 6f 75 74 20 6f 66 20 53 51 4c 49 54 45 5f  g out of SQLITE_
1330: 4d 41 53 54 45 52 2e 0a 20 20 2a 2f 0a 20 20 69  MASTER..  */.  i
1340: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1350: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
1360: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1370: 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e  db, pTableName->
1380: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1390: 0a 20 20 20 20 70 54 61 62 6c 65 4e 61 6d 65 2d  .    pTableName-
13a0: 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 20  >a[0].zDatabase 
13b0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
13c0: 66 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61  f the trigger na
13d0: 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69  me was unqualifi
13e0: 65 64 2c 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ed, and the tabl
13f0: 65 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  e is a temp tabl
1400: 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74  e,.  ** then set
1410: 20 69 44 62 20 74 6f 20 31 20 74 6f 20 63 72 65   iDb to 1 to cre
1420: 61 74 65 20 74 68 65 20 74 72 69 67 67 65 72 20  ate the trigger 
1430: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
1440: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20   database..  ** 
1450: 49 66 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  If sqlite3SrcLis
1460: 74 4c 6f 6f 6b 75 70 28 29 20 72 65 74 75 72 6e  tLookup() return
1470: 73 20 30 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  s 0, indicating 
1480: 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  the table does n
1490: 6f 74 0a 20 20 2a 2a 20 65 78 69 73 74 2c 20 74  ot.  ** exist, t
14a0: 68 65 20 65 72 72 6f 72 20 69 73 20 63 61 75 67  he error is caug
14b0: 68 74 20 62 79 20 74 68 65 20 62 6c 6f 63 6b 20  ht by the block 
14c0: 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 54  below..  */.  pT
14d0: 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
14e0: 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
14f0: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  , pTableName);. 
1500: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1510: 73 79 3d 3d 30 20 26 26 20 70 4e 61 6d 65 32 2d  sy==0 && pName2-
1520: 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 0a 20 20  >n==0 && pTab.  
1530: 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70        && pTab->p
1540: 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
1550: 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
1560: 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 7d 0a 0a    iDb = 1;.  }..
1570: 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
1580: 74 61 62 6c 65 20 6e 61 6d 65 20 6d 61 74 63 68  table name match
1590: 65 73 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  es database name
15a0: 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 74 61   and that the ta
15b0: 62 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ble exists */.  
15c0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
15d0: 69 6c 65 64 20 29 20 67 6f 74 6f 20 74 72 69 67  iled ) goto trig
15e0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 61  ger_cleanup;.  a
15f0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 4e 61 6d  ssert( pTableNam
1600: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
1610: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
1620: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
1630: 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20 70 4e  b, "trigger", pN
1640: 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
1650: 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
1660: 46 69 78 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  Fix, pTableName)
1670: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69   ){.    goto tri
1680: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
1690: 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  }.  pTab = sqlit
16a0: 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
16b0: 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61  pParse, pTableNa
16c0: 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
16d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74   ){.    /* The t
16e0: 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  able does not ex
16f0: 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ist. */.    if( 
1700: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
1710: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  ){.      /* Tick
1720: 65 74 20 23 33 38 31 30 2e 0a 20 20 20 20 20 20  et #3810..      
1730: 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65  ** Normally, whe
1740: 6e 65 76 65 72 20 61 20 74 61 62 6c 65 20 69 73  never a table is
1750: 20 64 72 6f 70 70 65 64 2c 20 61 6c 6c 20 61 73   dropped, all as
1760: 73 6f 63 69 61 74 65 64 20 74 72 69 67 67 65 72  sociated trigger
1770: 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 64  s are.      ** d
1780: 72 6f 70 70 65 64 20 74 6f 6f 2e 20 20 42 75 74  ropped too.  But
1790: 20 69 66 20 61 20 54 45 4d 50 20 74 72 69 67 67   if a TEMP trigg
17a0: 65 72 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e  er is created on
17b0: 20 61 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c   a non-TEMP tabl
17c0: 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  e.      ** and t
17d0: 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
17e0: 70 65 64 20 62 79 20 61 20 64 69 66 66 65 72 65  ped by a differe
17f0: 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  nt database conn
1800: 65 63 74 69 6f 6e 2c 20 74 68 65 0a 20 20 20 20  ection, the.    
1810: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20    ** trigger is 
1820: 6e 6f 74 20 76 69 73 69 62 6c 65 20 74 6f 20 74  not visible to t
1830: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1840: 65 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73  ection that does
1850: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 72   the.      ** dr
1860: 6f 70 20 73 6f 20 74 68 65 20 74 72 69 67 67 65  op so the trigge
1870: 72 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  r cannot be drop
1880: 70 65 64 2e 20 20 54 68 69 73 20 72 65 73 75 6c  ped.  This resul
1890: 74 73 20 69 6e 20 61 6e 0a 20 20 20 20 20 20 2a  ts in an.      *
18a0: 2a 20 22 6f 72 70 68 61 6e 65 64 20 74 72 69 67  * "orphaned trig
18b0: 67 65 72 22 20 2d 20 61 20 74 72 69 67 67 65 72  ger" - a trigger
18c0: 20 77 68 6f 73 65 20 61 73 73 6f 63 69 61 74 65   whose associate
18d0: 64 20 74 61 62 6c 65 20 69 73 20 6d 69 73 73 69  d table is missi
18e0: 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
18f0: 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6f 72 70 68     db->init.orph
1900: 61 6e 54 72 69 67 67 65 72 20 3d 20 31 3b 0a 20  anTrigger = 1;. 
1910: 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 74 72     }.    goto tr
1920: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
1930: 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75   }.  if( IsVirtu
1940: 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
1950: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1960: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
1970: 63 72 65 61 74 65 20 74 72 69 67 67 65 72 73 20  create triggers 
1980: 6f 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  on virtual table
1990: 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  s");.    goto tr
19a0: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
19b0: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
19c0: 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72 20  hat the trigger 
19d0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 72 65 73 65  name is not rese
19e0: 72 76 65 64 20 61 6e 64 20 74 68 61 74 20 6e 6f  rved and that no
19f0: 20 74 72 69 67 67 65 72 20 6f 66 20 74 68 65 0a   trigger of the.
1a00: 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e    ** specified n
1a10: 61 6d 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ame exists */.  
1a20: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1a30: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1a40: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
1a50: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Name==0 ){.    a
1a60: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1a70: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 67  cFailed );.    g
1a80: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
1a90: 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  nup;.  }.  if( s
1aa0: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
1ab0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
1ac0: 61 6d 65 2c 20 22 74 72 69 67 67 65 72 22 2c 20  ame, "trigger", 
1ad0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a  pTab->zName) ){.
1ae0: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
1af0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
1b00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1b10: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1b20: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
1b30: 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f  if( !IN_RENAME_O
1b40: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 69 66 28  BJECT ){.    if(
1b50: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1b60: 28 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  (&(db->aDb[iDb].
1b70: 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73  pSchema->trigHas
1b80: 68 29 2c 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  h),zName) ){.   
1b90: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
1ba0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bb0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1bc0: 20 22 74 72 69 67 67 65 72 20 25 54 20 61 6c 72   "trigger %T alr
1bd0: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
1be0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
1bf0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
1c00: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
1c10: 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
1c20: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
1c30: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
1c40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c50: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
1c60: 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  eanup;.    }.  }
1c70: 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 63 72  ..  /* Do not cr
1c80: 65 61 74 65 20 61 20 74 72 69 67 67 65 72 20 6f  eate a trigger o
1c90: 6e 20 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65  n a system table
1ca0: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1cb0: 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
1cc0: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
1cd0: 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , 7)==0 ){.    s
1ce0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1cf0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
1d00: 72 65 61 74 65 20 74 72 69 67 67 65 72 20 6f 6e  reate trigger on
1d10: 20 73 79 73 74 65 6d 20 74 61 62 6c 65 22 29 3b   system table");
1d20: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
1d30: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  r_cleanup;.  }..
1d40: 20 20 2f 2a 20 49 4e 53 54 45 41 44 20 6f 66 20    /* INSTEAD of 
1d50: 74 72 69 67 67 65 72 73 20 61 72 65 20 6f 6e 6c  triggers are onl
1d60: 79 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20  y for views and 
1d70: 76 69 65 77 73 20 6f 6e 6c 79 20 73 75 70 70 6f  views only suppo
1d80: 72 74 20 49 4e 53 54 45 41 44 0a 20 20 2a 2a 20  rt INSTEAD.  ** 
1d90: 6f 66 20 74 72 69 67 67 65 72 73 2e 0a 20 20 2a  of triggers..  *
1da0: 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  /.  if( pTab->pS
1db0: 65 6c 65 63 74 20 26 26 20 74 72 5f 74 6d 21 3d  elect && tr_tm!=
1dc0: 54 4b 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20 20  TK_INSTEAD ){.  
1dd0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1de0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
1df0: 74 20 63 72 65 61 74 65 20 25 73 20 74 72 69 67  t create %s trig
1e00: 67 65 72 20 6f 6e 20 76 69 65 77 3a 20 25 53 22  ger on view: %S"
1e10: 2c 20 0a 20 20 20 20 20 20 20 20 28 74 72 5f 74  , .        (tr_t
1e20: 6d 20 3d 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f  m == TK_BEFORE)?
1e30: 22 42 45 46 4f 52 45 22 3a 22 41 46 54 45 52 22  "BEFORE":"AFTER"
1e40: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29  , pTableName, 0)
1e50: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  ;.    goto trigg
1e60: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
1e70: 20 20 69 66 28 20 21 70 54 61 62 2d 3e 70 53 65    if( !pTab->pSe
1e80: 6c 65 63 74 20 26 26 20 74 72 5f 74 6d 3d 3d 54  lect && tr_tm==T
1e90: 4b 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20  K_INSTEAD ){.   
1ea0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1eb0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
1ec0: 20 63 72 65 61 74 65 20 49 4e 53 54 45 41 44 20   create INSTEAD 
1ed0: 4f 46 22 0a 20 20 20 20 20 20 20 20 22 20 74 72  OF".        " tr
1ee0: 69 67 67 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20  igger on table: 
1ef0: 25 53 22 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c  %S", pTableName,
1f00: 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72   0);.    goto tr
1f10: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
1f20: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1f30: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1f40: 41 54 49 4f 4e 0a 20 20 69 66 28 20 21 49 4e 5f  ATION.  if( !IN_
1f50: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
1f60: 0a 20 20 20 20 69 6e 74 20 69 54 61 62 44 62 20  .    int iTabDb 
1f70: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
1f80: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
1f90: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69  >pSchema);.    i
1fa0: 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
1fb0: 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 3b  _CREATE_TRIGGER;
1fc0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1fd0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
1fe0: 54 61 62 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  TabDb].zDbSName;
1ff0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2000: 2a 7a 44 62 54 72 69 67 20 3d 20 69 73 54 65 6d  *zDbTrig = isTem
2010: 70 20 3f 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  p ? db->aDb[1].z
2020: 44 62 53 4e 61 6d 65 20 3a 20 7a 44 62 3b 0a 20  DbSName : zDb;. 
2030: 20 20 20 69 66 28 20 69 54 61 62 44 62 3d 3d 31     if( iTabDb==1
2040: 20 7c 7c 20 69 73 54 65 6d 70 20 29 20 63 6f 64   || isTemp ) cod
2050: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
2060: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a  E_TEMP_TRIGGER;.
2070: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
2080: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
2090: 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 70 54   code, zName, pT
20a0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 54 72  ab->zName, zDbTr
20b0: 69 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ig) ){.      got
20c0: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
20d0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
20e0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20f0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
2100: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
2110: 54 41 42 4c 45 28 69 54 61 62 44 62 29 2c 30 2c  TABLE(iTabDb),0,
2120: 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
2130: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
2140: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  p;.    }.  }.#en
2150: 64 69 66 0a 0a 20 20 2f 2a 20 49 4e 53 54 45 41  dif..  /* INSTEA
2160: 44 20 4f 46 20 74 72 69 67 67 65 72 73 20 63 61  D OF triggers ca
2170: 6e 20 6f 6e 6c 79 20 61 70 70 65 61 72 20 6f 6e  n only appear on
2180: 20 76 69 65 77 73 20 61 6e 64 20 42 45 46 4f 52   views and BEFOR
2190: 45 20 74 72 69 67 67 65 72 73 0a 20 20 2a 2a 20  E triggers.  ** 
21a0: 63 61 6e 6e 6f 74 20 61 70 70 65 61 72 20 6f 6e  cannot appear on
21b0: 20 76 69 65 77 73 2e 20 20 53 6f 20 77 65 20 6d   views.  So we m
21c0: 69 67 68 74 20 61 73 20 77 65 6c 6c 20 74 72 61  ight as well tra
21d0: 6e 73 6c 61 74 65 20 65 76 65 72 79 0a 20 20 2a  nslate every.  *
21e0: 2a 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69  * INSTEAD OF tri
21f0: 67 67 65 72 20 69 6e 74 6f 20 61 20 42 45 46 4f  gger into a BEFO
2200: 52 45 20 74 72 69 67 67 65 72 2e 20 20 49 74 20  RE trigger.  It 
2210: 73 69 6d 70 6c 69 66 69 65 73 20 63 6f 64 65 0a  simplifies code.
2220: 20 20 2a 2a 20 65 6c 73 65 77 68 65 72 65 2e 0a    ** elsewhere..
2230: 20 20 2a 2f 0a 20 20 69 66 20 28 74 72 5f 74 6d    */.  if (tr_tm
2240: 20 3d 3d 20 54 4b 5f 49 4e 53 54 45 41 44 29 7b   == TK_INSTEAD){
2250: 0a 20 20 20 20 74 72 5f 74 6d 20 3d 20 54 4b 5f  .    tr_tm = TK_
2260: 42 45 46 4f 52 45 3b 0a 20 20 7d 0a 0a 20 20 2f  BEFORE;.  }..  /
2270: 2a 20 42 75 69 6c 64 20 74 68 65 20 54 72 69 67  * Build the Trig
2280: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
2290: 70 54 72 69 67 67 65 72 20 3d 20 28 54 72 69 67  pTrigger = (Trig
22a0: 67 65 72 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  ger*)sqlite3DbMa
22b0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
22c0: 65 6f 66 28 54 72 69 67 67 65 72 29 29 3b 0a 20  eof(Trigger));. 
22d0: 20 69 66 28 20 70 54 72 69 67 67 65 72 3d 3d 30   if( pTrigger==0
22e0: 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f   ) goto trigger_
22f0: 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 72 69 67  cleanup;.  pTrig
2300: 67 65 72 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ger->zName = zNa
2310: 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  me;.  zName = 0;
2320: 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62  .  pTrigger->tab
2330: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  le = sqlite3DbSt
2340: 72 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 4e  rDup(db, pTableN
2350: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 29  ame->a[0].zName)
2360: 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53  ;.  pTrigger->pS
2370: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
2380: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
2390: 70 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63  pTrigger->pTabSc
23a0: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
23b0: 68 65 6d 61 3b 0a 20 20 70 54 72 69 67 67 65 72  hema;.  pTrigger
23c0: 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20  ->op = (u8)op;. 
23d0: 20 70 54 72 69 67 67 65 72 2d 3e 74 72 5f 74 6d   pTrigger->tr_tm
23e0: 20 3d 20 74 72 5f 74 6d 3d 3d 54 4b 5f 42 45 46   = tr_tm==TK_BEF
23f0: 4f 52 45 20 3f 20 54 52 49 47 47 45 52 5f 42 45  ORE ? TRIGGER_BE
2400: 46 4f 52 45 20 3a 20 54 52 49 47 47 45 52 5f 41  FORE : TRIGGER_A
2410: 46 54 45 52 3b 0a 20 20 69 66 28 20 49 4e 5f 52  FTER;.  if( IN_R
2420: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
2430: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
2440: 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72  eTokenRemap(pPar
2450: 73 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61  se, pTrigger->ta
2460: 62 6c 65 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d  ble, pTableName-
2470: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[0].zName);.  
2480: 20 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65    pTrigger->pWhe
2490: 6e 20 3d 20 70 57 68 65 6e 3b 0a 20 20 20 20 70  n = pWhen;.    p
24a0: 57 68 65 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  When = 0;.  }els
24b0: 65 7b 0a 20 20 20 20 70 54 72 69 67 67 65 72 2d  e{.    pTrigger-
24c0: 3e 70 57 68 65 6e 20 3d 20 73 71 6c 69 74 65 33  >pWhen = sqlite3
24d0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65  ExprDup(db, pWhe
24e0: 6e 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  n, EXPRDUP_REDUC
24f0: 45 29 3b 0a 20 20 7d 0a 20 20 70 54 72 69 67 67  E);.  }.  pTrigg
2500: 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 20 3d 20 70  er->pColumns = p
2510: 43 6f 6c 75 6d 6e 73 3b 0a 20 20 70 43 6f 6c 75  Columns;.  pColu
2520: 6d 6e 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  mns = 0;.  asser
2530: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
2540: 72 69 67 67 65 72 3d 3d 30 20 29 3b 0a 20 20 70  rigger==0 );.  p
2550: 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67  Parse->pNewTrigg
2560: 65 72 20 3d 20 70 54 72 69 67 67 65 72 3b 0a 0a  er = pTrigger;..
2570: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a  trigger_cleanup:
2580: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2590: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
25a0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
25b0: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 4e 61  ete(db, pTableNa
25c0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  me);.  sqlite3Id
25d0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
25e0: 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69  Columns);.  sqli
25f0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
2600: 2c 20 70 57 68 65 6e 29 3b 0a 20 20 69 66 28 20  , pWhen);.  if( 
2610: 21 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69  !pParse->pNewTri
2620: 67 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  gger ){.    sqli
2630: 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72  te3DeleteTrigger
2640: 28 64 62 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  (db, pTrigger);.
2650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2660: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
2670: 77 54 72 69 67 67 65 72 3d 3d 70 54 72 69 67 67  wTrigger==pTrigg
2680: 65 72 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  er );.  }.}../*.
2690: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26a0: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
26b0: 61 6c 6c 20 6f 66 20 74 68 65 20 74 72 69 67 67  all of the trigg
26c0: 65 72 20 61 63 74 69 6f 6e 73 20 68 61 76 65 20  er actions have 
26d0: 62 65 65 6e 20 70 61 72 73 65 64 0a 2a 2a 20 69  been parsed.** i
26e0: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
26f0: 65 74 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ete the process 
2700: 6f 66 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20  of building the 
2710: 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  trigger..*/.void
2720: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 54 72   sqlite3FinishTr
2730: 69 67 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a  igger(.  Parse *
2740: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2750: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
2760: 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53  xt */.  TriggerS
2770: 74 65 70 20 2a 70 53 74 65 70 4c 69 73 74 2c 20  tep *pStepList, 
2780: 2f 2a 20 54 68 65 20 74 72 69 67 67 65 72 65 64  /* The triggered
2790: 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 54 6f   program */.  To
27a0: 6b 65 6e 20 2a 70 41 6c 6c 20 20 20 20 20 20 20  ken *pAll       
27b0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74        /* Token t
27c0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
27d0: 65 20 63 6f 6d 70 6c 65 74 65 20 43 52 45 41 54  e complete CREAT
27e0: 45 20 54 52 49 47 47 45 52 20 2a 2f 0a 29 7b 0a  E TRIGGER */.){.
27f0: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
2800: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
2810: 72 69 67 67 65 72 3b 20 20 20 2f 2a 20 54 72 69  rigger;   /* Tri
2820: 67 67 65 72 20 62 65 69 6e 67 20 66 69 6e 69 73  gger being finis
2830: 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  hed */.  char *z
2840: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 72 69 67   /* Name of trig
2870: 67 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ger */.  sqlite3
2880: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2890: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
28a0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
28b0: 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46   */.  DbFixer sF
28c0: 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28e0: 20 46 69 78 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Fixer object */
28f0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2920: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2930: 67 20 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f  g the trigger */
2940: 0a 20 20 54 6f 6b 65 6e 20 6e 61 6d 65 54 6f 6b  .  Token nameTok
2950: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2970: 69 67 67 65 72 20 6e 61 6d 65 20 66 6f 72 20 65  igger name for e
2980: 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 20 2a  rror reporting *
2990: 2f 0a 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  /..  pParse->pNe
29a0: 77 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20  wTrigger = 0;.  
29b0: 69 66 28 20 4e 45 56 45 52 28 70 50 61 72 73 65  if( NEVER(pParse
29c0: 2d 3e 6e 45 72 72 29 20 7c 7c 20 21 70 54 72 69  ->nErr) || !pTri
29d0: 67 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72  g ) goto trigger
29e0: 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a  finish_cleanup;.
29f0: 20 20 7a 4e 61 6d 65 20 3d 20 70 54 72 69 67 2d    zName = pTrig-
2a00: 3e 7a 4e 61 6d 65 3b 0a 20 20 69 44 62 20 3d 20  >zName;.  iDb = 
2a10: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
2a20: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
2a30: 20 70 54 72 69 67 2d 3e 70 53 63 68 65 6d 61 29   pTrig->pSchema)
2a40: 3b 0a 20 20 70 54 72 69 67 2d 3e 73 74 65 70 5f  ;.  pTrig->step_
2a50: 6c 69 73 74 20 3d 20 70 53 74 65 70 4c 69 73 74  list = pStepList
2a60: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 74 65 70  ;.  while( pStep
2a70: 4c 69 73 74 20 29 7b 0a 20 20 20 20 70 53 74 65  List ){.    pSte
2a80: 70 4c 69 73 74 2d 3e 70 54 72 69 67 20 3d 20 70  pList->pTrig = p
2a90: 54 72 69 67 3b 0a 20 20 20 20 70 53 74 65 70 4c  Trig;.    pStepL
2aa0: 69 73 74 20 3d 20 70 53 74 65 70 4c 69 73 74 2d  ist = pStepList-
2ab0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 73 71  >pNext;.  }.  sq
2ac0: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
2ad0: 6e 61 6d 65 54 6f 6b 65 6e 2c 20 70 54 72 69 67  nameToken, pTrig
2ae0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
2af0: 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
2b00: 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
2b10: 74 72 69 67 67 65 72 22 2c 20 26 6e 61 6d 65 54  trigger", &nameT
2b20: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c  oken);.  if( sql
2b30: 69 74 65 33 46 69 78 54 72 69 67 67 65 72 53 74  ite3FixTriggerSt
2b40: 65 70 28 26 73 46 69 78 2c 20 70 54 72 69 67 2d  ep(&sFix, pTrig-
2b50: 3e 73 74 65 70 5f 6c 69 73 74 29 20 0a 20 20 20  >step_list) .   
2b60: 7c 7c 20 73 71 6c 69 74 65 33 46 69 78 45 78 70  || sqlite3FixExp
2b70: 72 28 26 73 46 69 78 2c 20 70 54 72 69 67 2d 3e  r(&sFix, pTrig->
2b80: 70 57 68 65 6e 29 20 0a 20 20 29 7b 0a 20 20 20  pWhen) .  ){.   
2b90: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e   goto triggerfin
2ba0: 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ish_cleanup;.  }
2bb0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2bc0: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
2bd0: 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
2be0: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 61  _OBJECT ){.    a
2bf0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
2c00: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 70 50 61  .busy );.    pPa
2c10: 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72  rse->pNewTrigger
2c20: 20 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 70 54   = pTrig;.    pT
2c30: 72 69 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rig = 0;.  }else
2c40: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 69 66  .#endif..  /* if
2c50: 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74   we are not init
2c60: 69 61 6c 69 7a 69 6e 67 2c 0a 20 20 2a 2a 20 62  ializing,.  ** b
2c70: 75 69 6c 64 20 74 68 65 20 73 71 6c 69 74 65 5f  uild the sqlite_
2c80: 6d 61 73 74 65 72 20 65 6e 74 72 79 0a 20 20 2a  master entry.  *
2c90: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
2ca0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 56 64  t.busy ){.    Vd
2cb0: 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
2cc0: 2a 7a 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  *z;..    /* Make
2cd0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
2ce0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
2cf0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 76 20 3d 20  able */.    v = 
2d00: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
2d10: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
2d20: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72 69 67  v==0 ) goto trig
2d30: 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75  gerfinish_cleanu
2d40: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  p;.    sqlite3Be
2d50: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
2d60: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
2d70: 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  );.    z = sqlit
2d80: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
2d90: 28 63 68 61 72 2a 29 70 41 6c 6c 2d 3e 7a 2c 20  (char*)pAll->z, 
2da0: 70 41 6c 6c 2d 3e 6e 29 3b 0a 20 20 20 20 74 65  pAll->n);.    te
2db0: 73 74 63 61 73 65 28 20 7a 3d 3d 30 20 29 3b 0a  stcase( z==0 );.
2dc0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
2dd0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
2de0: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
2df0: 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28  TO %Q.%s VALUES(
2e00: 27 74 72 69 67 67 65 72 27 2c 25 51 2c 25 51 2c  'trigger',%Q,%Q,
2e10: 30 2c 27 43 52 45 41 54 45 20 54 52 49 47 47 45  0,'CREATE TRIGGE
2e20: 52 20 25 71 27 29 22 2c 0a 20 20 20 20 20 20 20  R %q')",.       
2e30: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
2e40: 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
2e50: 4d 45 2c 20 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ME, zName,.     
2e60: 20 20 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c 20    pTrig->table, 
2e70: 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  z);.    sqlite3D
2e80: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
2e90: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
2ea0: 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
2eb0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
2ec0: 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
2ed0: 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
2ee0: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
2ef0: 74 66 28 64 62 2c 20 22 74 79 70 65 3d 27 74 72  tf(db, "type='tr
2f00: 69 67 67 65 72 27 20 41 4e 44 20 6e 61 6d 65 3d  igger' AND name=
2f10: 27 25 71 27 22 2c 20 7a 4e 61 6d 65 29 29 3b 0a  '%q'", zName));.
2f20: 20 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69    }..  if( db->i
2f30: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
2f40: 54 72 69 67 67 65 72 20 2a 70 4c 69 6e 6b 20 3d  Trigger *pLink =
2f50: 20 70 54 72 69 67 3b 0a 20 20 20 20 48 61 73 68   pTrig;.    Hash
2f60: 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61   *pHash = &db->a
2f70: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
2f80: 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20 61  >trigHash;.    a
2f90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2fa0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2fb0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
2fc0: 20 61 73 73 65 72 74 28 20 70 4c 69 6e 6b 21 3d   assert( pLink!=
2fd0: 30 20 29 3b 0a 20 20 20 20 70 54 72 69 67 20 3d  0 );.    pTrig =
2fe0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2ff0: 72 74 28 70 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  rt(pHash, zName,
3000: 20 70 54 72 69 67 29 3b 0a 20 20 20 20 69 66 28   pTrig);.    if(
3010: 20 70 54 72 69 67 20 29 7b 0a 20 20 20 20 20 20   pTrig ){.      
3020: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
3030: 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  db);.    }else i
3040: 66 28 20 70 4c 69 6e 6b 2d 3e 70 53 63 68 65 6d  f( pLink->pSchem
3050: 61 3d 3d 70 4c 69 6e 6b 2d 3e 70 54 61 62 53 63  a==pLink->pTabSc
3060: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 54 61  hema ){.      Ta
3070: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
3080: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 48   pTab = sqlite3H
3090: 61 73 68 46 69 6e 64 28 26 70 4c 69 6e 6b 2d 3e  ashFind(&pLink->
30a0: 70 54 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48  pTabSchema->tblH
30b0: 61 73 68 2c 20 70 4c 69 6e 6b 2d 3e 74 61 62 6c  ash, pLink->tabl
30c0: 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
30d0: 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
30e0: 20 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20     pLink->pNext 
30f0: 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72  = pTab->pTrigger
3100: 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 54  ;.      pTab->pT
3110: 72 69 67 67 65 72 20 3d 20 70 4c 69 6e 6b 3b 0a  rigger = pLink;.
3120: 20 20 20 20 7d 0a 20 20 7d 0a 0a 74 72 69 67 67      }.  }..trigg
3130: 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70  erfinish_cleanup
3140: 3a 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  :.  sqlite3Delet
3150: 65 54 72 69 67 67 65 72 28 64 62 2c 20 70 54 72  eTrigger(db, pTr
3160: 69 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 49  ig);.  assert( I
3170: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
3180: 7c 7c 20 21 70 50 61 72 73 65 2d 3e 70 4e 65 77  || !pParse->pNew
3190: 54 72 69 67 67 65 72 20 29 3b 0a 20 20 73 71 6c  Trigger );.  sql
31a0: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
31b0: 72 53 74 65 70 28 64 62 2c 20 70 53 74 65 70 4c  rStep(db, pStepL
31c0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ist);.}../*.** D
31d0: 75 70 6c 69 63 61 74 65 20 61 20 72 61 6e 67 65  uplicate a range
31e0: 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 61 6e   of text from an
31f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
3200: 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 61 6c 6c  then convert all
3210: 0a 2a 2a 20 77 68 69 74 65 73 70 61 63 65 20 63  .** whitespace c
3220: 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20 6f  haracters into o
3230: 72 64 69 6e 61 72 79 20 73 70 61 63 65 20 63 68  rdinary space ch
3240: 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
3250: 74 69 63 20 63 68 61 72 20 2a 74 72 69 67 67 65  tic char *trigge
3260: 72 53 70 61 6e 44 75 70 28 73 71 6c 69 74 65 33  rSpanDup(sqlite3
3270: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
3280: 20 2a 7a 53 74 61 72 74 2c 20 63 6f 6e 73 74 20   *zStart, const 
3290: 63 68 61 72 20 2a 7a 45 6e 64 29 7b 0a 20 20 63  char *zEnd){.  c
32a0: 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
32b0: 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53  DbSpanDup(db, zS
32c0: 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 69  tart, zEnd);.  i
32d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 20 29 20  nt i;.  if( z ) 
32e0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
32f0: 2b 2b 29 20 69 66 28 20 73 71 6c 69 74 65 33 49  ++) if( sqlite3I
3300: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 20 7a  sspace(z[i]) ) z
3310: 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20 72 65 74  [i] = ' ';.  ret
3320: 75 72 6e 20 7a 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn z;.}    ../*
3330: 0a 2a 2a 20 54 75 72 6e 20 61 20 53 45 4c 45 43  .** Turn a SELEC
3340: 54 20 73 74 61 74 65 6d 65 6e 74 20 28 74 68 61  T statement (tha
3350: 74 20 74 68 65 20 70 53 65 6c 65 63 74 20 70 61  t the pSelect pa
3360: 72 61 6d 65 74 65 72 20 70 6f 69 6e 74 73 20 74  rameter points t
3370: 6f 29 20 69 6e 74 6f 0a 2a 2a 20 61 20 74 72 69  o) into.** a tri
3380: 67 67 65 72 20 73 74 65 70 2e 20 20 52 65 74 75  gger step.  Retu
3390: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
33a0: 61 20 54 72 69 67 67 65 72 53 74 65 70 20 73 74  a TriggerStep st
33b0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
33c0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
33d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
33e0: 6e 20 69 74 20 66 69 6e 64 73 20 61 20 53 45 4c  n it finds a SEL
33f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
3400: 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20 54 52  .** body of a TR
3410: 49 47 47 45 52 2e 20 20 0a 2a 2f 0a 54 72 69 67  IGGER.  .*/.Trig
3420: 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33  gerStep *sqlite3
3430: 54 72 69 67 67 65 72 53 65 6c 65 63 74 53 74 65  TriggerSelectSte
3440: 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p(.  sqlite3 *db
3450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3460: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
3470: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  nection */.  Sel
3480: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
3490: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
34a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
34b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
34c0: 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 20 20   *zStart,       
34d0: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 53 51    /* Start of SQ
34e0: 4c 20 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  L text */.  cons
34f0: 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20  t char *zEnd    
3500: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
3510: 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 29 7b  f SQL text */.){
3520: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
3530: 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 73  pTriggerStep = s
3540: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
3550: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72  ro(db, sizeof(Tr
3560: 69 67 67 65 72 53 74 65 70 29 29 3b 0a 20 20 69  iggerStep));.  i
3570: 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70 3d  f( pTriggerStep=
3580: 3d 30 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74  =0 ) {.    sqlit
3590: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
35a0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
35b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
35c0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f   pTriggerStep->o
35d0: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
35e0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
35f0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
3600: 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ;.  pTriggerStep
3610: 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44 65  ->orconf = OE_De
3620: 66 61 75 6c 74 3b 0a 20 20 70 54 72 69 67 67 65  fault;.  pTrigge
3630: 72 53 74 65 70 2d 3e 7a 53 70 61 6e 20 3d 20 74  rStep->zSpan = t
3640: 72 69 67 67 65 72 53 70 61 6e 44 75 70 28 64 62  riggerSpanDup(db
3650: 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b  , zStart, zEnd);
3660: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67  .  return pTrigg
3670: 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erStep;.}../*.**
3680: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
3690: 74 6f 20 68 6f 6c 64 20 61 20 6e 65 77 20 74 72  to hold a new tr
36a0: 69 67 67 65 72 20 73 74 65 70 2e 20 20 54 68 65  igger step.  The
36b0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
36c0: 0a 2a 2a 20 68 6f 6c 64 73 20 62 6f 74 68 20 74  .** holds both t
36d0: 68 65 20 54 72 69 67 67 65 72 53 74 65 70 20 6f  he TriggerStep o
36e0: 62 6a 65 63 74 20 61 6e 64 20 74 68 65 20 54 72  bject and the Tr
36f0: 69 67 67 65 72 53 74 65 70 2e 74 61 72 67 65 74  iggerStep.target
3700: 2e 7a 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  .z string..**.**
3710: 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
3720: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
3730: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 64 62   returned and db
3740: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 69  ->mallocFailed i
3750: 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
3760: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 74 72   TriggerStep *tr
3770: 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63 61 74  iggerStepAllocat
3780: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
3790: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
37a0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
37b0: 78 74 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20  xt */.  u8 op,  
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d0: 20 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 6f      /* Trigger o
37e0: 70 63 6f 64 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  pcode */.  Token
37f0: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *pName,        
3800: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
3810: 72 67 65 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  rget name */.  c
3820: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72  onst char *zStar
3830: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  t,         /* St
3840: 61 72 74 20 6f 66 20 53 51 4c 20 74 65 78 74 20  art of SQL text 
3850: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
3860: 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 20 20 20  *zEnd           
3870: 20 2f 2a 20 45 6e 64 20 6f 66 20 53 51 4c 20 74   /* End of SQL t
3880: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
3890: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
38a0: 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 53  ->db;.  TriggerS
38b0: 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65  tep *pTriggerSte
38c0: 70 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74  p;..  pTriggerSt
38d0: 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ep = sqlite3DbMa
38e0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
38f0: 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29  eof(TriggerStep)
3900: 20 2b 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 31 29   + pName->n + 1)
3910: 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  ;.  if( pTrigger
3920: 53 74 65 70 20 29 7b 0a 20 20 20 20 63 68 61 72  Step ){.    char
3930: 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 54   *z = (char*)&pT
3940: 72 69 67 67 65 72 53 74 65 70 5b 31 5d 3b 0a 20  riggerStep[1];. 
3950: 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61     memcpy(z, pNa
3960: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
3970: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
3980: 75 6f 74 65 28 7a 29 3b 0a 20 20 20 20 70 54 72  uote(z);.    pTr
3990: 69 67 67 65 72 53 74 65 70 2d 3e 7a 54 61 72 67  iggerStep->zTarg
39a0: 65 74 20 3d 20 7a 3b 0a 20 20 20 20 70 54 72 69  et = z;.    pTri
39b0: 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 6f  ggerStep->op = o
39c0: 70 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53  p;.    pTriggerS
39d0: 74 65 70 2d 3e 7a 53 70 61 6e 20 3d 20 74 72 69  tep->zSpan = tri
39e0: 67 67 65 72 53 70 61 6e 44 75 70 28 64 62 2c 20  ggerSpanDup(db, 
39f0: 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20  zStart, zEnd);. 
3a00: 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
3a10: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
3a20: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
3a30: 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 70  kenMap(pParse, p
3a40: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 7a 54 61  TriggerStep->zTa
3a50: 72 67 65 74 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  rget, pName);.  
3a60: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3a70: 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d   pTriggerStep;.}
3a80: 0a 0a 2f 2a 0a 2a 2a 20 42 75 69 6c 64 20 61 20  ../*.** Build a 
3a90: 74 72 69 67 67 65 72 20 73 74 65 70 20 6f 75 74  trigger step out
3aa0: 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 73 74   of an INSERT st
3ab0: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
3ac0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
3ad0: 20 74 68 65 20 6e 65 77 20 74 72 69 67 67 65 72   the new trigger
3ae0: 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   step..**.** The
3af0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
3b00: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
3b10: 69 74 20 73 65 65 73 20 61 6e 20 49 4e 53 45 52  it sees an INSER
3b20: 54 20 69 6e 73 69 64 65 20 74 68 65 0a 2a 2a 20  T inside the.** 
3b30: 62 6f 64 79 20 6f 66 20 61 20 74 72 69 67 67 65  body of a trigge
3b40: 72 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65  r..*/.TriggerSte
3b50: 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65  p *sqlite3Trigge
3b60: 72 49 6e 73 65 72 74 53 74 65 70 28 0a 20 20 50  rInsertStep(.  P
3b70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3b80: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 2a 2f 0a     /* Parser */.
3b90: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
3ba0: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
3bb0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20   the table into 
3bc0: 77 68 69 63 68 20 77 65 20 69 6e 73 65 72 74 20  which we insert 
3bd0: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f  */.  IdList *pCo
3be0: 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20 4c 69 73 74  lumn,    /* List
3bf0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   of columns in p
3c00: 54 61 62 6c 65 4e 61 6d 65 20 74 6f 20 69 6e 73  TableName to ins
3c10: 65 72 74 20 69 6e 74 6f 20 2a 2f 0a 20 20 53 65  ert into */.  Se
3c20: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
3c30: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
3c40: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 73 75 70  atement that sup
3c50: 70 6c 69 65 73 20 76 61 6c 75 65 73 20 2a 2f 0a  plies values */.
3c60: 20 20 75 38 20 6f 72 63 6f 6e 66 2c 20 20 20 20    u8 orconf,    
3c70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
3c80: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20  flict algorithm 
3c90: 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 52 65  (OE_Abort, OE_Re
3ca0: 70 6c 61 63 65 2c 20 65 74 63 2e 29 20 2a 2f 0a  place, etc.) */.
3cb0: 20 20 55 70 73 65 72 74 20 2a 70 55 70 73 65 72    Upsert *pUpser
3cc0: 74 2c 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46  t,    /* ON CONF
3cd0: 4c 49 43 54 20 63 6c 61 75 73 65 73 20 66 6f 72  LICT clauses for
3ce0: 20 75 70 73 65 72 74 20 2a 2f 0a 20 20 63 6f 6e   upsert */.  con
3cf0: 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c  st char *zStart,
3d00: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 53 51 4c   /* Start of SQL
3d10: 20 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74   text */.  const
3d20: 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 2f   char *zEnd    /
3d30: 2a 20 45 6e 64 20 6f 66 20 53 51 4c 20 74 65 78  * End of SQL tex
3d40: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
3d50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
3d60: 64 62 3b 0a 20 20 54 72 69 67 67 65 72 53 74 65  db;.  TriggerSte
3d70: 70 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b  p *pTriggerStep;
3d80: 0a 0a 20 20 61 73 73 65 72 74 28 70 53 65 6c 65  ..  assert(pSele
3d90: 63 74 20 21 3d 20 30 20 7c 7c 20 64 62 2d 3e 6d  ct != 0 || db->m
3da0: 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 0a 20  allocFailed);.. 
3db0: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20   pTriggerStep = 
3dc0: 74 72 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63  triggerStepAlloc
3dd0: 61 74 65 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  ate(pParse, TK_I
3de0: 4e 53 45 52 54 2c 20 70 54 61 62 6c 65 4e 61 6d  NSERT, pTableNam
3df0: 65 2c 7a 53 74 61 72 74 2c 7a 45 6e 64 29 3b 0a  e,zStart,zEnd);.
3e00: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
3e10: 65 70 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e  ep ){.    if( IN
3e20: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
3e30: 7b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  {.      pTrigger
3e40: 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Step->pSelect = 
3e50: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 70  pSelect;.      p
3e60: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 20 20  Select = 0;.    
3e70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 72  }else{.      pTr
3e80: 69 67 67 65 72 53 74 65 70 2d 3e 70 53 65 6c 65  iggerStep->pSele
3e90: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
3ea0: 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
3eb0: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
3ec0: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  E);.    }.    pT
3ed0: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c  riggerStep->pIdL
3ee0: 69 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20  ist = pColumn;. 
3ef0: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
3f00: 3e 70 55 70 73 65 72 74 20 3d 20 70 55 70 73 65  >pUpsert = pUpse
3f10: 72 74 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  rt;.    pTrigger
3f20: 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f  Step->orconf = o
3f30: 72 63 6f 6e 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rconf;.  }else{.
3f40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
3f50: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73 71 6c  olumn );.    sql
3f60: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
3f70: 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b 0a 20  (db, pColumn);. 
3f80: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 55 70     testcase( pUp
3f90: 73 65 72 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  sert );.    sqli
3fa0: 74 65 33 55 70 73 65 72 74 44 65 6c 65 74 65 28  te3UpsertDelete(
3fb0: 64 62 2c 20 70 55 70 73 65 72 74 29 3b 0a 20 20  db, pUpsert);.  
3fc0: 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
3fd0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
3fe0: 65 63 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ect);..  return 
3ff0: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a  pTriggerStep;.}.
4000: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
4010: 20 61 20 74 72 69 67 67 65 72 20 73 74 65 70 20   a trigger step 
4020: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
4030: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
4040: 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ent and return.*
4050: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
4060: 68 61 74 20 74 72 69 67 67 65 72 20 73 74 65 70  hat trigger step
4070: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 63 61  .  The parser ca
4080: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
4090: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73 65 65 73   when it.** sees
40a0: 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
40b0: 6d 65 6e 74 20 69 6e 73 69 64 65 20 74 68 65 20  ment inside the 
40c0: 62 6f 64 79 20 6f 66 20 61 20 43 52 45 41 54 45  body of a CREATE
40d0: 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a 54 72 69   TRIGGER..*/.Tri
40e0: 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65  ggerStep *sqlite
40f0: 33 54 72 69 67 67 65 72 55 70 64 61 74 65 53 74  3TriggerUpdateSt
4100: 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
4110: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
4120: 20 50 61 72 73 65 72 20 2a 2f 0a 20 20 54 6f 6b   Parser */.  Tok
4130: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20  en *pTableName, 
4140: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
4150: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 75 70 64   table to be upd
4160: 61 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ated */.  ExprLi
4170: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f  st *pEList,    /
4180: 2a 20 54 68 65 20 53 45 54 20 63 6c 61 75 73 65  * The SET clause
4190: 3a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  : list of column
41a0: 20 61 6e 64 20 6e 65 77 20 76 61 6c 75 65 73 20   and new values 
41b0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
41c0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
41d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
41e0: 0a 20 20 75 38 20 6f 72 63 6f 6e 66 2c 20 20 20  .  u8 orconf,   
41f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
4200: 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68  onflict algorith
4210: 6d 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45  m. (OE_Abort, OE
4220: 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 20 2a 2f  _Ignore, etc) */
4230: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4240: 53 74 61 72 74 2c 20 20 2f 2a 20 53 74 61 72 74  Start,  /* Start
4250: 20 6f 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a   of SQL text */.
4260: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
4270: 6e 64 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  nd     /* End of
4280: 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 29 7b 0a   SQL text */.){.
4290: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
42a0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72  pParse->db;.  Tr
42b0: 69 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67  iggerStep *pTrig
42c0: 67 65 72 53 74 65 70 3b 0a 0a 20 20 70 54 72 69  gerStep;..  pTri
42d0: 67 67 65 72 53 74 65 70 20 3d 20 74 72 69 67 67  ggerStep = trigg
42e0: 65 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 70  erStepAllocate(p
42f0: 50 61 72 73 65 2c 20 54 4b 5f 55 50 44 41 54 45  Parse, TK_UPDATE
4300: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 7a 53 74  , pTableName,zSt
4310: 61 72 74 2c 7a 45 6e 64 29 3b 0a 20 20 69 66 28  art,zEnd);.  if(
4320: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b   pTriggerStep ){
4330: 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  .    if( IN_RENA
4340: 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
4350: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
4360: 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 70 45 4c  >pExprList = pEL
4370: 69 73 74 3b 0a 20 20 20 20 20 20 70 54 72 69 67  ist;.      pTrig
4380: 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65 20  gerStep->pWhere 
4390: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  = pWhere;.      
43a0: 70 45 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  pEList = 0;.    
43b0: 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
43c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
43d0: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 45 78  TriggerStep->pEx
43e0: 70 72 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  prList = sqlite3
43f0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
4400: 70 45 4c 69 73 74 2c 20 45 58 50 52 44 55 50 5f  pEList, EXPRDUP_
4410: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 70  REDUCE);.      p
4420: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57 68  TriggerStep->pWh
4430: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
4440: 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65 2c  rDup(db, pWhere,
4450: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
4460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72 69  ;.    }.    pTri
4470: 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66  ggerStep->orconf
4480: 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 7d 0a 20   = orconf;.  }. 
4490: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
44a0: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73  Delete(db, pELis
44b0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
44c0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65  rDelete(db, pWhe
44d0: 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 54  re);.  return pT
44e0: 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f  riggerStep;.}../
44f0: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
4500: 20 74 72 69 67 67 65 72 20 73 74 65 70 20 74 68   trigger step th
4510: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  at implements a 
4520: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
4530: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61   and return.** a
4540: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74   pointer to that
4550: 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20 20   trigger step.  
4560: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
4570: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
4580: 65 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20 61 20  en it.** sees a 
4590: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
45a0: 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79   inside the body
45b0: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 52 49   of a CREATE TRI
45c0: 47 47 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65 72  GGER..*/.Trigger
45d0: 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69  Step *sqlite3Tri
45e0: 67 67 65 72 44 65 6c 65 74 65 53 74 65 70 28 0a  ggerDeleteStep(.
45f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
4610: 73 65 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ser */.  Token *
4620: 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20  pTableName,     
4630: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72   /* The table fr
4640: 6f 6d 20 77 68 69 63 68 20 72 6f 77 73 20 61 72  om which rows ar
4650: 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 45  e deleted */.  E
4660: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
4670: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
4680: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
4690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
46a0: 72 74 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74  rt,     /* Start
46b0: 20 6f 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a   of SQL text */.
46c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
46d0: 6e 64 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  nd        /* End
46e0: 20 6f 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a   of SQL text */.
46f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4700: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4710: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54   TriggerStep *pT
4720: 72 69 67 67 65 72 53 74 65 70 3b 0a 0a 20 20 70  riggerStep;..  p
4730: 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 74 72  TriggerStep = tr
4740: 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63 61 74  iggerStepAllocat
4750: 65 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 45 4c  e(pParse, TK_DEL
4760: 45 54 45 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c  ETE, pTableName,
4770: 7a 53 74 61 72 74 2c 7a 45 6e 64 29 3b 0a 20 20  zStart,zEnd);.  
4780: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70  if( pTriggerStep
4790: 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52   ){.    if( IN_R
47a0: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
47b0: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74        pTriggerSt
47c0: 65 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  ep->pWhere = pWh
47d0: 65 72 65 3b 0a 20 20 20 20 20 20 70 57 68 65 72  ere;.      pWher
47e0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
47f0: 7b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  {.      pTrigger
4800: 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d 20 73  Step->pWhere = s
4810: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
4820: 2c 20 70 57 68 65 72 65 2c 20 45 58 50 52 44 55  , pWhere, EXPRDU
4830: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 7d  P_REDUCE);.    }
4840: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
4850: 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44  p->orconf = OE_D
4860: 65 66 61 75 6c 74 3b 0a 20 20 7d 0a 20 20 73 71  efault;.  }.  sq
4870: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4880: 64 62 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 72  db, pWhere);.  r
4890: 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74  eturn pTriggerSt
48a0: 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65  ep;.}../* .** Re
48b0: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
48c0: 20 61 20 54 72 69 67 67 65 72 20 73 74 72 75 63   a Trigger struc
48d0: 74 75 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ture.*/.void sql
48e0: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
48f0: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  r(sqlite3 *db, T
4900: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
4910: 29 7b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  ){.  if( pTrigge
4920: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
4930: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72   sqlite3DeleteTr
4940: 69 67 67 65 72 53 74 65 70 28 64 62 2c 20 70 54  iggerStep(db, pT
4950: 72 69 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69 73  rigger->step_lis
4960: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  t);.  sqlite3DbF
4970: 72 65 65 28 64 62 2c 20 70 54 72 69 67 67 65 72  ree(db, pTrigger
4980: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
4990: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
49a0: 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a  rigger->table);.
49b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
49c0: 65 74 65 28 64 62 2c 20 70 54 72 69 67 67 65 72  ete(db, pTrigger
49d0: 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 73 71 6c 69  ->pWhen);.  sqli
49e0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
49f0: 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 43  db, pTrigger->pC
4a00: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74  olumns);.  sqlit
4a10: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 72  e3DbFree(db, pTr
4a20: 69 67 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  igger);.}../*.**
4a30: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4a40: 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 72 6f 70  s called to drop
4a50: 20 61 20 74 72 69 67 67 65 72 20 66 72 6f 6d 20   a trigger from 
4a60: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
4a70: 65 6d 61 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ema. .**.** This
4a80: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 64   may be called d
4a90: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
4aa0: 20 70 61 72 73 65 72 20 61 6e 64 20 74 68 65 72   parser and ther
4ab0: 65 66 6f 72 65 20 69 64 65 6e 74 69 66 69 65 73  efore identifies
4ac0: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
4ad0: 62 79 20 6e 61 6d 65 2e 20 20 54 68 65 20 73 71  by name.  The sq
4ae0: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
4af0: 50 74 72 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  Ptr() routine do
4b00: 65 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 6a  es the.** same j
4b10: 6f 62 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  ob as this routi
4b20: 6e 65 20 65 78 63 65 70 74 20 69 74 20 74 61 6b  ne except it tak
4b30: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
4b40: 74 68 65 20 74 72 69 67 67 65 72 0a 2a 2a 20 69  the trigger.** i
4b50: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 74 72  nstead of the tr
4b60: 69 67 67 65 72 20 6e 61 6d 65 2e 0a 2a 2a 2f 0a  igger name..**/.
4b70: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
4b80: 54 72 69 67 67 65 72 28 50 61 72 73 65 20 2a 70  Trigger(Parse *p
4b90: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
4ba0: 70 4e 61 6d 65 2c 20 69 6e 74 20 6e 6f 45 72 72  pName, int noErr
4bb0: 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54  ){.  Trigger *pT
4bc0: 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e  rigger = 0;.  in
4bd0: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
4be0: 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20  r *zDb;.  const 
4bf0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
4c00: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
4c10: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
4c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4c30: 20 29 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69   ) goto drop_tri
4c40: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
4c50: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
4c60: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
4c70: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
4c80: 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67 65  goto drop_trigge
4c90: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  r_cleanup;.  }..
4ca0: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
4cb0: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 7a 44  >nSrc==1 );.  zD
4cc0: 62 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  b = pName->a[0].
4cd0: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7a 4e 61  zDatabase;.  zNa
4ce0: 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  me = pName->a[0]
4cf0: 2e 7a 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  .zName;.  assert
4d00: 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71 6c 69  ( zDb!=0 || sqli
4d10: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
4d20: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
4d30: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
4d40: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
4d50: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
4d60: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
4d70: 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d  ;  /* Search TEM
4d80: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
4d90: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20  .    if( zDb && 
4da0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64  sqlite3StrICmp(d
4db0: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61  b->aDb[j].zDbSNa
4dc0: 6d 65 2c 20 7a 44 62 29 20 29 20 63 6f 6e 74 69  me, zDb) ) conti
4dd0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
4de0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
4df0: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
4e00: 29 20 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65  ) );.    pTrigge
4e10: 72 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  r = sqlite3HashF
4e20: 69 6e 64 28 26 28 64 62 2d 3e 61 44 62 5b 6a 5d  ind(&(db->aDb[j]
4e30: 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  .pSchema->trigHa
4e40: 73 68 29 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  sh), zName);.   
4e50: 20 69 66 28 20 70 54 72 69 67 67 65 72 20 29 20   if( pTrigger ) 
4e60: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
4e70: 20 21 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20   !pTrigger ){.  
4e80: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
4e90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4ea0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
4eb0: 6f 20 73 75 63 68 20 74 72 69 67 67 65 72 3a 20  o such trigger: 
4ec0: 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
4ed0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4ee0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
4ef0: 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50  fyNamedSchema(pP
4f00: 61 72 73 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20  arse, zDb);.    
4f10: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
4f20: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
4f30: 20 20 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69     goto drop_tri
4f40: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
4f50: 7d 0a 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54  }.  sqlite3DropT
4f60: 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
4f70: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 0a 64 72  , pTrigger);..dr
4f80: 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  op_trigger_clean
4f90: 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  up:.  sqlite3Src
4fa0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
4fb0: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
4fc0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
4fd0: 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
4fe0: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
4ff0: 74 61 62 6c 65 20 74 68 61 74 20 61 20 74 72 69  table that a tri
5000: 67 67 65 72 0a 2a 2a 20 69 73 20 73 65 74 20 6f  gger.** is set o
5010: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  n..*/.static Tab
5020: 6c 65 20 2a 74 61 62 6c 65 4f 66 54 72 69 67 67  le *tableOfTrigg
5030: 65 72 28 54 72 69 67 67 65 72 20 2a 70 54 72 69  er(Trigger *pTri
5040: 67 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  gger){.  return 
5050: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
5060: 26 70 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53  &pTrigger->pTabS
5070: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
5080: 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 29  pTrigger->table)
5090: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70  ;.}.../*.** Drop
50a0: 20 61 20 74 72 69 67 67 65 72 20 67 69 76 65 6e   a trigger given
50b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
50c0: 61 74 20 74 72 69 67 67 65 72 2e 20 0a 2a 2f 0a  at trigger. .*/.
50d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
50e0: 54 72 69 67 67 65 72 50 74 72 28 50 61 72 73 65  TriggerPtr(Parse
50f0: 20 2a 70 50 61 72 73 65 2c 20 54 72 69 67 67 65   *pParse, Trigge
5100: 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 20  r *pTrigger){.  
5110: 54 61 62 6c 65 20 20 20 2a 70 54 61 62 6c 65 3b  Table   *pTable;
5120: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
5130: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5140: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
5150: 62 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  b;..  iDb = sqli
5160: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
5170: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 72  (pParse->db, pTr
5180: 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 29 3b  igger->pSchema);
5190: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
51a0: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
51b0: 20 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 74   );.  pTable = t
51c0: 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28 70 54  ableOfTrigger(pT
51d0: 72 69 67 67 65 72 29 3b 0a 20 20 61 73 73 65 72  rigger);.  asser
51e0: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 20 20 61  t( pTable );.  a
51f0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
5200: 53 63 68 65 6d 61 3d 3d 70 54 72 69 67 67 65 72  Schema==pTrigger
5210: 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 69 44 62  ->pSchema || iDb
5220: 3d 3d 31 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==1 );.#ifndef S
5230: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
5240: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
5250: 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
5260: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 3b  TE_DROP_TRIGGER;
5270: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5280: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
5290: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
52a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
52b0: 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
52c0: 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  E(iDb);.    if( 
52d0: 69 44 62 3d 3d 31 20 29 20 63 6f 64 65 20 3d 20  iDb==1 ) code = 
52e0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
52f0: 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 69 66  _TRIGGER;.    if
5300: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
5310: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
5320: 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65   pTrigger->zName
5330: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
5340: 20 7a 44 62 29 20 7c 7c 0a 20 20 20 20 20 20 73   zDb) ||.      s
5350: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
5360: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
5370: 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
5380: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65  zDb) ){.      re
5390: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
53a0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
53b0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 65  erate code to de
53c0: 73 74 72 6f 79 20 74 68 65 20 64 61 74 61 62 61  stroy the databa
53d0: 73 65 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  se record of the
53e0: 20 74 72 69 67 67 65 72 2e 0a 20 20 2a 2f 0a 20   trigger..  */. 
53f0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
5400: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 76 20 3d  =0 );.  if( (v =
5410: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5420: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
5430: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
5440: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
5450: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
5460: 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61  M %Q.%s WHERE na
5470: 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27  me=%Q AND type='
5480: 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20  trigger'",.     
5490: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
54a0: 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
54b0: 4e 41 4d 45 2c 20 70 54 72 69 67 67 65 72 2d 3e  NAME, pTrigger->
54c0: 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
54d0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
54e0: 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
54f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5500: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
5510: 72 6f 70 54 72 69 67 67 65 72 2c 20 69 44 62 2c  ropTrigger, iDb,
5520: 20 30 2c 20 30 2c 20 70 54 72 69 67 67 65 72 2d   0, 0, pTrigger-
5530: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
5540: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
5550: 61 20 74 72 69 67 67 65 72 20 66 72 6f 6d 20 74  a trigger from t
5560: 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f  he hash tables o
5570: 66 20 74 68 65 20 73 71 6c 69 74 65 2a 20 70 6f  f the sqlite* po
5580: 69 6e 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  inter..*/.void s
5590: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
55a0: 65 6c 65 74 65 54 72 69 67 67 65 72 28 73 71 6c  eleteTrigger(sql
55b0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
55c0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
55d0: 4e 61 6d 65 29 7b 0a 20 20 54 72 69 67 67 65 72  Name){.  Trigger
55e0: 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 48 61   *pTrigger;.  Ha
55f0: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
5600: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
5610: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
5620: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
5630: 61 73 68 20 3d 20 26 28 64 62 2d 3e 61 44 62 5b  ash = &(db->aDb[
5640: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72  iDb].pSchema->tr
5650: 69 67 48 61 73 68 29 3b 0a 20 20 70 54 72 69 67  igHash);.  pTrig
5660: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 48 61 73  ger = sqlite3Has
5670: 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a  hInsert(pHash, z
5680: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
5690: 41 4c 57 41 59 53 28 70 54 72 69 67 67 65 72 29  ALWAYS(pTrigger)
56a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 72 69   ){.    if( pTri
56b0: 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  gger->pSchema==p
56c0: 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63 68  Trigger->pTabSch
56d0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ema ){.      Tab
56e0: 6c 65 20 2a 70 54 61 62 20 3d 20 74 61 62 6c 65  le *pTab = table
56f0: 4f 66 54 72 69 67 67 65 72 28 70 54 72 69 67 67  OfTrigger(pTrigg
5700: 65 72 29 3b 0a 20 20 20 20 20 20 54 72 69 67 67  er);.      Trigg
5710: 65 72 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66  er **pp;.      f
5720: 6f 72 28 70 70 3d 26 70 54 61 62 2d 3e 70 54 72  or(pp=&pTab->pTr
5730: 69 67 67 65 72 3b 20 2a 70 70 21 3d 70 54 72 69  igger; *pp!=pTri
5740: 67 67 65 72 3b 20 70 70 3d 26 28 28 2a 70 70 29  gger; pp=&((*pp)
5750: 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  ->pNext));.     
5760: 20 2a 70 70 20 3d 20 28 2a 70 70 29 2d 3e 70 4e   *pp = (*pp)->pN
5770: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ext;.    }.    s
5780: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
5790: 67 65 72 28 64 62 2c 20 70 54 72 69 67 67 65 72  ger(db, pTrigger
57a0: 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c  );.    db->mDbFl
57b0: 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63  ags |= DBFLAG_Sc
57c0: 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 7d 0a  hemaChange;.  }.
57d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20  }../*.** pEList 
57e0: 69 73 20 74 68 65 20 53 45 54 20 63 6c 61 75 73  is the SET claus
57f0: 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73  e of an UPDATE s
5800: 74 61 74 65 6d 65 6e 74 2e 20 20 45 61 63 68 20  tatement.  Each 
5810: 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 45 4c 69  entry.** in pELi
5820: 73 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  st is of the for
5830: 6d 61 74 20 3c 69 64 3e 3d 3c 65 78 70 72 3e 2e  mat <id>=<expr>.
5840: 20 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20    If any of the 
5850: 65 6e 74 72 69 65 73 0a 2a 2a 20 69 6e 20 70 45  entries.** in pE
5860: 4c 69 73 74 20 68 61 76 65 20 61 6e 20 3c 69 64  List have an <id
5870: 3e 20 77 68 69 63 68 20 6d 61 74 63 68 65 73 20  > which matches 
5880: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 69 6e  an identifier in
5890: 20 70 49 64 4c 69 73 74 2c 0a 2a 2a 20 74 68 65   pIdList,.** the
58a0: 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  n return TRUE.  
58b0: 49 66 20 70 49 64 4c 69 73 74 3d 3d 4e 55 4c 4c  If pIdList==NULL
58c0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 6e  , then it is con
58d0: 73 69 64 65 72 65 64 20 61 0a 2a 2a 20 77 69 6c  sidered a.** wil
58e0: 64 63 61 72 64 20 74 68 61 74 20 6d 61 74 63 68  dcard that match
58f0: 65 73 20 61 6e 79 74 68 69 6e 67 2e 20 20 4c 69  es anything.  Li
5900: 6b 65 77 69 73 65 20 69 66 20 70 45 4c 69 73 74  kewise if pEList
5910: 3d 3d 4e 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20 69  ==NULL then.** i
5920: 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68 69  t matches anythi
5930: 6e 67 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74  ng so always ret
5940: 75 72 6e 20 74 72 75 65 2e 20 20 52 65 74 75 72  urn true.  Retur
5950: 6e 20 66 61 6c 73 65 20 6f 6e 6c 79 0a 2a 2a 20  n false only.** 
5960: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
5970: 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  atch..*/.static 
5980: 69 6e 74 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f  int checkColumnO
5990: 76 65 72 6c 61 70 28 49 64 4c 69 73 74 20 2a 70  verlap(IdList *p
59a0: 49 64 4c 69 73 74 2c 20 45 78 70 72 4c 69 73 74  IdList, ExprList
59b0: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74   *pEList){.  int
59c0: 20 65 3b 0a 20 20 69 66 28 20 70 49 64 4c 69 73   e;.  if( pIdLis
59d0: 74 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 45  t==0 || NEVER(pE
59e0: 4c 69 73 74 3d 3d 30 29 20 29 20 72 65 74 75 72  List==0) ) retur
59f0: 6e 20 31 3b 0a 20 20 66 6f 72 28 65 3d 30 3b 20  n 1;.  for(e=0; 
5a00: 65 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  e<pEList->nExpr;
5a10: 20 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   e++){.    if( s
5a20: 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
5a30: 78 28 70 49 64 4c 69 73 74 2c 20 70 45 4c 69 73  x(pIdList, pELis
5a40: 74 2d 3e 61 5b 65 5d 2e 7a 4e 61 6d 65 29 3e 3d  t->a[e].zName)>=
5a50: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
5a60: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 20 0a 7d  }.  return 0; .}
5a70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
5a80: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 72 69   list of all tri
5a90: 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65 20 70  ggers on table p
5aa0: 54 61 62 20 69 66 20 74 68 65 72 65 20 65 78 69  Tab if there exi
5ab0: 73 74 73 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  sts at least.** 
5ac0: 6f 6e 65 20 74 72 69 67 67 65 72 20 74 68 61 74  one trigger that
5ad0: 20 6d 75 73 74 20 62 65 20 66 69 72 65 64 20 77   must be fired w
5ae0: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
5af0: 20 6f 66 20 74 79 70 65 20 27 6f 70 27 20 69 73   of type 'op' is
5b00: 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 6f   .** performed o
5b10: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64  n the table, and
5b20: 2c 20 69 66 20 74 68 61 74 20 6f 70 65 72 61 74  , if that operat
5b30: 69 6f 6e 20 69 73 20 61 6e 20 55 50 44 41 54 45  ion is an UPDATE
5b40: 2c 20 69 66 20 61 74 0a 2a 2a 20 6c 65 61 73 74  , if at.** least
5b50: 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c 75   one of the colu
5b60: 6d 6e 73 20 69 6e 20 70 43 68 61 6e 67 65 73 20  mns in pChanges 
5b70: 69 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  is being modifie
5b80: 64 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 20 2a 73  d..*/.Trigger *s
5b90: 71 6c 69 74 65 33 54 72 69 67 67 65 72 73 45 78  qlite3TriggersEx
5ba0: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
5bb0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
5bc0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
5bd0: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
5be0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
5bf0: 54 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  The table the co
5c00: 6e 74 61 69 6e 73 20 74 68 65 20 74 72 69 67 67  ntains the trigg
5c10: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ers */.  int op,
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c30: 20 2f 2a 20 6f 6e 65 20 6f 66 20 54 4b 5f 44 45   /* one of TK_DE
5c40: 4c 45 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c  LETE, TK_INSERT,
5c50: 20 54 4b 5f 55 50 44 41 54 45 20 2a 2f 0a 20 20   TK_UPDATE */.  
5c60: 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67  ExprList *pChang
5c70: 65 73 2c 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  es,     /* Colum
5c80: 6e 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 69  ns that change i
5c90: 6e 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  n an UPDATE stat
5ca0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  ement */.  int *
5cb0: 70 4d 61 73 6b 20 20 20 20 20 20 20 20 20 20 20  pMask           
5cc0: 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20     /* OUT: Mask 
5cd0: 6f 66 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52  of TRIGGER_BEFOR
5ce0: 45 7c 54 52 49 47 47 45 52 5f 41 46 54 45 52 20  E|TRIGGER_AFTER 
5cf0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b  */.){.  int mask
5d00: 20 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72 20   = 0;.  Trigger 
5d10: 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 54 72  *pList = 0;.  Tr
5d20: 69 67 67 65 72 20 2a 70 3b 0a 0a 20 20 69 66 28  igger *p;..  if(
5d30: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
5d40: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61  ags & SQLITE_Ena
5d50: 62 6c 65 54 72 69 67 67 65 72 29 21 3d 30 20 29  bleTrigger)!=0 )
5d60: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
5d70: 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74  lite3TriggerList
5d80: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
5d90: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
5da0: 69 73 74 3d 3d 30 20 7c 7c 20 49 73 56 69 72 74  ist==0 || IsVirt
5db0: 75 61 6c 28 70 54 61 62 29 3d 3d 30 20 29 3b 0a  ual(pTab)==0 );.
5dc0: 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
5dd0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5de0: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 6f 70     if( p->op==op
5df0: 20 26 26 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f   && checkColumnO
5e00: 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f 6c 75 6d  verlap(p->pColum
5e10: 6e 73 2c 20 70 43 68 61 6e 67 65 73 29 20 29 7b  ns, pChanges) ){
5e20: 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 70  .      mask |= p
5e30: 2d 3e 74 72 5f 74 6d 3b 0a 20 20 20 20 7d 0a 20  ->tr_tm;.    }. 
5e40: 20 7d 0a 20 20 69 66 28 20 70 4d 61 73 6b 20 29   }.  if( pMask )
5e50: 7b 0a 20 20 20 20 2a 70 4d 61 73 6b 20 3d 20 6d  {.    *pMask = m
5e60: 61 73 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ask;.  }.  retur
5e70: 6e 20 28 6d 61 73 6b 20 3f 20 70 4c 69 73 74 20  n (mask ? pList 
5e80: 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  : 0);.}../*.** C
5e90: 6f 6e 76 65 72 74 20 74 68 65 20 70 53 74 65 70  onvert the pStep
5ea0: 2d 3e 7a 54 61 72 67 65 74 20 73 74 72 69 6e 67  ->zTarget string
5eb0: 20 69 6e 74 6f 20 61 20 53 72 63 4c 69 73 74 20   into a SrcList 
5ec0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
5ed0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20  nter.** to that 
5ee0: 53 72 63 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  SrcList..**.** T
5ef0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
5f00: 20 61 20 73 70 65 63 69 66 69 63 20 64 61 74 61   a specific data
5f10: 62 61 73 65 20 6e 61 6d 65 2c 20 69 66 20 6e 65  base name, if ne
5f20: 65 64 65 64 2c 20 74 6f 20 74 68 65 20 74 61 72  eded, to the tar
5f30: 67 65 74 20 77 68 65 6e 0a 2a 2a 20 66 6f 72 6d  get when.** form
5f40: 69 6e 67 20 74 68 65 20 53 72 63 4c 69 73 74 2e  ing the SrcList.
5f50: 20 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20    This prevents 
5f60: 61 20 74 72 69 67 67 65 72 20 69 6e 20 6f 6e 65  a trigger in one
5f70: 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 0a 2a   database from.*
5f80: 2a 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 61  * referring to a
5f90: 20 74 61 72 67 65 74 20 69 6e 20 61 6e 6f 74 68   target in anoth
5fa0: 65 72 20 64 61 74 61 62 61 73 65 2e 20 20 41 6e  er database.  An
5fb0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68   exception is wh
5fc0: 65 6e 20 74 68 65 0a 2a 2a 20 74 72 69 67 67 65  en the.** trigge
5fd0: 72 20 69 73 20 69 6e 20 54 45 4d 50 20 69 6e 20  r is in TEMP in 
5fe0: 77 68 69 63 68 20 63 61 73 65 20 69 74 20 63 61  which case it ca
5ff0: 6e 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6f  n refer to any o
6000: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 69 74  ther database it
6010: 0a 2a 2a 20 77 61 6e 74 73 2e 0a 2a 2f 0a 73 74  .** wants..*/.st
6020: 61 74 69 63 20 53 72 63 4c 69 73 74 20 2a 74 61  atic SrcList *ta
6030: 72 67 65 74 53 72 63 4c 69 73 74 28 0a 20 20 50  rgetSrcList(.  P
6040: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6050: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
6060: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6070: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74  TriggerStep *pSt
6080: 65 70 20 20 20 2f 2a 20 54 68 65 20 74 72 69 67  ep   /* The trig
6090: 67 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ger containing t
60a0: 68 65 20 74 61 72 67 65 74 20 74 6f 6b 65 6e 20  he target token 
60b0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
60c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
60d0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
60e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
60f0: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
6100: 65 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 53 72  e to use */.  Sr
6110: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
6120: 20 20 20 2f 2a 20 53 72 63 4c 69 73 74 20 74 6f     /* SrcList to
6130: 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a   be returned */.
6140: 0a 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65  .  pSrc = sqlite
6150: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
6160: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 29 3b  Parse, 0, 0, 0);
6170: 0a 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20  .  if( pSrc ){. 
6180: 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d     assert( pSrc-
6190: 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 70  >nSrc>0 );.    p
61a0: 53 72 63 2d 3e 61 5b 70 53 72 63 2d 3e 6e 53 72  Src->a[pSrc->nSr
61b0: 63 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  c-1].zName = sql
61c0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
61d0: 20 70 53 74 65 70 2d 3e 7a 54 61 72 67 65 74 29   pStep->zTarget)
61e0: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
61f0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
6200: 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 54 72 69  (db, pStep->pTri
6210: 67 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  g->pSchema);.   
6220: 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69   if( iDb==0 || i
6230: 44 62 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 63  Db>=2 ){.      c
6240: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
6250: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
6260: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
6270: 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62     zDb = db->aDb
6280: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
6290: 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 70 53        pSrc->a[pS
62a0: 72 63 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 44 61 74  rc->nSrc-1].zDat
62b0: 61 62 61 73 65 20 3d 20 20 73 71 6c 69 74 65 33  abase =  sqlite3
62c0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 44 62  DbStrDup(db, zDb
62d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
62e0: 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 2f  eturn pSrc;.}../
62f0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
6300: 42 45 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  BE code for the 
6310: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
6320: 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  e the body of a 
6330: 73 69 6e 67 6c 65 20 0a 2a 2a 20 74 72 69 67 67  single .** trigg
6340: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
6350: 74 20 63 6f 64 65 54 72 69 67 67 65 72 50 72 6f  t codeTriggerPro
6360: 67 72 61 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  gram(.  Parse *p
6370: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
6380: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
6390: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69  context */.  Tri
63a0: 67 67 65 72 53 74 65 70 20 2a 70 53 74 65 70 4c  ggerStep *pStepL
63b0: 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ist,   /* List o
63c0: 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  f statements ins
63d0: 69 64 65 20 74 68 65 20 74 72 69 67 67 65 72 20  ide the trigger 
63e0: 62 6f 64 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  body */.  int or
63f0: 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 20  conf            
6400: 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
6410: 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41  algorithm. (OE_A
6420: 62 6f 72 74 2c 20 65 74 63 29 20 2a 2f 20 20 0a  bort, etc) */  .
6430: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
6440: 20 2a 70 53 74 65 70 3b 0a 20 20 56 64 62 65 20   *pStep;.  Vdbe 
6450: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
6460: 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  be;.  sqlite3 *d
6470: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6480: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
6490: 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 26  e->pTriggerTab &
64a0: 26 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  & pParse->pTople
64b0: 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  vel );.  assert(
64c0: 20 70 53 74 65 70 4c 69 73 74 20 29 3b 0a 20 20   pStepList );.  
64d0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
64e0: 20 20 66 6f 72 28 70 53 74 65 70 3d 70 53 74 65    for(pStep=pSte
64f0: 70 4c 69 73 74 3b 20 70 53 74 65 70 3b 20 70 53  pList; pStep; pS
6500: 74 65 70 3d 70 53 74 65 70 2d 3e 70 4e 65 78 74  tep=pStep->pNext
6510: 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
6520: 20 6f 75 74 20 74 68 65 20 4f 4e 20 43 4f 4e 46   out the ON CONF
6530: 4c 49 43 54 20 70 6f 6c 69 63 79 20 74 68 61 74  LICT policy that
6540: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
6550: 72 20 74 68 69 73 20 73 74 65 70 0a 20 20 20 20  r this step.    
6560: 2a 2a 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  ** of the trigge
6570: 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74 68  r program. If th
6580: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  e statement that
6590: 20 63 61 75 73 65 64 20 74 68 69 73 20 74 72 69   caused this tri
65a0: 67 67 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 66  gger.    ** to f
65b0: 69 72 65 20 68 61 64 20 61 6e 20 65 78 70 6c 69  ire had an expli
65c0: 63 69 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 2c  cit ON CONFLICT,
65d0: 20 74 68 65 6e 20 75 73 65 20 69 74 2e 20 4f 74   then use it. Ot
65e0: 68 65 72 77 69 73 65 2c 20 75 73 65 0a 20 20 20  herwise, use.   
65f0: 20 2a 2a 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c   ** the ON CONFL
6600: 49 43 54 20 70 6f 6c 69 63 79 20 74 68 61 74 20  ICT policy that 
6610: 77 61 73 20 73 70 65 63 69 66 69 65 64 20 61 73  was specified as
6620: 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 69   part of the tri
6630: 67 67 65 72 0a 20 20 20 20 2a 2a 20 73 74 65 70  gger.    ** step
6640: 20 73 74 61 74 65 6d 65 6e 74 2e 20 45 78 61 6d   statement. Exam
6650: 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
6660: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 52 49 47  **   CREATE TRIG
6670: 47 45 52 20 41 46 54 45 52 20 49 4e 53 45 52 54  GER AFTER INSERT
6680: 20 4f 4e 20 74 31 20 42 45 47 49 4e 3b 0a 20 20   ON t1 BEGIN;.  
6690: 20 20 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20    **     INSERT 
66a0: 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  OR REPLACE INTO 
66b0: 74 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 61 2c  t2 VALUES(new.a,
66c0: 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20 2a 2a 20   new.b);.    ** 
66d0: 20 20 45 4e 44 3b 0a 20 20 20 20 2a 2a 0a 20 20    END;.    **.  
66e0: 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e    **   INSERT IN
66f0: 54 4f 20 74 31 20 2e 2e 2e 20 3b 20 20 20 20 20  TO t1 ... ;     
6700: 20 20 20 20 20 20 20 2d 2d 20 69 6e 73 65 72 74         -- insert
6710: 20 69 6e 74 6f 20 74 32 20 75 73 65 73 20 52 45   into t2 uses RE
6720: 50 4c 41 43 45 20 70 6f 6c 69 63 79 0a 20 20 20  PLACE policy.   
6730: 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 4f 52 20   **   INSERT OR 
6740: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20 2e  IGNORE INTO t1 .
6750: 2e 2e 20 3b 20 20 2d 2d 20 69 6e 73 65 72 74 20  .. ;  -- insert 
6760: 69 6e 74 6f 20 74 32 20 75 73 65 73 20 49 47 4e  into t2 uses IGN
6770: 4f 52 45 20 70 6f 6c 69 63 79 0a 20 20 20 20 2a  ORE policy.    *
6780: 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 4f  /.    pParse->eO
6790: 72 63 6f 6e 66 20 3d 20 28 6f 72 63 6f 6e 66 3d  rconf = (orconf=
67a0: 3d 4f 45 5f 44 65 66 61 75 6c 74 29 3f 70 53 74  =OE_Default)?pSt
67b0: 65 70 2d 3e 6f 72 63 6f 6e 66 3a 28 75 38 29 6f  ep->orconf:(u8)o
67c0: 72 63 6f 6e 66 3b 0a 20 20 20 20 61 73 73 65 72  rconf;.    asser
67d0: 74 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  t( pParse->okCon
67e0: 73 74 46 61 63 74 6f 72 3d 3d 30 20 29 3b 0a 0a  stFactor==0 );..
67f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6800: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66  MIT_TRACE.    if
6810: 28 20 70 53 74 65 70 2d 3e 7a 53 70 61 6e 20 29  ( pStep->zSpan )
6820: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6830: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
6840: 54 72 61 63 65 2c 20 30 78 37 66 66 66 66 66 66  Trace, 0x7ffffff
6850: 66 2c 20 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  f, 1, 0,.       
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
6880: 64 62 2c 20 22 2d 2d 20 25 73 22 2c 20 70 53 74  db, "-- %s", pSt
6890: 65 70 2d 3e 7a 53 70 61 6e 29 2c 0a 20 20 20 20  ep->zSpan),.    
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68b0: 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b      P4_DYNAMIC);
68c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
68d0: 20 20 20 73 77 69 74 63 68 28 20 70 53 74 65 70     switch( pStep
68e0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61  ->op ){.      ca
68f0: 73 65 20 54 4b 5f 55 50 44 41 54 45 3a 20 7b 0a  se TK_UPDATE: {.
6900: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 55          sqlite3U
6910: 70 64 61 74 65 28 70 50 61 72 73 65 2c 20 0a 20  pdate(pParse, . 
6920: 20 20 20 20 20 20 20 20 20 74 61 72 67 65 74 53           targetS
6930: 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  rcList(pParse, p
6940: 53 74 65 70 29 2c 0a 20 20 20 20 20 20 20 20 20  Step),.         
6950: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6960: 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70  Dup(db, pStep->p
6970: 45 78 70 72 4c 69 73 74 2c 20 30 29 2c 20 0a 20  ExprList, 0), . 
6980: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6990: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 65  ExprDup(db, pSte
69a0: 70 2d 3e 70 57 68 65 72 65 2c 20 30 29 2c 20 0a  p->pWhere, 0), .
69b0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
69c0: 2d 3e 65 4f 72 63 6f 6e 66 2c 20 30 2c 20 30 2c  ->eOrconf, 0, 0,
69d0: 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
69e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
69f0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
6a00: 54 4b 5f 49 4e 53 45 52 54 3a 20 7b 0a 20 20 20  TK_INSERT: {.   
6a10: 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e 73 65       sqlite3Inse
6a20: 72 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  rt(pParse, .    
6a30: 20 20 20 20 20 20 74 61 72 67 65 74 53 72 63 4c        targetSrcL
6a40: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 74 65  ist(pParse, pSte
6a50: 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  p),.          sq
6a60: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
6a70: 62 2c 20 70 53 74 65 70 2d 3e 70 53 65 6c 65 63  b, pStep->pSelec
6a80: 74 2c 20 30 29 2c 20 0a 20 20 20 20 20 20 20 20  t, 0), .        
6a90: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
6aa0: 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 49  up(db, pStep->pI
6ab0: 64 4c 69 73 74 29 2c 20 0a 20 20 20 20 20 20 20  dList), .       
6ac0: 20 20 20 70 50 61 72 73 65 2d 3e 65 4f 72 63 6f     pParse->eOrco
6ad0: 6e 66 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  nf,.          sq
6ae0: 6c 69 74 65 33 55 70 73 65 72 74 44 75 70 28 64  lite3UpsertDup(d
6af0: 62 2c 20 70 53 74 65 70 2d 3e 70 55 70 73 65 72  b, pStep->pUpser
6b00: 74 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  t).        );.  
6b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6b20: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
6b30: 54 4b 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20  TK_DELETE: {.   
6b40: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
6b50: 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 0a  teFrom(pParse, .
6b60: 20 20 20 20 20 20 20 20 20 20 74 61 72 67 65 74            target
6b70: 53 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20  SrcList(pParse, 
6b80: 70 53 74 65 70 29 2c 0a 20 20 20 20 20 20 20 20  pStep),.        
6b90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
6ba0: 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 57 68 65  (db, pStep->pWhe
6bb0: 72 65 2c 20 30 29 2c 20 30 2c 20 30 0a 20 20 20  re, 0), 0, 0.   
6bc0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
6bd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6be0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73       default: as
6bf0: 73 65 72 74 28 20 70 53 74 65 70 2d 3e 6f 70 3d  sert( pStep->op=
6c00: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 7b 0a  =TK_SELECT ); {.
6c10: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
6c20: 73 74 20 73 44 65 73 74 3b 0a 20 20 20 20 20 20  st sDest;.      
6c30: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
6c40: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
6c50: 74 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e  tDup(db, pStep->
6c60: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
6c70: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
6c80: 63 74 44 65 73 74 49 6e 69 74 28 26 73 44 65 73  ctDestInit(&sDes
6c90: 74 2c 20 53 52 54 5f 44 69 73 63 61 72 64 2c 20  t, SRT_Discard, 
6ca0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
6cb0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
6cc0: 2c 20 70 53 65 6c 65 63 74 2c 20 26 73 44 65 73  , pSelect, &sDes
6cd0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
6ce0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
6cf0: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
6d00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6d10: 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 20 20     }.    } .    
6d20: 69 66 28 20 70 53 74 65 70 2d 3e 6f 70 21 3d 54  if( pStep->op!=T
6d30: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
6d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6d50: 4f 70 30 28 76 2c 20 4f 50 5f 52 65 73 65 74 43  Op0(v, OP_ResetC
6d60: 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ount);.    }.  }
6d70: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
6d80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6d90: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
6da0: 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 54 68 69  MMENTS./*.** Thi
6db0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
6dc0: 65 64 20 74 6f 20 61 64 64 20 56 64 62 65 43 6f  ed to add VdbeCo
6dd0: 6d 6d 65 6e 74 28 29 20 61 6e 6e 6f 74 61 74 69  mment() annotati
6de0: 6f 6e 73 20 74 6f 20 61 20 56 44 42 45 0a 2a 2a  ons to a VDBE.**
6df0: 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73 20   program. It is 
6e00: 6e 6f 74 20 75 73 65 64 20 69 6e 20 70 72 6f 64  not used in prod
6e10: 75 63 74 69 6f 6e 20 63 6f 64 65 2c 20 6f 6e 6c  uction code, onl
6e20: 79 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e  y for debugging.
6e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
6e40: 20 63 68 61 72 20 2a 6f 6e 45 72 72 6f 72 54 65   char *onErrorTe
6e50: 78 74 28 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  xt(int onError){
6e60: 0a 20 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72  .  switch( onErr
6e70: 6f 72 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f  or ){.    case O
6e80: 45 5f 41 62 6f 72 74 3a 20 20 20 20 72 65 74 75  E_Abort:    retu
6e90: 72 6e 20 22 61 62 6f 72 74 22 3b 0a 20 20 20 20  rn "abort";.    
6ea0: 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b  case OE_Rollback
6eb0: 3a 20 72 65 74 75 72 6e 20 22 72 6f 6c 6c 62 61  : return "rollba
6ec0: 63 6b 22 3b 0a 20 20 20 20 63 61 73 65 20 4f 45  ck";.    case OE
6ed0: 5f 46 61 69 6c 3a 20 20 20 20 20 72 65 74 75 72  _Fail:     retur
6ee0: 6e 20 22 66 61 69 6c 22 3b 0a 20 20 20 20 63 61  n "fail";.    ca
6ef0: 73 65 20 4f 45 5f 52 65 70 6c 61 63 65 3a 20 20  se OE_Replace:  
6f00: 72 65 74 75 72 6e 20 22 72 65 70 6c 61 63 65 22  return "replace"
6f10: 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67  ;.    case OE_Ig
6f20: 6e 6f 72 65 3a 20 20 20 72 65 74 75 72 6e 20 22  nore:   return "
6f30: 69 67 6e 6f 72 65 22 3b 0a 20 20 20 20 63 61 73  ignore";.    cas
6f40: 65 20 4f 45 5f 44 65 66 61 75 6c 74 3a 20 20 72  e OE_Default:  r
6f50: 65 74 75 72 6e 20 22 64 65 66 61 75 6c 74 22 3b  eturn "default";
6f60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 6e  .  }.  return "n
6f70: 2f 61 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  /a";.}.#endif../
6f80: 2a 0a 2a 2a 20 50 61 72 73 65 20 63 6f 6e 74 65  *.** Parse conte
6f90: 78 74 20 73 74 72 75 63 74 75 72 65 20 70 46 72  xt structure pFr
6fa0: 6f 6d 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  om has just been
6fb0: 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
6fc0: 61 20 73 75 62 2d 76 64 62 65 0a 2a 2a 20 28 74  a sub-vdbe.** (t
6fd0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 29 2e  rigger program).
6fe0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
6ff0: 20 6f 63 63 75 72 72 65 64 2c 20 74 72 61 6e 73   occurred, trans
7000: 66 65 72 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  fer error inform
7010: 61 74 69 6f 6e 0a 2a 2a 20 66 72 6f 6d 20 70 46  ation.** from pF
7020: 72 6f 6d 20 74 6f 20 70 54 6f 2e 0a 2a 2f 0a 73  rom to pTo..*/.s
7030: 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73  tatic void trans
7040: 66 65 72 50 61 72 73 65 45 72 72 6f 72 28 50 61  ferParseError(Pa
7050: 72 73 65 20 2a 70 54 6f 2c 20 50 61 72 73 65 20  rse *pTo, Parse 
7060: 2a 70 46 72 6f 6d 29 7b 0a 20 20 61 73 73 65 72  *pFrom){.  asser
7070: 74 28 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73  t( pFrom->zErrMs
7080: 67 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 6e  g==0 || pFrom->n
7090: 45 72 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Err );.  assert(
70a0: 20 70 54 6f 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30   pTo->zErrMsg==0
70b0: 20 7c 7c 20 70 54 6f 2d 3e 6e 45 72 72 20 29 3b   || pTo->nErr );
70c0: 0a 20 20 69 66 28 20 70 54 6f 2d 3e 6e 45 72 72  .  if( pTo->nErr
70d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e  ==0 ){.    pTo->
70e0: 7a 45 72 72 4d 73 67 20 3d 20 70 46 72 6f 6d 2d  zErrMsg = pFrom-
70f0: 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 54  >zErrMsg;.    pT
7100: 6f 2d 3e 6e 45 72 72 20 3d 20 70 46 72 6f 6d 2d  o->nErr = pFrom-
7110: 3e 6e 45 72 72 3b 0a 20 20 20 20 70 54 6f 2d 3e  >nErr;.    pTo->
7120: 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 72 63 3b 0a  rc = pFrom->rc;.
7130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
7140: 69 74 65 33 44 62 46 72 65 65 28 70 46 72 6f 6d  ite3DbFree(pFrom
7150: 2d 3e 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 45 72  ->db, pFrom->zEr
7160: 72 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rMsg);.  }.}../*
7170: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 70  .** Create and p
7180: 6f 70 75 6c 61 74 65 20 61 20 6e 65 77 20 54 72  opulate a new Tr
7190: 69 67 67 65 72 50 72 67 20 6f 62 6a 65 63 74 20  iggerPrg object 
71a0: 77 69 74 68 20 61 20 73 75 62 2d 70 72 6f 67 72  with a sub-progr
71b0: 61 6d 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  am .** implement
71c0: 69 6e 67 20 74 72 69 67 67 65 72 20 70 54 72 69  ing trigger pTri
71d0: 67 67 65 72 20 77 69 74 68 20 4f 4e 20 43 4f 4e  gger with ON CON
71e0: 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 6f 72 63  FLICT policy orc
71f0: 6f 6e 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  onf..*/.static T
7200: 72 69 67 67 65 72 50 72 67 20 2a 63 6f 64 65 52  riggerPrg *codeR
7210: 6f 77 54 72 69 67 67 65 72 28 0a 20 20 50 61 72  owTrigger(.  Par
7220: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7230: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 61 72    /* Current par
7240: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
7250: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
7260: 72 2c 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20  r,   /* Trigger 
7270: 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 54 61 62  to code */.  Tab
7280: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
7290: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70    /* The table p
72a0: 54 72 69 67 67 65 72 20 69 73 20 61 74 74 61 63  Trigger is attac
72b0: 68 65 64 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  hed to */.  int 
72c0: 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20  orconf          
72d0: 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   /* ON CONFLICT 
72e0: 70 6f 6c 69 63 79 20 74 6f 20 63 6f 64 65 20 74  policy to code t
72f0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 77  rigger program w
7300: 69 74 68 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73  ith */.){.  Pars
7310: 65 20 2a 70 54 6f 70 20 3d 20 73 71 6c 69 74 65  e *pTop = sqlite
7320: 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
7330: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
7340: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7350: 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73  db;   /* Databas
7360: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 72  e handle */.  Tr
7370: 69 67 67 65 72 50 72 67 20 2a 70 50 72 67 3b 20  iggerPrg *pPrg; 
7380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
7390: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
73a0: 20 20 45 78 70 72 20 2a 70 57 68 65 6e 20 3d 20    Expr *pWhen = 
73b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
73c0: 20 44 75 70 6c 69 63 61 74 65 20 6f 66 20 74 72   Duplicate of tr
73d0: 69 67 67 65 72 20 57 48 45 4e 20 65 78 70 72 65  igger WHEN expre
73e0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ssion */.  Vdbe 
73f0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
7400: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
7410: 61 72 79 20 56 4d 20 2a 2f 0a 20 20 4e 61 6d 65  ary VM */.  Name
7420: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
7440: 63 6f 6e 74 65 78 74 20 66 6f 72 20 73 75 62 2d  context for sub-
7450: 76 64 62 65 20 2a 2f 0a 20 20 53 75 62 50 72 6f  vdbe */.  SubPro
7460: 67 72 61 6d 20 2a 70 50 72 6f 67 72 61 6d 20 3d  gram *pProgram =
7470: 20 30 3b 20 20 20 2f 2a 20 53 75 62 2d 76 64 62   0;   /* Sub-vdb
7480: 65 20 66 6f 72 20 74 72 69 67 67 65 72 20 70 72  e for trigger pr
7490: 6f 67 72 61 6d 20 2a 2f 0a 20 20 50 61 72 73 65  ogram */.  Parse
74a0: 20 2a 70 53 75 62 50 61 72 73 65 3b 20 20 20 20   *pSubParse;    
74b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
74c0: 63 6f 6e 74 65 78 74 20 66 6f 72 20 73 75 62 2d  context for sub-
74d0: 76 64 62 65 20 2a 2f 0a 20 20 69 6e 74 20 69 45  vdbe */.  int iE
74e0: 6e 64 54 72 69 67 67 65 72 20 3d 20 30 3b 20 20  ndTrigger = 0;  
74f0: 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 74        /* Label t
7500: 6f 20 6a 75 6d 70 20 74 6f 20 69 66 20 57 48 45  o jump to if WHE
7510: 4e 20 69 73 20 66 61 6c 73 65 20 2a 2f 0a 0a 20  N is false */.. 
7520: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
7530: 72 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70  r->zName==0 || p
7540: 54 61 62 3d 3d 74 61 62 6c 65 4f 66 54 72 69 67  Tab==tableOfTrig
7550: 67 65 72 28 70 54 72 69 67 67 65 72 29 20 29 3b  ger(pTrigger) );
7560: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d  .  assert( pTop-
7570: 3e 70 56 64 62 65 20 29 3b 0a 0a 20 20 2f 2a 20  >pVdbe );..  /* 
7580: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 54 72 69  Allocate the Tri
7590: 67 67 65 72 50 72 67 20 61 6e 64 20 53 75 62 50  ggerPrg and SubP
75a0: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 73 2e 20  rogram objects. 
75b0: 54 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  To ensure that t
75c0: 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 66 72 65  hey.  ** are fre
75d0: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
75e0: 63 63 75 72 73 2c 20 6c 69 6e 6b 20 74 68 65 6d  ccurs, link them
75f0: 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e   into the Parse.
7600: 70 54 72 69 67 67 65 72 50 72 67 20 0a 20 20 2a  pTriggerPrg .  *
7610: 2a 20 6c 69 73 74 20 6f 66 20 74 68 65 20 74 6f  * list of the to
7620: 70 2d 6c 65 76 65 6c 20 50 61 72 73 65 20 6f 62  p-level Parse ob
7630: 6a 65 63 74 20 73 6f 6f 6e 65 72 20 72 61 74 68  ject sooner rath
7640: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 20  er than later.  
7650: 2a 2f 0a 20 20 70 50 72 67 20 3d 20 73 71 6c 69  */.  pPrg = sqli
7660: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7670: 64 62 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67  db, sizeof(Trigg
7680: 65 72 50 72 67 29 29 3b 0a 20 20 69 66 28 20 21  erPrg));.  if( !
7690: 70 50 72 67 20 29 20 72 65 74 75 72 6e 20 30 3b  pPrg ) return 0;
76a0: 0a 20 20 70 50 72 67 2d 3e 70 4e 65 78 74 20 3d  .  pPrg->pNext =
76b0: 20 70 54 6f 70 2d 3e 70 54 72 69 67 67 65 72 50   pTop->pTriggerP
76c0: 72 67 3b 0a 20 20 70 54 6f 70 2d 3e 70 54 72 69  rg;.  pTop->pTri
76d0: 67 67 65 72 50 72 67 20 3d 20 70 50 72 67 3b 0a  ggerPrg = pPrg;.
76e0: 20 20 70 50 72 67 2d 3e 70 50 72 6f 67 72 61 6d    pPrg->pProgram
76f0: 20 3d 20 70 50 72 6f 67 72 61 6d 20 3d 20 73 71   = pProgram = sq
7700: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
7710: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 75 62  o(db, sizeof(Sub
7720: 50 72 6f 67 72 61 6d 29 29 3b 0a 20 20 69 66 28  Program));.  if(
7730: 20 21 70 50 72 6f 67 72 61 6d 20 29 20 72 65 74   !pProgram ) ret
7740: 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
7750: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
7760: 61 6d 28 70 54 6f 70 2d 3e 70 56 64 62 65 2c 20  am(pTop->pVdbe, 
7770: 70 50 72 6f 67 72 61 6d 29 3b 0a 20 20 70 50 72  pProgram);.  pPr
7780: 67 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54  g->pTrigger = pT
7790: 72 69 67 67 65 72 3b 0a 20 20 70 50 72 67 2d 3e  rigger;.  pPrg->
77a0: 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b  orconf = orconf;
77b0: 0a 20 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73  .  pPrg->aColmas
77c0: 6b 5b 30 5d 20 3d 20 30 78 66 66 66 66 66 66 66  k[0] = 0xfffffff
77d0: 66 3b 0a 20 20 70 50 72 67 2d 3e 61 43 6f 6c 6d  f;.  pPrg->aColm
77e0: 61 73 6b 5b 31 5d 20 3d 20 30 78 66 66 66 66 66  ask[1] = 0xfffff
77f0: 66 66 66 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  fff;..  /* Alloc
7800: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
7810: 20 61 20 6e 65 77 20 50 61 72 73 65 20 63 6f 6e   a new Parse con
7820: 74 65 78 74 20 74 6f 20 75 73 65 20 66 6f 72 20  text to use for 
7830: 63 6f 64 69 6e 67 20 74 68 65 20 0a 20 20 2a 2a  coding the .  **
7840: 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f   trigger sub-pro
7850: 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 70 53 75 62  gram.  */.  pSub
7860: 50 61 72 73 65 20 3d 20 73 71 6c 69 74 65 33 53  Parse = sqlite3S
7870: 74 61 63 6b 41 6c 6c 6f 63 5a 65 72 6f 28 64 62  tackAllocZero(db
7880: 2c 20 73 69 7a 65 6f 66 28 50 61 72 73 65 29 29  , sizeof(Parse))
7890: 3b 0a 20 20 69 66 28 20 21 70 53 75 62 50 61 72  ;.  if( !pSubPar
78a0: 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  se ) return 0;. 
78b0: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
78c0: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
78d0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 53   sNC.pParse = pS
78e0: 75 62 50 61 72 73 65 3b 0a 20 20 70 53 75 62 50  ubParse;.  pSubP
78f0: 61 72 73 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  arse->db = db;. 
7900: 20 70 53 75 62 50 61 72 73 65 2d 3e 70 54 72 69   pSubParse->pTri
7910: 67 67 65 72 54 61 62 20 3d 20 70 54 61 62 3b 0a  ggerTab = pTab;.
7920: 20 20 70 53 75 62 50 61 72 73 65 2d 3e 70 54 6f    pSubParse->pTo
7930: 70 6c 65 76 65 6c 20 3d 20 70 54 6f 70 3b 0a 20  plevel = pTop;. 
7940: 20 70 53 75 62 50 61 72 73 65 2d 3e 7a 41 75 74   pSubParse->zAut
7950: 68 43 6f 6e 74 65 78 74 20 3d 20 70 54 72 69 67  hContext = pTrig
7960: 67 65 72 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 70 53  ger->zName;.  pS
7970: 75 62 50 61 72 73 65 2d 3e 65 54 72 69 67 67 65  ubParse->eTrigge
7980: 72 4f 70 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  rOp = pTrigger->
7990: 6f 70 3b 0a 20 20 70 53 75 62 50 61 72 73 65 2d  op;.  pSubParse-
79a0: 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  >nQueryLoop = pP
79b0: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
79c0: 3b 0a 20 20 70 53 75 62 50 61 72 73 65 2d 3e 64  ;.  pSubParse->d
79d0: 69 73 61 62 6c 65 56 74 61 62 20 3d 20 70 50 61  isableVtab = pPa
79e0: 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61 62  rse->disableVtab
79f0: 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
7a00: 47 65 74 56 64 62 65 28 70 53 75 62 50 61 72 73  GetVdbe(pSubPars
7a10: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
7a20: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
7a30: 76 2c 20 22 53 74 61 72 74 3a 20 25 73 2e 25 73  v, "Start: %s.%s
7a40: 20 28 25 73 20 25 73 25 73 25 73 20 4f 4e 20 25   (%s %s%s%s ON %
7a50: 73 29 22 2c 20 0a 20 20 20 20 20 20 70 54 72 69  s)", .      pTri
7a60: 67 67 65 72 2d 3e 7a 4e 61 6d 65 2c 20 6f 6e 45  gger->zName, onE
7a70: 72 72 6f 72 54 65 78 74 28 6f 72 63 6f 6e 66 29  rrorText(orconf)
7a80: 2c 0a 20 20 20 20 20 20 28 70 54 72 69 67 67 65  ,.      (pTrigge
7a90: 72 2d 3e 74 72 5f 74 6d 3d 3d 54 52 49 47 47 45  r->tr_tm==TRIGGE
7aa0: 52 5f 42 45 46 4f 52 45 20 3f 20 22 42 45 46 4f  R_BEFORE ? "BEFO
7ab0: 52 45 22 20 3a 20 22 41 46 54 45 52 22 29 2c 0a  RE" : "AFTER"),.
7ac0: 20 20 20 20 20 20 20 20 28 70 54 72 69 67 67 65          (pTrigge
7ad0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 44 41 54 45  r->op==TK_UPDATE
7ae0: 20 3f 20 22 55 50 44 41 54 45 22 20 3a 20 22 22   ? "UPDATE" : ""
7af0: 29 2c 0a 20 20 20 20 20 20 20 20 28 70 54 72 69  ),.        (pTri
7b00: 67 67 65 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 53  gger->op==TK_INS
7b10: 45 52 54 20 3f 20 22 49 4e 53 45 52 54 22 20 3a  ERT ? "INSERT" :
7b20: 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70   ""),.        (p
7b30: 54 72 69 67 67 65 72 2d 3e 6f 70 3d 3d 54 4b 5f  Trigger->op==TK_
7b40: 44 45 4c 45 54 45 20 3f 20 22 44 45 4c 45 54 45  DELETE ? "DELETE
7b50: 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 70  " : ""),.      p
7b60: 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  Tab->zName.    )
7b70: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
7b80: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
7b90: 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e 7a   if( pTrigger->z
7ba0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
7bb0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7bc0: 34 28 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  4(v, -1, .      
7bd0: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
7be0: 28 64 62 2c 20 22 2d 2d 20 54 52 49 47 47 45 52  (db, "-- TRIGGER
7bf0: 20 25 73 22 2c 20 70 54 72 69 67 67 65 72 2d 3e   %s", pTrigger->
7c00: 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d  zName), P4_DYNAM
7c10: 49 43 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  IC.      );.    
7c20: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
7c30: 20 49 66 20 6f 6e 65 20 77 61 73 20 73 70 65 63   If one was spec
7c40: 69 66 69 65 64 2c 20 63 6f 64 65 20 74 68 65 20  ified, code the 
7c50: 57 48 45 4e 20 63 6c 61 75 73 65 2e 20 49 66 20  WHEN clause. If 
7c60: 69 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  it evaluates to 
7c70: 66 61 6c 73 65 0a 20 20 20 20 2a 2a 20 28 6f 72  false.    ** (or
7c80: 20 4e 55 4c 4c 29 20 74 68 65 20 73 75 62 2d 76   NULL) the sub-v
7c90: 64 62 65 20 69 73 20 69 6d 6d 65 64 69 61 74 65  dbe is immediate
7ca0: 6c 79 20 68 61 6c 74 65 64 20 62 79 20 6a 75 6d  ly halted by jum
7cb0: 70 69 6e 67 20 74 6f 20 74 68 65 20 0a 20 20 20  ping to the .   
7cc0: 20 2a 2a 20 4f 50 5f 48 61 6c 74 20 69 6e 73 65   ** OP_Halt inse
7cd0: 72 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  rted at the end 
7ce0: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
7cf0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 72 69   */.    if( pTri
7d00: 67 67 65 72 2d 3e 70 57 68 65 6e 20 29 7b 0a 20  gger->pWhen ){. 
7d10: 20 20 20 20 20 70 57 68 65 6e 20 3d 20 73 71 6c       pWhen = sql
7d20: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7d30: 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 2c  pTrigger->pWhen,
7d40: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53   0);.      if( S
7d50: 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65  QLITE_OK==sqlite
7d60: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
7d70: 73 28 26 73 4e 43 2c 20 70 57 68 65 6e 29 20 0a  s(&sNC, pWhen) .
7d80: 20 20 20 20 20 20 20 26 26 20 64 62 2d 3e 6d 61         && db->ma
7d90: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20  llocFailed==0 . 
7da0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
7db0: 69 45 6e 64 54 72 69 67 67 65 72 20 3d 20 73 71  iEndTrigger = sq
7dc0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
7dd0: 65 6c 28 70 53 75 62 50 61 72 73 65 29 3b 0a 20  el(pSubParse);. 
7de0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
7df0: 70 72 49 66 46 61 6c 73 65 28 70 53 75 62 50 61  prIfFalse(pSubPa
7e00: 72 73 65 2c 20 70 57 68 65 6e 2c 20 69 45 6e 64  rse, pWhen, iEnd
7e10: 54 72 69 67 67 65 72 2c 20 53 51 4c 49 54 45 5f  Trigger, SQLITE_
7e20: 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
7e30: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7e40: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7e50: 20 70 57 68 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a   pWhen);.    }..
7e60: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
7e70: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
7e80: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 76 64 62  into the sub-vdb
7e90: 65 2e 20 2a 2f 0a 20 20 20 20 63 6f 64 65 54 72  e. */.    codeTr
7ea0: 69 67 67 65 72 50 72 6f 67 72 61 6d 28 70 53 75  iggerProgram(pSu
7eb0: 62 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  bParse, pTrigger
7ec0: 2d 3e 73 74 65 70 5f 6c 69 73 74 2c 20 6f 72 63  ->step_list, orc
7ed0: 6f 6e 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  onf);..    /* In
7ee0: 73 65 72 74 20 61 6e 20 4f 50 5f 48 61 6c 74 20  sert an OP_Halt 
7ef0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
7f00: 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 2a  e sub-program. *
7f10: 2f 0a 20 20 20 20 69 66 28 20 69 45 6e 64 54 72  /.    if( iEndTr
7f20: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  igger ){.      s
7f30: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
7f40: 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 54 72  eLabel(v, iEndTr
7f50: 69 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  igger);.    }.  
7f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7f70: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
7f80: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
7f90: 28 28 76 2c 20 22 45 6e 64 3a 20 25 73 2e 25 73  ((v, "End: %s.%s
7fa0: 22 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61  ", pTrigger->zNa
7fb0: 6d 65 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74 28  me, onErrorText(
7fc0: 6f 72 63 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20  orconf)));..    
7fd0: 74 72 61 6e 73 66 65 72 50 61 72 73 65 45 72 72  transferParseErr
7fe0: 6f 72 28 70 50 61 72 73 65 2c 20 70 53 75 62 50  or(pParse, pSubP
7ff0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 64  arse);.    if( d
8000: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
8010: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  =0 && pParse->nE
8020: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  rr==0 ){.      p
8030: 50 72 6f 67 72 61 6d 2d 3e 61 4f 70 20 3d 20 73  Program->aOp = s
8040: 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70  qlite3VdbeTakeOp
8050: 41 72 72 61 79 28 76 2c 20 26 70 50 72 6f 67 72  Array(v, &pProgr
8060: 61 6d 2d 3e 6e 4f 70 2c 20 26 70 54 6f 70 2d 3e  am->nOp, &pTop->
8070: 6e 4d 61 78 41 72 67 29 3b 0a 20 20 20 20 7d 0a  nMaxArg);.    }.
8080: 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d      pProgram->nM
8090: 65 6d 20 3d 20 70 53 75 62 50 61 72 73 65 2d 3e  em = pSubParse->
80a0: 6e 4d 65 6d 3b 0a 20 20 20 20 70 50 72 6f 67 72  nMem;.    pProgr
80b0: 61 6d 2d 3e 6e 43 73 72 20 3d 20 70 53 75 62 50  am->nCsr = pSubP
80c0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
80d0: 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 20  pProgram->token 
80e0: 3d 20 28 76 6f 69 64 20 2a 29 70 54 72 69 67 67  = (void *)pTrigg
80f0: 65 72 3b 0a 20 20 20 20 70 50 72 67 2d 3e 61 43  er;.    pPrg->aC
8100: 6f 6c 6d 61 73 6b 5b 30 5d 20 3d 20 70 53 75 62  olmask[0] = pSub
8110: 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 73 6b 3b 0a  Parse->oldmask;.
8120: 20 20 20 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61      pPrg->aColma
8130: 73 6b 5b 31 5d 20 3d 20 70 53 75 62 50 61 72 73  sk[1] = pSubPars
8140: 65 2d 3e 6e 65 77 6d 61 73 6b 3b 0a 20 20 20 20  e->newmask;.    
8150: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
8160: 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  e(v);.  }..  ass
8170: 65 72 74 28 20 21 70 53 75 62 50 61 72 73 65 2d  ert( !pSubParse-
8180: 3e 70 41 69 6e 63 20 20 20 20 20 20 20 26 26 20  >pAinc       && 
8190: 21 70 53 75 62 50 61 72 73 65 2d 3e 70 5a 6f 6d  !pSubParse->pZom
81a0: 62 69 65 54 61 62 20 29 3b 0a 20 20 61 73 73 65  bieTab );.  asse
81b0: 72 74 28 20 21 70 53 75 62 50 61 72 73 65 2d 3e  rt( !pSubParse->
81c0: 70 54 72 69 67 67 65 72 50 72 67 20 26 26 20 21  pTriggerPrg && !
81d0: 70 53 75 62 50 61 72 73 65 2d 3e 6e 4d 61 78 41  pSubParse->nMaxA
81e0: 72 67 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  rg );.  sqlite3P
81f0: 61 72 73 65 72 52 65 73 65 74 28 70 53 75 62 50  arserReset(pSubP
8200: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
8210: 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 53  StackFree(db, pS
8220: 75 62 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74  ubParse);..  ret
8230: 75 72 6e 20 70 50 72 67 3b 0a 7d 0a 20 20 20 20  urn pPrg;.}.    
8240: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
8250: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 72 69  pointer to a Tri
8260: 67 67 65 72 50 72 67 20 6f 62 6a 65 63 74 20 63  ggerPrg object c
8270: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 75  ontaining the su
8280: 62 2d 70 72 6f 67 72 61 6d 20 66 6f 72 0a 2a 2a  b-program for.**
8290: 20 74 72 69 67 67 65 72 20 70 54 72 69 67 67 65   trigger pTrigge
82a0: 72 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 4f  r with default O
82b0: 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72  N CONFLICT algor
82c0: 69 74 68 6d 20 6f 72 63 6f 6e 66 2e 20 49 66 20  ithm orconf. If 
82d0: 6e 6f 20 73 75 63 68 0a 2a 2a 20 54 72 69 67 67  no such.** Trigg
82e0: 65 72 50 72 67 20 6f 62 6a 65 63 74 20 65 78 69  erPrg object exi
82f0: 73 74 73 2c 20 61 20 6e 65 77 20 6f 62 6a 65 63  sts, a new objec
8300: 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
8310: 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 62 65 66  nd populated bef
8320: 6f 72 65 0a 2a 2a 20 62 65 69 6e 67 20 72 65 74  ore.** being ret
8330: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
8340: 20 54 72 69 67 67 65 72 50 72 67 20 2a 67 65 74   TriggerPrg *get
8350: 52 6f 77 54 72 69 67 67 65 72 28 0a 20 20 50 61  RowTrigger(.  Pa
8360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8370: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 61     /* Current pa
8380: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
8390: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
83a0: 65 72 2c 20 20 20 2f 2a 20 54 72 69 67 67 65 72  er,   /* Trigger
83b0: 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 54 61   to code */.  Ta
83c0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
83d0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
83e0: 74 72 69 67 67 65 72 20 70 54 72 69 67 67 65 72  trigger pTrigger
83f0: 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
8400: 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20  */.  int orconf 
8410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20            /* ON 
8420: 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72 69 74  CONFLICT algorit
8430: 68 6d 2e 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73  hm. */.){.  Pars
8440: 65 20 2a 70 52 6f 6f 74 20 3d 20 73 71 6c 69 74  e *pRoot = sqlit
8450: 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
8460: 70 50 61 72 73 65 29 3b 0a 20 20 54 72 69 67 67  pParse);.  Trigg
8470: 65 72 50 72 67 20 2a 70 50 72 67 3b 0a 0a 20 20  erPrg *pPrg;..  
8480: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
8490: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 54  ->zName==0 || pT
84a0: 61 62 3d 3d 74 61 62 6c 65 4f 66 54 72 69 67 67  ab==tableOfTrigg
84b0: 65 72 28 70 54 72 69 67 67 65 72 29 20 29 3b 0a  er(pTrigger) );.
84c0: 0a 20 20 2f 2a 20 49 74 20 6d 61 79 20 62 65 20  .  /* It may be 
84d0: 74 68 61 74 20 74 68 69 73 20 74 72 69 67 67 65  that this trigge
84e0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  r has already be
84f0: 65 6e 20 63 6f 64 65 64 20 28 6f 72 20 69 73 20  en coded (or is 
8500: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63  in the.  ** proc
8510: 65 73 73 20 6f 66 20 62 65 69 6e 67 20 63 6f 64  ess of being cod
8520: 65 64 29 2e 20 49 66 20 74 68 69 73 20 69 73 20  ed). If this is 
8530: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 61  the case, then a
8540: 6e 20 65 6e 74 72 79 20 77 69 74 68 0a 20 20 2a  n entry with.  *
8550: 2a 20 61 20 6d 61 74 63 68 69 6e 67 20 54 72 69  * a matching Tri
8560: 67 67 65 72 50 72 67 2e 70 54 72 69 67 67 65 72  ggerPrg.pTrigger
8570: 20 66 69 65 6c 64 20 77 69 6c 6c 20 62 65 20 70   field will be p
8580: 72 65 73 65 6e 74 20 73 6f 6d 65 77 68 65 72 65  resent somewhere
8590: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 50 61 72  .  ** in the Par
85a0: 73 65 2e 70 54 72 69 67 67 65 72 50 72 67 20 6c  se.pTriggerPrg l
85b0: 69 73 74 2e 20 53 65 61 72 63 68 20 66 6f 72 20  ist. Search for 
85c0: 73 75 63 68 20 61 6e 20 65 6e 74 72 79 2e 20 20  such an entry.  
85d0: 2a 2f 0a 20 20 66 6f 72 28 70 50 72 67 3d 70 52  */.  for(pPrg=pR
85e0: 6f 6f 74 2d 3e 70 54 72 69 67 67 65 72 50 72 67  oot->pTriggerPrg
85f0: 3b 20 0a 20 20 20 20 20 20 70 50 72 67 20 26 26  ; .      pPrg &&
8600: 20 28 70 50 72 67 2d 3e 70 54 72 69 67 67 65 72   (pPrg->pTrigger
8610: 21 3d 70 54 72 69 67 67 65 72 20 7c 7c 20 70 50  !=pTrigger || pP
8620: 72 67 2d 3e 6f 72 63 6f 6e 66 21 3d 6f 72 63 6f  rg->orconf!=orco
8630: 6e 66 29 3b 20 0a 20 20 20 20 20 20 70 50 72 67  nf); .      pPrg
8640: 3d 70 50 72 67 2d 3e 70 4e 65 78 74 0a 20 20 29  =pPrg->pNext.  )
8650: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  ;..  /* If an ex
8660: 69 73 74 69 6e 67 20 54 72 69 67 67 65 72 50 72  isting TriggerPr
8670: 67 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6c  g could not be l
8680: 6f 63 61 74 65 64 2c 20 63 72 65 61 74 65 20 61  ocated, create a
8690: 20 6e 65 77 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69   new one. */.  i
86a0: 66 28 20 21 70 50 72 67 20 29 7b 0a 20 20 20 20  f( !pPrg ){.    
86b0: 70 50 72 67 20 3d 20 63 6f 64 65 52 6f 77 54 72  pPrg = codeRowTr
86c0: 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 70 54  igger(pParse, pT
86d0: 72 69 67 67 65 72 2c 20 70 54 61 62 2c 20 6f 72  rigger, pTab, or
86e0: 63 6f 6e 66 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  conf);.  }..  re
86f0: 74 75 72 6e 20 70 50 72 67 3b 0a 7d 0a 0a 2f 2a  turn pPrg;.}../*
8700: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
8710: 65 20 66 6f 72 20 74 68 65 20 74 72 69 67 67 65  e for the trigge
8720: 72 20 70 72 6f 67 72 61 6d 20 61 73 73 6f 63 69  r program associ
8730: 61 74 65 64 20 77 69 74 68 20 74 72 69 67 67 65  ated with trigge
8740: 72 20 70 20 6f 6e 20 0a 2a 2a 20 74 61 62 6c 65  r p on .** table
8750: 20 70 54 61 62 2e 20 54 68 65 20 72 65 67 2c 20   pTab. The reg, 
8760: 6f 72 63 6f 6e 66 20 61 6e 64 20 69 67 6e 6f 72  orconf and ignor
8770: 65 4a 75 6d 70 20 70 61 72 61 6d 65 74 65 72 73  eJump parameters
8780: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 0a   passed to this.
8790: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  ** function are 
87a0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 6f 73  the same as thos
87b0: 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  e described in t
87c0: 68 65 20 68 65 61 64 65 72 20 66 75 6e 63 74 69  he header functi
87d0: 6f 6e 20 66 6f 72 0a 2a 2a 20 73 71 6c 69 74 65  on for.** sqlite
87e0: 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28  3CodeRowTrigger(
87f0: 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ).*/.void sqlite
8800: 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 44  3CodeRowTriggerD
8810: 69 72 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  irect(.  Parse *
8820: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
8830: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
8840: 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70 2c 20  /.  Trigger *p, 
8850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 69 67           /* Trig
8860: 67 65 72 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20  ger to code */. 
8870: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
8880: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
8890: 6c 65 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67  le to code trigg
88a0: 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ers from */.  in
88b0: 74 20 72 65 67 2c 20 20 20 20 20 20 20 20 20 20  t reg,          
88c0: 20 20 20 2f 2a 20 52 65 67 20 61 72 72 61 79 20     /* Reg array 
88d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 4f 4c 44 2e 2a  containing OLD.*
88e0: 20 61 6e 64 20 4e 45 57 2e 2a 20 76 61 6c 75 65   and NEW.* value
88f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e  s */.  int orcon
8900: 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  f,          /* O
8910: 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63  N CONFLICT polic
8920: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67 6e 6f 72  y */.  int ignor
8930: 65 4a 75 6d 70 20 20 20 20 20 20 20 2f 2a 20 49  eJump       /* I
8940: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6a 75  nstruction to ju
8950: 6d 70 20 74 6f 20 66 6f 72 20 52 41 49 53 45 28  mp to for RAISE(
8960: 49 47 4e 4f 52 45 29 20 2a 2f 0a 29 7b 0a 20 20  IGNORE) */.){.  
8970: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
8980: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
8990: 3b 20 2f 2a 20 4d 61 69 6e 20 56 4d 20 2a 2f 0a  ; /* Main VM */.
89a0: 20 20 54 72 69 67 67 65 72 50 72 67 20 2a 70 50    TriggerPrg *pP
89b0: 72 67 3b 0a 20 20 70 50 72 67 20 3d 20 67 65 74  rg;.  pPrg = get
89c0: 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73  RowTrigger(pPars
89d0: 65 2c 20 70 2c 20 70 54 61 62 2c 20 6f 72 63 6f  e, p, pTab, orco
89e0: 6e 66 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nf);.  assert( p
89f0: 50 72 67 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  Prg || pParse->n
8a00: 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  Err || pParse->d
8a10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8a20: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68  );..  /* Code th
8a30: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
8a40: 6f 64 65 20 69 6e 20 74 68 65 20 70 61 72 65 6e  ode in the paren
8a50: 74 20 56 44 42 45 2e 20 50 34 20 6f 66 20 74 68  t VDBE. P4 of th
8a60: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 0a 20 20  e OP_Program .  
8a70: 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ** is a pointer 
8a80: 74 6f 20 74 68 65 20 73 75 62 2d 76 64 62 65 20  to the sub-vdbe 
8a90: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
8aa0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20  rigger program. 
8ab0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 72 67 20 29   */.  if( pPrg )
8ac0: 7b 0a 20 20 20 20 69 6e 74 20 62 52 65 63 75 72  {.    int bRecur
8ad0: 73 69 76 65 20 3d 20 28 70 2d 3e 7a 4e 61 6d 65  sive = (p->zName
8ae0: 20 26 26 20 30 3d 3d 28 70 50 61 72 73 65 2d 3e   && 0==(pParse->
8af0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
8b00: 5f 52 65 63 54 72 69 67 67 65 72 73 29 29 3b 0a  _RecTriggers));.
8b10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8b20: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 72 6f  AddOp4(v, OP_Pro
8b30: 67 72 61 6d 2c 20 72 65 67 2c 20 69 67 6e 6f 72  gram, reg, ignor
8b40: 65 4a 75 6d 70 2c 20 2b 2b 70 50 61 72 73 65 2d  eJump, ++pParse-
8b50: 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20  >nMem,.         
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
8b70: 6e 73 74 20 63 68 61 72 20 2a 29 70 50 72 67 2d  nst char *)pPrg-
8b80: 3e 70 50 72 6f 67 72 61 6d 2c 20 50 34 5f 53 55  >pProgram, P4_SU
8b90: 42 50 52 4f 47 52 41 4d 29 3b 0a 20 20 20 20 56  BPROGRAM);.    V
8ba0: 64 62 65 43 6f 6d 6d 65 6e 74 28 0a 20 20 20 20  dbeComment(.    
8bb0: 20 20 20 20 28 76 2c 20 22 43 61 6c 6c 3a 20 25      (v, "Call: %
8bc0: 73 2e 25 73 22 2c 20 28 70 2d 3e 7a 4e 61 6d 65  s.%s", (p->zName
8bd0: 3f 70 2d 3e 7a 4e 61 6d 65 3a 22 66 6b 65 79 22  ?p->zName:"fkey"
8be0: 29 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f  ), onErrorText(o
8bf0: 72 63 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 2f  rconf)));..    /
8c00: 2a 20 53 65 74 20 74 68 65 20 50 35 20 6f 70 65  * Set the P5 ope
8c10: 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f 50  rand of the OP_P
8c20: 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69  rogram instructi
8c30: 6f 6e 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 69  on to non-zero i
8c40: 66 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  f.    ** recursi
8c50: 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  ve invocation of
8c60: 20 74 68 69 73 20 74 72 69 67 67 65 72 20 70 72   this trigger pr
8c70: 6f 67 72 61 6d 20 69 73 20 64 69 73 61 6c 6c 6f  ogram is disallo
8c80: 77 65 64 2e 20 52 65 63 75 72 73 69 76 65 0a 20  wed. Recursive. 
8c90: 20 20 20 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e     ** invocation
8ca0: 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 69   is disallowed i
8cb0: 66 20 28 61 29 20 74 68 65 20 73 75 62 2d 70 72  f (a) the sub-pr
8cc0: 6f 67 72 61 6d 20 69 73 20 72 65 61 6c 6c 79 20  ogram is really 
8cd0: 61 20 74 72 69 67 67 65 72 2c 0a 20 20 20 20 2a  a trigger,.    *
8ce0: 2a 20 6e 6f 74 20 61 20 66 6f 72 65 69 67 6e 20  * not a foreign 
8cf0: 6b 65 79 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20  key action, and 
8d00: 28 62 29 20 74 68 65 20 66 6c 61 67 20 74 6f 20  (b) the flag to 
8d10: 65 6e 61 62 6c 65 20 72 65 63 75 72 73 69 76 65  enable recursive
8d20: 20 74 72 69 67 67 65 72 73 0a 20 20 20 20 2a 2a   triggers.    **
8d30: 20 69 73 20 63 6c 65 61 72 2e 20 20 2a 2f 0a 20   is clear.  */. 
8d40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8d50: 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 62 52  angeP5(v, (u8)bR
8d60: 65 63 75 72 73 69 76 65 29 3b 0a 20 20 7d 0a 7d  ecursive);.  }.}
8d70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
8d80: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 64 65 20 74  called to code t
8d90: 68 65 20 72 65 71 75 69 72 65 64 20 46 4f 52 20  he required FOR 
8da0: 45 41 43 48 20 52 4f 57 20 74 72 69 67 67 65 72  EACH ROW trigger
8db0: 73 20 66 6f 72 20 61 6e 20 6f 70 65 72 61 74 69  s for an operati
8dc0: 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 20 70  on.** on table p
8dd0: 54 61 62 2e 20 54 68 65 20 6f 70 65 72 61 74 69  Tab. The operati
8de0: 6f 6e 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67  on to code trigg
8df0: 65 72 73 20 66 6f 72 20 28 49 4e 53 45 52 54 2c  ers for (INSERT,
8e00: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
8e10: 45 29 0a 2a 2a 20 69 73 20 67 69 76 65 6e 20 62  E).** is given b
8e20: 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  y the op paramet
8e30: 65 72 2e 20 54 68 65 20 74 72 5f 74 6d 20 70 61  er. The tr_tm pa
8e40: 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
8e50: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 0a 2a  es whether the.*
8e60: 2a 20 42 45 46 4f 52 45 20 6f 72 20 41 46 54 45  * BEFORE or AFTE
8e70: 52 20 74 72 69 67 67 65 72 73 20 61 72 65 20 63  R triggers are c
8e80: 6f 64 65 64 2e 20 49 66 20 74 68 65 20 6f 70 65  oded. If the ope
8e90: 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 55 50 44  ration is an UPD
8ea0: 41 54 45 2c 20 74 68 65 6e 0a 2a 2a 20 70 61 72  ATE, then.** par
8eb0: 61 6d 65 74 65 72 20 70 43 68 61 6e 67 65 73 20  ameter pChanges 
8ec0: 69 73 20 70 61 73 73 65 64 20 74 68 65 20 6c 69  is passed the li
8ed0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 62 65  st of columns be
8ee0: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  ing modified..**
8ef0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
8f00: 20 6e 6f 20 74 72 69 67 67 65 72 73 20 74 68 61   no triggers tha
8f10: 74 20 66 69 72 65 20 61 74 20 74 68 65 20 73 70  t fire at the sp
8f20: 65 63 69 66 69 65 64 20 74 69 6d 65 20 66 6f 72  ecified time for
8f30: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
8f40: 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 70  * operation on p
8f50: 54 61 62 2c 20 74 68 69 73 20 66 75 6e 63 74 69  Tab, this functi
8f60: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
8f70: 2a 0a 2a 2a 20 54 68 65 20 72 65 67 20 61 72 67  *.** The reg arg
8f80: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 64 64  ument is the add
8f90: 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73  ress of the firs
8fa0: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
8fb0: 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74   registers .** t
8fc0: 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  hat contain the 
8fd0: 76 61 6c 75 65 73 20 73 75 62 73 74 69 74 75 74  values substitut
8fe0: 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 2e 2a  ed for the new.*
8ff0: 20 61 6e 64 20 6f 6c 64 2e 2a 20 72 65 66 65 72   and old.* refer
9000: 65 6e 63 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  ences.** in the 
9010: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e  trigger program.
9020: 20 49 66 20 4e 20 69 73 20 74 68 65 20 6e 75 6d   If N is the num
9030: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
9040: 6e 20 74 61 62 6c 65 20 70 54 61 62 0a 2a 2a 20  n table pTab.** 
9050: 28 61 20 63 6f 70 79 20 6f 66 20 70 54 61 62 2d  (a copy of pTab-
9060: 3e 6e 43 6f 6c 29 2c 20 74 68 65 6e 20 72 65 67  >nCol), then reg
9070: 69 73 74 65 72 73 20 61 72 65 20 70 6f 70 75 6c  isters are popul
9080: 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
9090: 0a 2a 2a 0a 2a 2a 20 20 20 52 65 67 69 73 74 65  .**.**   Registe
90a0: 72 20 20 20 20 20 20 20 43 6f 6e 74 61 69 6e 73  r       Contains
90b0: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
90c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
90f0: 20 20 72 65 67 2b 30 20 20 20 20 20 20 20 20 20    reg+0         
9100: 20 4f 4c 44 2e 72 6f 77 69 64 0a 2a 2a 20 20 20   OLD.rowid.**   
9110: 72 65 67 2b 31 20 20 20 20 20 20 20 20 20 20 4f  reg+1          O
9120: 4c 44 2e 2a 20 76 61 6c 75 65 20 6f 66 20 6c 65  LD.* value of le
9130: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
9140: 66 20 70 54 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20  f pTab.**   ... 
9150: 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
9160: 2a 20 20 20 72 65 67 2b 4e 20 20 20 20 20 20 20  *   reg+N       
9170: 20 20 20 4f 4c 44 2e 2a 20 76 61 6c 75 65 20 6f     OLD.* value o
9180: 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c  f right-most col
9190: 75 6d 6e 20 6f 66 20 70 54 61 62 0a 2a 2a 20 20  umn of pTab.**  
91a0: 20 72 65 67 2b 4e 2b 31 20 20 20 20 20 20 20 20   reg+N+1        
91b0: 4e 45 57 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72  NEW.rowid.**   r
91c0: 65 67 2b 4e 2b 32 20 20 20 20 20 20 20 20 4f 4c  eg+N+2        OL
91d0: 44 2e 2a 20 76 61 6c 75 65 20 6f 66 20 6c 65 66  D.* value of lef
91e0: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
91f0: 20 70 54 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20   pTab.**   ...  
9200: 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
9210: 20 20 20 72 65 67 2b 4e 2b 4e 2b 31 20 20 20 20     reg+N+N+1    
9220: 20 20 4e 45 57 2e 2a 20 76 61 6c 75 65 20 6f 66    NEW.* value of
9230: 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
9240: 6d 6e 20 6f 66 20 70 54 61 62 0a 2a 2a 0a 2a 2a  mn of pTab.**.**
9250: 20 46 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 74   For ON DELETE t
9260: 72 69 67 67 65 72 73 2c 20 74 68 65 20 72 65 67  riggers, the reg
9270: 69 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e  isters containin
9280: 67 20 74 68 65 20 4e 45 57 2e 2a 20 76 61 6c 75  g the NEW.* valu
9290: 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72  es will.** never
92a0: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20   be accessed by 
92b0: 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
92c0: 72 61 6d 2c 20 73 6f 20 74 68 65 79 20 61 72 65  ram, so they are
92d0: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 6f   not allocated o
92e0: 72 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 64 20  r .** populated 
92f0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 28 74  by the caller (t
9300: 68 65 72 65 20 69 73 20 6e 6f 20 64 61 74 61 20  here is no data 
9310: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 6d  to populate them
9320: 20 77 69 74 68 20 61 6e 79 77 61 79 29 2e 20 0a   with anyway). .
9330: 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 66 6f  ** Similarly, fo
9340: 72 20 4f 4e 20 49 4e 53 45 52 54 20 74 72 69 67  r ON INSERT trig
9350: 67 65 72 73 20 74 68 65 20 76 61 6c 75 65 73 20  gers the values 
9360: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 4f 4c  stored in the OL
9370: 44 2e 2a 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  D.* registers.**
9380: 20 61 72 65 20 6e 65 76 65 72 20 61 63 63 65 73   are never acces
9390: 73 65 64 2c 20 61 6e 64 20 73 6f 20 61 72 65 20  sed, and so are 
93a0: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  not allocated by
93b0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 6f 2c   the caller. So,
93c0: 20 66 6f 72 20 61 6e 0a 2a 2a 20 4f 4e 20 49 4e   for an.** ON IN
93d0: 53 45 52 54 20 74 72 69 67 67 65 72 2c 20 74 68  SERT trigger, th
93e0: 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 74  e value passed t
93f0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
9400: 61 73 20 70 61 72 61 6d 65 74 65 72 20 72 65 67  as parameter reg
9410: 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 72 65 61  .** is not a rea
9420: 64 61 62 6c 65 20 72 65 67 69 73 74 65 72 2c 20  dable register, 
9430: 61 6c 74 68 6f 75 67 68 20 72 65 67 69 73 74 65  although registe
9440: 72 73 20 28 72 65 67 2b 4e 29 20 74 68 72 6f 75  rs (reg+N) throu
9450: 67 68 20 0a 2a 2a 20 28 72 65 67 2b 4e 2b 4e 2b  gh .** (reg+N+N+
9460: 31 29 20 61 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  1) are..**.** Pa
9470: 72 61 6d 65 74 65 72 20 6f 72 63 6f 6e 66 20 69  rameter orconf i
9480: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
9490: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
94a0: 6e 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20  n algorithm for 
94b0: 74 68 65 0a 2a 2a 20 74 72 69 67 67 65 72 20 70  the.** trigger p
94c0: 72 6f 67 72 61 6d 20 74 6f 20 75 73 65 20 28 52  rogram to use (R
94d0: 45 50 4c 41 43 45 2c 20 49 47 4e 4f 52 45 20 65  EPLACE, IGNORE e
94e0: 74 63 2e 29 2e 20 50 61 72 61 6d 65 74 65 72 20  tc.). Parameter 
94f0: 69 67 6e 6f 72 65 4a 75 6d 70 0a 2a 2a 20 69 73  ignoreJump.** is
9500: 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
9510: 20 74 68 61 74 20 63 6f 6e 74 72 6f 6c 20 73 68   that control sh
9520: 6f 75 6c 64 20 6a 75 6d 70 20 74 6f 20 69 66 20  ould jump to if 
9530: 61 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  a trigger progra
9540: 6d 0a 2a 2a 20 72 61 69 73 65 73 20 61 6e 20 49  m.** raises an I
9550: 47 4e 4f 52 45 20 65 78 63 65 70 74 69 6f 6e 2e  GNORE exception.
9560: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9570: 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 0a  CodeRowTrigger(.
9580: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9590: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
95a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69  context */.  Tri
95b0: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20  gger *pTrigger, 
95c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72 69    /* List of tri
95d0: 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65 20 70  ggers on table p
95e0: 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  Tab */.  int op,
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9600: 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 50 44 41 54   One of TK_UPDAT
9610: 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b  E, TK_INSERT, TK
9620: 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 45 78 70  _DELETE */.  Exp
9630: 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c  rList *pChanges,
9640: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69 73    /* Changes lis
9650: 74 20 66 6f 72 20 61 6e 79 20 55 50 44 41 54 45  t for any UPDATE
9660: 20 4f 46 20 74 72 69 67 67 65 72 73 20 2a 2f 0a   OF triggers */.
9670: 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20    int tr_tm,    
9680: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9690: 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 2c   TRIGGER_BEFORE,
96a0: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20 2a   TRIGGER_AFTER *
96b0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
96c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
96d0: 74 61 62 6c 65 20 74 6f 20 63 6f 64 65 20 74 72  table to code tr
96e0: 69 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20  iggers from */. 
96f0: 20 69 6e 74 20 72 65 67 2c 20 20 20 20 20 20 20   int reg,       
9700: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72        /* The fir
9710: 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
9720: 66 20 72 65 67 69 73 74 65 72 73 20 28 73 65 65  f registers (see
9730: 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20 69 6e 74   above) */.  int
9740: 20 6f 72 63 6f 6e 66 2c 20 20 20 20 20 20 20 20   orconf,        
9750: 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    /* ON CONFLICT
9760: 20 70 6f 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74   policy */.  int
9770: 20 69 67 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20   ignoreJump     
9780: 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
9790: 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20   to jump to for 
97a0: 52 41 49 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f  RAISE(IGNORE) */
97b0: 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70  .){.  Trigger *p
97c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
97d0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
97e0: 72 6f 75 67 68 20 70 54 72 69 67 67 65 72 20 6c  rough pTrigger l
97f0: 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
9800: 28 20 6f 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20  ( op==TK_UPDATE 
9810: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54  || op==TK_INSERT
9820: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54   || op==TK_DELET
9830: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  E );.  assert( t
9840: 72 5f 74 6d 3d 3d 54 52 49 47 47 45 52 5f 42 45  r_tm==TRIGGER_BE
9850: 46 4f 52 45 20 7c 7c 20 74 72 5f 74 6d 3d 3d 54  FORE || tr_tm==T
9860: 52 49 47 47 45 52 5f 41 46 54 45 52 20 29 3b 0a  RIGGER_AFTER );.
9870: 20 20 61 73 73 65 72 74 28 20 28 6f 70 3d 3d 54    assert( (op==T
9880: 4b 5f 55 50 44 41 54 45 29 3d 3d 28 70 43 68 61  K_UPDATE)==(pCha
9890: 6e 67 65 73 21 3d 30 29 20 29 3b 0a 0a 20 20 66  nges!=0) );..  f
98a0: 6f 72 28 70 3d 70 54 72 69 67 67 65 72 3b 20 70  or(p=pTrigger; p
98b0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 0a  ; p=p->pNext){..
98c0: 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68      /* Sanity ch
98d0: 65 63 6b 69 6e 67 3a 20 20 54 68 65 20 73 63 68  ecking:  The sch
98e0: 65 6d 61 20 66 6f 72 20 74 68 65 20 74 72 69 67  ema for the trig
98f0: 67 65 72 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ger and for the 
9900: 74 61 62 6c 65 20 61 72 65 0a 20 20 20 20 2a 2a  table are.    **
9910: 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 2e   always defined.
9920: 20 20 54 68 65 20 74 72 69 67 67 65 72 20 6d 75    The trigger mu
9930: 73 74 20 62 65 20 69 6e 20 74 68 65 20 73 61 6d  st be in the sam
9940: 65 20 73 63 68 65 6d 61 20 61 73 20 74 68 65 20  e schema as the 
9950: 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6f 72 20  table.    ** or 
9960: 65 6c 73 65 20 69 74 20 6d 75 73 74 20 62 65 20  else it must be 
9970: 61 20 54 45 4d 50 20 74 72 69 67 67 65 72 2e 20  a TEMP trigger. 
9980: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
9990: 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a  ->pSchema!=0 );.
99a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
99b0: 54 61 62 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a  TabSchema!=0 );.
99c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
99d0: 53 63 68 65 6d 61 3d 3d 70 2d 3e 70 54 61 62 53  Schema==p->pTabS
99e0: 63 68 65 6d 61 20 0a 20 20 20 20 20 20 20 20 20  chema .         
99f0: 7c 7c 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  || p->pSchema==p
9a00: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31  Parse->db->aDb[1
9a10: 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 0a 20 20  ].pSchema );..  
9a20: 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77    /* Determine w
9a30: 68 65 74 68 65 72 20 77 65 20 73 68 6f 75 6c 64  hether we should
9a40: 20 63 6f 64 65 20 74 68 69 73 20 74 72 69 67 67   code this trigg
9a50: 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  er */.    if( p-
9a60: 3e 6f 70 3d 3d 6f 70 20 0a 20 20 20 20 20 26 26  >op==op .     &&
9a70: 20 70 2d 3e 74 72 5f 74 6d 3d 3d 74 72 5f 74 6d   p->tr_tm==tr_tm
9a80: 20 0a 20 20 20 20 20 26 26 20 63 68 65 63 6b 43   .     && checkC
9a90: 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e  olumnOverlap(p->
9aa0: 70 43 6f 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67  pColumns, pChang
9ab0: 65 73 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  es).    ){.     
9ac0: 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54   sqlite3CodeRowT
9ad0: 72 69 67 67 65 72 44 69 72 65 63 74 28 70 50 61  riggerDirect(pPa
9ae0: 72 73 65 2c 20 70 2c 20 70 54 61 62 2c 20 72 65  rse, p, pTab, re
9af0: 67 2c 20 6f 72 63 6f 6e 66 2c 20 69 67 6e 6f 72  g, orconf, ignor
9b00: 65 4a 75 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  eJump);.    }.  
9b10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 69 67 67  }.}../*.** Trigg
9b20: 65 72 73 20 6d 61 79 20 61 63 63 65 73 73 20 76  ers may access v
9b30: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
9b40: 74 68 65 20 6f 6c 64 2e 2a 20 6f 72 20 6e 65 77  the old.* or new
9b50: 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
9b60: 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
9b70: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 33 32 2d  on returns a 32-
9b80: 62 69 74 20 62 69 74 6d 61 73 6b 20 69 6e 64 69  bit bitmask indi
9b90: 63 61 74 69 6e 67 20 77 68 69 63 68 20 63 6f 6c  cating which col
9ba0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  umns of the .** 
9bb0: 6f 6c 64 2e 2a 20 6f 72 20 6e 65 77 2e 2a 20 74  old.* or new.* t
9bc0: 61 62 6c 65 73 20 61 63 74 75 61 6c 6c 79 20 61  ables actually a
9bd0: 72 65 20 75 73 65 64 20 62 79 20 74 72 69 67 67  re used by trigg
9be0: 65 72 73 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  ers. This inform
9bf0: 61 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ation .** may be
9c00: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
9c10: 6c 65 72 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ler, for example
9c20: 2c 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e  , to avoid havin
9c30: 67 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 6e  g to load the en
9c40: 74 69 72 65 0a 2a 2a 20 6f 6c 64 2e 2a 20 72 65  tire.** old.* re
9c50: 63 6f 72 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  cord into memory
9c60: 20 77 68 65 6e 20 65 78 65 63 75 74 69 6e 67 20   when executing 
9c70: 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
9c80: 45 54 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ETE command..**.
9c90: 2a 2a 20 42 69 74 20 30 20 6f 66 20 74 68 65 20  ** Bit 0 of the 
9ca0: 72 65 74 75 72 6e 65 64 20 6d 61 73 6b 20 69 73  returned mask is
9cb0: 20 73 65 74 20 69 66 20 74 68 65 20 6c 65 66 74   set if the left
9cc0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
9cd0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79  the.** table may
9ce0: 20 62 65 20 61 63 63 65 73 73 65 64 20 75 73 69   be accessed usi
9cf0: 6e 67 20 61 6e 20 5b 6f 6c 64 7c 6e 65 77 5d 2e  ng an [old|new].
9d00: 3c 63 6f 6c 3e 20 72 65 66 65 72 65 6e 63 65 2e  <col> reference.
9d10: 20 42 69 74 20 31 20 69 73 20 73 65 74 20 69 66   Bit 1 is set if
9d20: 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  .** the second l
9d30: 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 76  eftmost column v
9d40: 61 6c 75 65 20 69 73 20 72 65 71 75 69 72 65 64  alue is required
9d50: 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 20 49 66 20  , and so on. If 
9d60: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6d 6f 72  there.** are mor
9d70: 65 20 74 68 61 6e 20 33 32 20 63 6f 6c 75 6d 6e  e than 32 column
9d80: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  s in the table, 
9d90: 61 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  and at least one
9da0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a   of the columns.
9db0: 2a 2a 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ** with an index
9dc0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 33 32   greater than 32
9dd0: 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64   may be accessed
9de0: 2c 20 30 78 66 66 66 66 66 66 66 66 20 69 73 20  , 0xffffffff is 
9df0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
9e00: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
9e10: 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
9e20: 69 66 20 74 68 65 20 6f 6c 64 2e 72 6f 77 69 64  if the old.rowid
9e30: 20 6f 72 20 6e 65 77 2e 72 6f 77 69 64 20 63 6f   or new.rowid co
9e40: 6c 75 6d 6e 20 69 73 20 0a 2a 2a 20 61 63 63 65  lumn is .** acce
9e50: 73 73 65 64 20 62 79 20 74 72 69 67 67 65 72 73  ssed by triggers
9e60: 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
9e70: 74 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20  t always assume 
9e80: 74 68 61 74 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  that it is..**.*
9e90: 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73 4e 65  * Parameter isNe
9ea0: 77 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  w must be either
9eb0: 20 31 20 6f 72 20 30 2e 20 49 66 20 69 74 20 69   1 or 0. If it i
9ec0: 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61  s 0, then the ma
9ed0: 73 6b 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  sk returned.** a
9ee0: 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 6f 6c  pplies to the ol
9ef0: 64 2e 2a 20 74 61 62 6c 65 2e 20 49 66 20 31 2c  d.* table. If 1,
9f00: 20 74 68 65 20 6e 65 77 2e 2a 20 74 61 62 6c 65   the new.* table
9f10: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
9f20: 72 20 74 72 5f 74 6d 20 6d 75 73 74 20 62 65 20  r tr_tm must be 
9f30: 61 20 6d 61 73 6b 20 77 69 74 68 20 6f 6e 65 20  a mask with one 
9f40: 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 54  or both of the T
9f50: 52 49 47 47 45 52 5f 42 45 46 4f 52 45 0a 2a 2a  RIGGER_BEFORE.**
9f60: 20 61 6e 64 20 54 52 49 47 47 45 52 5f 41 46 54   and TRIGGER_AFT
9f70: 45 52 20 62 69 74 73 20 73 65 74 2e 20 56 61 6c  ER bits set. Val
9f80: 75 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20  ues accessed by 
9f90: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 20  BEFORE triggers 
9fa0: 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63 6c  are only.** incl
9fb0: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
9fc0: 72 6e 65 64 20 6d 61 73 6b 20 69 66 20 74 68 65  rned mask if the
9fd0: 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20   TRIGGER_BEFORE 
9fe0: 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68  bit is set in th
9ff0: 65 0a 2a 2a 20 74 72 5f 74 6d 20 70 61 72 61 6d  e.** tr_tm param
a000: 65 74 65 72 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  eter. Similarly,
a010: 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64   values accessed
a020: 20 62 79 20 41 46 54 45 52 20 74 72 69 67 67 65   by AFTER trigge
a030: 72 73 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 69  rs are only.** i
a040: 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
a050: 65 74 75 72 6e 65 64 20 6d 61 73 6b 20 69 66 20  eturned mask if 
a060: 74 68 65 20 54 52 49 47 47 45 52 5f 41 46 54 45  the TRIGGER_AFTE
a070: 52 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  R bit is set in 
a080: 74 72 5f 74 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71  tr_tm..*/.u32 sq
a090: 6c 69 74 65 33 54 72 69 67 67 65 72 43 6f 6c 6d  lite3TriggerColm
a0a0: 61 73 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ask(.  Parse *pP
a0b0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
a0c0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
a0d0: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
a0e0: 67 65 72 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ger,   /* List o
a0f0: 66 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74 61  f triggers on ta
a100: 62 6c 65 20 70 54 61 62 20 2a 2f 0a 20 20 45 78  ble pTab */.  Ex
a110: 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73  prList *pChanges
a120: 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69  ,  /* Changes li
a130: 73 74 20 66 6f 72 20 61 6e 79 20 55 50 44 41 54  st for any UPDAT
a140: 45 20 4f 46 20 74 72 69 67 67 65 72 73 20 2a 2f  E OF triggers */
a150: 0a 20 20 69 6e 74 20 69 73 4e 65 77 2c 20 20 20  .  int isNew,   
a160: 20 20 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72          /* 1 for
a170: 20 6e 65 77 2e 2a 20 72 65 66 20 6d 61 73 6b 2c   new.* ref mask,
a180: 20 30 20 66 6f 72 20 6f 6c 64 2e 2a 20 72 65 66   0 for old.* ref
a190: 20 6d 61 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 74   mask */.  int t
a1a0: 72 5f 74 6d 2c 20 20 20 20 20 20 20 20 20 20 20  r_tm,           
a1b0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 54 52 49 47 47  /* Mask of TRIGG
a1c0: 45 52 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45  ER_BEFORE|TRIGGE
a1d0: 52 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54 61 62  R_AFTER */.  Tab
a1e0: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
a1f0: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
a200: 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 73 20  o code triggers 
a210: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  from */.  int or
a220: 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f  conf           /
a230: 2a 20 44 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e  * Default ON CON
a240: 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 66 6f 72  FLICT policy for
a250: 20 74 72 69 67 67 65 72 20 73 74 65 70 73 20 2a   trigger steps *
a260: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  /.){.  const int
a270: 20 6f 70 20 3d 20 70 43 68 61 6e 67 65 73 20 3f   op = pChanges ?
a280: 20 54 4b 5f 55 50 44 41 54 45 20 3a 20 54 4b 5f   TK_UPDATE : TK_
a290: 44 45 4c 45 54 45 3b 0a 20 20 75 33 32 20 6d 61  DELETE;.  u32 ma
a2a0: 73 6b 20 3d 20 30 3b 0a 20 20 54 72 69 67 67 65  sk = 0;.  Trigge
a2b0: 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *p;..  assert(
a2c0: 20 69 73 4e 65 77 3d 3d 31 20 7c 7c 20 69 73 4e   isNew==1 || isN
a2d0: 65 77 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70  ew==0 );.  for(p
a2e0: 3d 70 54 72 69 67 67 65 72 3b 20 70 3b 20 70 3d  =pTrigger; p; p=
a2f0: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
a300: 66 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20  f( p->op==op && 
a310: 28 74 72 5f 74 6d 26 70 2d 3e 74 72 5f 74 6d 29  (tr_tm&p->tr_tm)
a320: 0a 20 20 20 20 20 26 26 20 63 68 65 63 6b 43 6f  .     && checkCo
a330: 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70  lumnOverlap(p->p
a340: 43 6f 6c 75 6d 6e 73 2c 70 43 68 61 6e 67 65 73  Columns,pChanges
a350: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 54  ).    ){.      T
a360: 72 69 67 67 65 72 50 72 67 20 2a 70 50 72 67 3b  riggerPrg *pPrg;
a370: 0a 20 20 20 20 20 20 70 50 72 67 20 3d 20 67 65  .      pPrg = ge
a380: 74 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72  tRowTrigger(pPar
a390: 73 65 2c 20 70 2c 20 70 54 61 62 2c 20 6f 72 63  se, p, pTab, orc
a3a0: 6f 6e 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  onf);.      if( 
a3b0: 70 50 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  pPrg ){.        
a3c0: 6d 61 73 6b 20 7c 3d 20 70 50 72 67 2d 3e 61 43  mask |= pPrg->aC
a3d0: 6f 6c 6d 61 73 6b 5b 69 73 4e 65 77 5d 3b 0a 20  olmask[isNew];. 
a3e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a3f0: 0a 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  ..  return mask;
a400: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  .}..#endif /* !d
a410: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a420: 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a     IT_TRIGGER) */.