/ Hex Artifact Content
Login

Artifact c647a442427fb8c1cd761eb03b1710c9d5675a8b:


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 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  *.*.*/.#include 
0170: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0180: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 6c 69  *.** Delete a li
0190: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 54 72 69  nked list of Tri
01a0: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
01b0: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
01c0: 69 74 65 44 65 6c 65 74 65 54 72 69 67 67 65 72  iteDeleteTrigger
01d0: 53 74 65 70 28 54 72 69 67 67 65 72 53 74 65 70  Step(TriggerStep
01e0: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 29 7b   *pTriggerStep){
01f0: 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67  .  while( pTrigg
0200: 65 72 53 74 65 70 20 29 7b 0a 20 20 20 20 54 72  erStep ){.    Tr
0210: 69 67 67 65 72 53 74 65 70 20 2a 20 70 54 6d 70  iggerStep * pTmp
0220: 20 3d 20 70 54 72 69 67 67 65 72 53 74 65 70 3b   = pTriggerStep;
0230: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
0240: 70 20 3d 20 70 54 72 69 67 67 65 72 53 74 65 70  p = pTriggerStep
0250: 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 69 66  ->pNext;..    if
0260: 28 20 70 54 6d 70 2d 3e 74 61 72 67 65 74 2e 64  ( pTmp->target.d
0270: 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28  yn ) sqliteFree(
0280: 28 63 68 61 72 2a 29 70 54 6d 70 2d 3e 74 61 72  (char*)pTmp->tar
0290: 67 65 74 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69  get.z);.    sqli
02a0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 54 6d  teExprDelete(pTm
02b0: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
02c0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
02d0: 6c 65 74 65 28 70 54 6d 70 2d 3e 70 45 78 70 72  lete(pTmp->pExpr
02e0: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
02f0: 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54  eSelectDelete(pT
0300: 6d 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  mp->pSelect);.  
0310: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
0320: 6c 65 74 65 28 70 54 6d 70 2d 3e 70 49 64 4c 69  lete(pTmp->pIdLi
0330: 73 74 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  st);..    sqlite
0340: 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 7d 0a  Free(pTmp);.  }.
0350: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
0360: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
0370: 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 73 65  arser when it se
0380: 65 73 20 61 20 43 52 45 41 54 45 20 54 52 49 47  es a CREATE TRIG
0390: 47 45 52 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  GER statement.**
03a0: 20 75 70 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   up to the point
03b0: 20 6f 66 20 74 68 65 20 42 45 47 49 4e 20 62 65   of the BEGIN be
03c0: 66 6f 72 65 20 74 68 65 20 74 72 69 67 67 65 72  fore the trigger
03d0: 20 61 63 74 69 6f 6e 73 2e 20 20 41 20 54 72 69   actions.  A Tri
03e0: 67 67 65 72 0a 2a 2a 20 73 74 72 75 63 74 75 72  gger.** structur
03f0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  e is generated b
0400: 61 73 65 64 20 6f 6e 20 74 68 65 20 69 6e 66 6f  ased on the info
0410: 72 6d 61 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c  rmation availabl
0420: 65 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20  e and stored.** 
0430: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
0440: 72 69 67 67 65 72 2e 20 20 41 66 74 65 72 20 74  rigger.  After t
0450: 68 65 20 74 72 69 67 67 65 72 20 61 63 74 69 6f  he trigger actio
0460: 6e 73 20 68 61 76 65 20 62 65 65 6e 20 70 61 72  ns have been par
0470: 73 65 64 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  sed, the.** sqli
0480: 74 65 46 69 6e 69 73 68 54 72 69 67 67 65 72 28  teFinishTrigger(
0490: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  ) function is ca
04a0: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
04b0: 20 74 68 65 20 74 72 69 67 67 65 72 0a 2a 2a 20   the trigger.** 
04c0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 70 72 6f  construction pro
04d0: 63 65 73 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cess..*/.void sq
04e0: 6c 69 74 65 42 65 67 69 6e 54 72 69 67 67 65 72  liteBeginTrigger
04f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0500: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  e,      /* The p
0510: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 6f 66 20  arse context of 
0520: 74 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47  the CREATE TRIGG
0530: 45 52 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ER statement */.
0540: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
0550: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d        /* The nam
0560: 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72  e of the trigger
0570: 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c   */.  int tr_tm,
0580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
0590: 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54   of TK_BEFORE, T
05a0: 4b 5f 41 46 54 45 52 2c 20 54 4b 5f 49 4e 53 54  K_AFTER, TK_INST
05b0: 45 41 44 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  EAD */.  int op,
05c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
05d0: 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e 53 45 52 54  One of TK_INSERT
05e0: 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f  , TK_UPDATE, TK_
05f0: 44 45 4c 45 54 45 20 2a 2f 0a 20 20 49 64 4c 69  DELETE */.  IdLi
0600: 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20  st *pColumns,   
0610: 2f 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 69  /* column list i
0620: 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44  f this is an UPD
0630: 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 20 2a  ATE OF trigger *
0640: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
0650: 62 6c 65 4e 61 6d 65 2c 2f 2a 20 54 68 65 20 6e  bleName,/* The n
0660: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
0670: 2f 76 69 65 77 20 74 68 65 20 74 72 69 67 67 65  /view the trigge
0680: 72 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  r applies to */.
0690: 20 20 69 6e 74 20 66 6f 72 65 61 63 68 2c 20 20    int foreach,  
06a0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
06b0: 54 4b 5f 52 4f 57 20 6f 72 20 54 4b 5f 53 54 41  TK_ROW or TK_STA
06c0: 54 45 4d 45 4e 54 20 2a 2f 0a 20 20 45 78 70 72  TEMENT */.  Expr
06d0: 20 2a 70 57 68 65 6e 2c 20 20 20 20 20 20 20 20   *pWhen,        
06e0: 2f 2a 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  /* WHEN clause *
06f0: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20  /.  int isTemp  
0700: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0710: 69 66 20 74 68 65 20 54 45 4d 50 4f 52 41 52 59  if the TEMPORARY
0720: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
0730: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  ent */.){.  Trig
0740: 67 65 72 20 2a 6e 74 3b 0a 20 20 54 61 62 6c 65  ger *nt;.  Table
0750: 20 20 20 2a 74 61 62 3b 0a 20 20 63 68 61 72 20     *tab;.  char 
0760: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
0770: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
0780: 65 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 73  e trigger */.  s
0790: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
07a0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
07b0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
07c0: 20 20 2f 2a 20 57 68 65 6e 20 64 61 74 61 62 61    /* When databa
07d0: 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
07e0: 74 72 69 67 67 65 72 20 69 6e 20 2a 2f 0a 20 20  trigger in */.  
07f0: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 0a 20  DbFixer sFix;.. 
0800: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 3a 20   /* Check that: 
0810: 0a 20 20 2a 2a 20 31 2e 20 74 68 65 20 74 72 69  .  ** 1. the tri
0820: 67 67 65 72 20 6e 61 6d 65 20 64 6f 65 73 20 6e  gger name does n
0830: 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
0840: 2e 0a 20 20 2a 2a 20 32 2e 20 74 68 65 20 74 61  ..  ** 2. the ta
0850: 62 6c 65 20 28 6f 72 20 76 69 65 77 29 20 64 6f  ble (or view) do
0860: 65 73 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  es exist in the 
0870: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 61 73  same database as
0880: 20 74 68 65 20 74 72 69 67 67 65 72 2e 0a 20 20   the trigger..  
0890: 2a 2a 20 33 2e 20 74 68 61 74 20 77 65 20 61 72  ** 3. that we ar
08a0: 65 20 6e 6f 74 20 74 72 79 69 6e 67 20 74 6f 20  e not trying to 
08b0: 63 72 65 61 74 65 20 61 20 74 72 69 67 67 65 72  create a trigger
08c0: 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   on the sqlite_m
08d0: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
08e0: 20 34 2e 20 54 68 61 74 20 77 65 20 61 72 65 20   4. That we are 
08f0: 6e 6f 74 20 74 72 79 69 6e 67 20 74 6f 20 63 72  not trying to cr
0900: 65 61 74 65 20 61 6e 20 49 4e 53 54 45 41 44 20  eate an INSTEAD 
0910: 4f 46 20 74 72 69 67 67 65 72 20 6f 6e 20 61 20  OF trigger on a 
0920: 74 61 62 6c 65 2e 0a 20 20 2a 2a 20 35 2e 20 54  table..  ** 5. T
0930: 68 61 74 20 77 65 20 61 72 65 20 6e 6f 74 20 74  hat we are not t
0940: 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20  rying to create 
0950: 61 20 42 45 46 4f 52 45 20 6f 72 20 41 46 54 45  a BEFORE or AFTE
0960: 52 20 74 72 69 67 67 65 72 20 6f 6e 20 61 20 76  R trigger on a v
0970: 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  iew..  */.  if( 
0980: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
0990: 69 6c 65 64 20 29 20 67 6f 74 6f 20 74 72 69 67  iled ) goto trig
09a0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 61  ger_cleanup;.  a
09b0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 4e 61 6d  ssert( pTableNam
09c0: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
09d0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
09e0: 79 0a 20 20 20 26 26 20 73 71 6c 69 74 65 46 69  y.   && sqliteFi
09f0: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
0a00: 72 73 65 2c 20 64 62 2d 3e 69 6e 69 74 2e 69 44  rse, db->init.iD
0a10: 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20 70 4e  b, "trigger", pN
0a20: 61 6d 65 29 0a 20 20 20 26 26 20 73 71 6c 69 74  ame).   && sqlit
0a30: 65 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  eFixSrcList(&sFi
0a40: 78 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 0a 20  x, pTableName). 
0a50: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69   ){.    goto tri
0a60: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
0a70: 7d 0a 20 20 74 61 62 20 3d 20 73 71 6c 69 74 65  }.  tab = sqlite
0a80: 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
0a90: 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d 65  arse, pTableName
0aa0: 29 3b 0a 20 20 69 66 28 20 21 74 61 62 20 29 7b  );.  if( !tab ){
0ab0: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
0ac0: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  r_cleanup;.  }. 
0ad0: 20 69 44 62 20 3d 20 69 73 54 65 6d 70 20 3f 20   iDb = isTemp ? 
0ae0: 31 20 3a 20 74 61 62 2d 3e 69 44 62 3b 0a 20 20  1 : tab->iDb;.  
0af0: 69 66 28 20 69 44 62 3e 3d 32 20 26 26 20 21 64  if( iDb>=2 && !d
0b00: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
0b10: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
0b20: 73 67 28 70 50 61 72 73 65 2c 20 22 74 72 69 67  sg(pParse, "trig
0b30: 67 65 72 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  gers may not be 
0b40: 61 64 64 65 64 20 74 6f 20 61 75 78 69 6c 69 61  added to auxilia
0b50: 72 79 20 22 0a 20 20 20 20 20 20 20 22 64 61 74  ry ".       "dat
0b60: 61 62 61 73 65 20 25 73 22 2c 20 64 62 2d 3e 61  abase %s", db->a
0b70: 44 62 5b 74 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  Db[tab->iDb].zNa
0b80: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  me);.    goto tr
0b90: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
0ba0: 20 7d 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71   }..  zName = sq
0bb0: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d  liteStrNDup(pNam
0bc0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
0bd0: 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
0be0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73  (zName);.  if( s
0bf0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 28  qliteHashFind(&(
0c00: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 74 72 69  db->aDb[iDb].tri
0c10: 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65 2c 70 4e  gHash), zName,pN
0c20: 61 6d 65 2d 3e 6e 2b 31 29 20 29 7b 0a 20 20 20  ame->n+1) ){.   
0c30: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
0c40: 70 50 61 72 73 65 2c 20 22 74 72 69 67 67 65 72  pParse, "trigger
0c50: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
0c60: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
0c70: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
0c80: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28  eanup;.  }.  if(
0c90: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
0ca0: 74 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  tab->zName, "sql
0cb0: 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ite_", 7)==0 ){.
0cc0: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
0cd0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
0ce0: 6f 74 20 63 72 65 61 74 65 20 74 72 69 67 67 65  ot create trigge
0cf0: 72 20 6f 6e 20 73 79 73 74 65 6d 20 74 61 62 6c  r on system tabl
0d00: 65 22 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  e");.    pParse-
0d10: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
0d20: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
0d30: 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 61 62  p;.  }.  if( tab
0d40: 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 74 72 5f  ->pSelect && tr_
0d50: 74 6d 20 21 3d 20 54 4b 5f 49 4e 53 54 45 41 44  tm != TK_INSTEAD
0d60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72   ){.    sqliteEr
0d70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
0d80: 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 25 73  cannot create %s
0d90: 20 74 72 69 67 67 65 72 20 6f 6e 20 76 69 65 77   trigger on view
0da0: 3a 20 25 53 22 2c 20 0a 20 20 20 20 20 20 20 20  : %S", .        
0db0: 28 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 42 45 46  (tr_tm == TK_BEF
0dc0: 4f 52 45 29 3f 22 42 45 46 4f 52 45 22 3a 22 41  ORE)?"BEFORE":"A
0dd0: 46 54 45 52 22 2c 20 70 54 61 62 6c 65 4e 61 6d  FTER", pTableNam
0de0: 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  e, 0);.    goto 
0df0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
0e00: 0a 20 20 7d 0a 20 20 69 66 28 20 21 74 61 62 2d  .  }.  if( !tab-
0e10: 3e 70 53 65 6c 65 63 74 20 26 26 20 74 72 5f 74  >pSelect && tr_t
0e20: 6d 20 3d 3d 20 54 4b 5f 49 4e 53 54 45 41 44 20  m == TK_INSTEAD 
0e30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
0e40: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
0e50: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 49 4e 53  annot create INS
0e60: 54 45 41 44 20 4f 46 22 0a 20 20 20 20 20 20 20  TEAD OF".       
0e70: 20 22 20 74 72 69 67 67 65 72 20 6f 6e 20 74 61   " trigger on ta
0e80: 62 6c 65 3a 20 25 53 22 2c 20 70 54 61 62 6c 65  ble: %S", pTable
0e90: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f  Name, 0);.    go
0ea0: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
0eb0: 75 70 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  up;.  }.#ifndef 
0ec0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
0ed0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
0ee0: 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
0ef0: 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47  ITE_CREATE_TRIGG
0f00: 45 52 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ER;.    const ch
0f10: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
0f20: 62 5b 74 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  b[tab->iDb].zNam
0f30: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
0f40: 72 20 2a 7a 44 62 54 72 69 67 20 3d 20 69 73 54  r *zDbTrig = isT
0f50: 65 6d 70 20 3f 20 64 62 2d 3e 61 44 62 5b 31 5d  emp ? db->aDb[1]
0f60: 2e 7a 4e 61 6d 65 20 3a 20 7a 44 62 3b 0a 20 20  .zName : zDb;.  
0f70: 20 20 69 66 28 20 74 61 62 2d 3e 69 44 62 3d 3d    if( tab->iDb==
0f80: 31 20 7c 7c 20 69 73 54 65 6d 70 20 29 20 63 6f  1 || isTemp ) co
0f90: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
0fa0: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3b  TE_TEMP_TRIGGER;
0fb0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41  .    if( sqliteA
0fc0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
0fd0: 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 74 61   code, zName, ta
0fe0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 54 72 69  b->zName, zDbTri
0ff0: 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
1000: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1020: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
1030: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
1040: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
1050: 42 4c 45 28 74 61 62 2d 3e 69 44 62 29 2c 20 30  BLE(tab->iDb), 0
1060: 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
1070: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
1080: 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  nup;.    }.  }.#
1090: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 4e 53 54  endif..  /* INST
10a0: 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 73 20  EAD OF triggers 
10b0: 63 61 6e 20 6f 6e 6c 79 20 61 70 70 65 61 72 20  can only appear 
10c0: 6f 6e 20 76 69 65 77 73 20 61 6e 64 20 42 45 47  on views and BEG
10d0: 49 4e 20 74 72 69 67 67 65 72 73 0a 20 20 2a 2a  IN triggers.  **
10e0: 20 63 61 6e 6e 6f 74 20 61 70 70 65 61 72 20 6f   cannot appear o
10f0: 6e 20 76 69 65 77 73 2e 20 20 53 6f 20 77 65 20  n views.  So we 
1100: 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20 74 72  might as well tr
1110: 61 6e 73 6c 61 74 65 20 65 76 65 72 79 0a 20 20  anslate every.  
1120: 2a 2a 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72  ** INSTEAD OF tr
1130: 69 67 67 65 72 20 69 6e 74 6f 20 61 20 42 45 46  igger into a BEF
1140: 4f 52 45 20 74 72 69 67 67 65 72 2e 20 20 49 74  ORE trigger.  It
1150: 20 73 69 6d 70 6c 69 66 69 65 73 20 63 6f 64 65   simplifies code
1160: 0a 20 20 2a 2a 20 65 6c 73 65 77 68 65 72 65 2e  .  ** elsewhere.
1170: 0a 20 20 2a 2f 0a 20 20 69 66 20 28 74 72 5f 74  .  */.  if (tr_t
1180: 6d 20 3d 3d 20 54 4b 5f 49 4e 53 54 45 41 44 29  m == TK_INSTEAD)
1190: 7b 0a 20 20 20 20 74 72 5f 74 6d 20 3d 20 54 4b  {.    tr_tm = TK
11a0: 5f 42 45 46 4f 52 45 3b 0a 20 20 7d 0a 0a 20 20  _BEFORE;.  }..  
11b0: 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 54 72 69  /* Build the Tri
11c0: 67 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  gger object */. 
11d0: 20 6e 74 20 3d 20 28 54 72 69 67 67 65 72 2a 29   nt = (Trigger*)
11e0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
11f0: 65 6f 66 28 54 72 69 67 67 65 72 29 29 3b 0a 20  eof(Trigger));. 
1200: 20 69 66 28 20 6e 74 3d 3d 30 20 29 20 67 6f 74   if( nt==0 ) got
1210: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1220: 70 3b 0a 20 20 6e 74 2d 3e 6e 61 6d 65 20 3d 20  p;.  nt->name = 
1230: 7a 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d  zName;.  zName =
1240: 20 30 3b 0a 20 20 6e 74 2d 3e 74 61 62 6c 65 20   0;.  nt->table 
1250: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
1260: 54 61 62 6c 65 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  TableName->a[0].
1270: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  zName);.  if( sq
1280: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
1290: 65 64 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65  ed ) goto trigge
12a0: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 6e 74 2d  r_cleanup;.  nt-
12b0: 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 6e 74  >iDb = iDb;.  nt
12c0: 2d 3e 69 54 61 62 44 62 20 3d 20 74 61 62 2d 3e  ->iTabDb = tab->
12d0: 69 44 62 3b 0a 20 20 6e 74 2d 3e 6f 70 20 3d 20  iDb;.  nt->op = 
12e0: 6f 70 3b 0a 20 20 6e 74 2d 3e 74 72 5f 74 6d 20  op;.  nt->tr_tm 
12f0: 3d 20 74 72 5f 74 6d 3b 0a 20 20 6e 74 2d 3e 70  = tr_tm;.  nt->p
1300: 57 68 65 6e 20 3d 20 73 71 6c 69 74 65 45 78 70  When = sqliteExp
1310: 72 44 75 70 28 70 57 68 65 6e 29 3b 0a 20 20 6e  rDup(pWhen);.  n
1320: 74 2d 3e 70 43 6f 6c 75 6d 6e 73 20 3d 20 73 71  t->pColumns = sq
1330: 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28 70 43  liteIdListDup(pC
1340: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 6e 74 2d 3e 66  olumns);.  nt->f
1350: 6f 72 65 61 63 68 20 3d 20 66 6f 72 65 61 63 68  oreach = foreach
1360: 3b 0a 20 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43  ;.  sqliteTokenC
1370: 6f 70 79 28 26 6e 74 2d 3e 6e 61 6d 65 54 6f 6b  opy(&nt->nameTok
1380: 65 6e 2c 70 4e 61 6d 65 29 3b 0a 20 20 61 73 73  en,pName);.  ass
1390: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
13a0: 77 54 72 69 67 67 65 72 3d 3d 30 20 29 3b 0a 20  wTrigger==0 );. 
13b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69   pParse->pNewTri
13c0: 67 67 65 72 20 3d 20 6e 74 3b 0a 0a 74 72 69 67  gger = nt;..trig
13d0: 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  ger_cleanup:.  s
13e0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
13f0: 3b 0a 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73  ;.  sqliteSrcLis
1400: 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 4e 61  tDelete(pTableNa
1410: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 49 64 4c  me);.  sqliteIdL
1420: 69 73 74 44 65 6c 65 74 65 28 70 43 6f 6c 75 6d  istDelete(pColum
1430: 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  ns);.  sqliteExp
1440: 72 44 65 6c 65 74 65 28 70 57 68 65 6e 29 3b 0a  rDelete(pWhen);.
1450: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1460: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1470: 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65  after all of the
1480: 20 74 72 69 67 67 65 72 20 61 63 74 69 6f 6e 73   trigger actions
1490: 20 68 61 76 65 20 62 65 65 6e 20 70 61 72 73 65   have been parse
14a0: 64 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  d.** in order to
14b0: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72   complete the pr
14c0: 6f 63 65 73 73 20 6f 66 20 62 75 69 6c 64 69 6e  ocess of buildin
14d0: 67 20 74 68 65 20 74 72 69 67 67 65 72 2e 0a 2a  g the trigger..*
14e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 46 69 6e  /.void sqliteFin
14f0: 69 73 68 54 72 69 67 67 65 72 28 0a 20 20 50 61  ishTrigger(.  Pa
1500: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1510: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
1520: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69  context */.  Tri
1530: 67 67 65 72 53 74 65 70 20 2a 70 53 74 65 70 4c  ggerStep *pStepL
1540: 69 73 74 2c 20 2f 2a 20 54 68 65 20 74 72 69 67  ist, /* The trig
1550: 67 65 72 65 64 20 70 72 6f 67 72 61 6d 20 2a 2f  gered program */
1560: 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 6c 20 20  .  Token *pAll  
1570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
1580: 6b 65 6e 20 74 68 61 74 20 64 65 73 63 72 69 62  ken that describ
1590: 65 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  es the complete 
15a0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 2a  CREATE TRIGGER *
15b0: 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a  /.){.  Trigger *
15c0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
15d0: 20 2f 2a 20 54 68 65 20 74 72 69 67 67 65 72 20   /* The trigger 
15e0: 77 68 6f 73 65 20 63 6f 6e 73 74 72 75 63 74 69  whose constructi
15f0: 6f 6e 20 69 73 20 66 69 6e 69 73 68 69 6e 67 20  on is finishing 
1600: 75 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a  up */.  sqlite *
1610: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1620: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1630: 65 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73  e */.  DbFixer s
1640: 46 69 78 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  Fix;..  if( pPar
1650: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
1660: 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 3d  se->pNewTrigger=
1670: 3d 30 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65  =0 ) goto trigge
1680: 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b  rfinish_cleanup;
1690: 0a 20 20 6e 74 20 3d 20 70 50 61 72 73 65 2d 3e  .  nt = pParse->
16a0: 70 4e 65 77 54 72 69 67 67 65 72 3b 0a 20 20 70  pNewTrigger;.  p
16b0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67  Parse->pNewTrigg
16c0: 65 72 20 3d 20 30 3b 0a 20 20 6e 74 2d 3e 73 74  er = 0;.  nt->st
16d0: 65 70 5f 6c 69 73 74 20 3d 20 70 53 74 65 70 4c  ep_list = pStepL
16e0: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  ist;.  while( pS
16f0: 74 65 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 70  tepList ){.    p
1700: 53 74 65 70 4c 69 73 74 2d 3e 70 54 72 69 67 20  StepList->pTrig 
1710: 3d 20 6e 74 3b 0a 20 20 20 20 70 53 74 65 70 4c  = nt;.    pStepL
1720: 69 73 74 20 3d 20 70 53 74 65 70 4c 69 73 74 2d  ist = pStepList-
1730: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
1740: 28 20 73 71 6c 69 74 65 46 69 78 49 6e 69 74 28  ( sqliteFixInit(
1750: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 6e  &sFix, pParse, n
1760: 74 2d 3e 69 44 62 2c 20 22 74 72 69 67 67 65 72  t->iDb, "trigger
1770: 22 2c 20 26 6e 74 2d 3e 6e 61 6d 65 54 6f 6b 65  ", &nt->nameToke
1780: 6e 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  n) .          &&
1790: 20 73 71 6c 69 74 65 46 69 78 54 72 69 67 67 65   sqliteFixTrigge
17a0: 72 53 74 65 70 28 26 73 46 69 78 2c 20 6e 74 2d  rStep(&sFix, nt-
17b0: 3e 73 74 65 70 5f 6c 69 73 74 29 20 29 7b 0a 20  >step_list) ){. 
17c0: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66     goto triggerf
17d0: 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20  inish_cleanup;. 
17e0: 20 7d 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61   }..  /* if we a
17f0: 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  re not initializ
1800: 69 6e 67 2c 20 61 6e 64 20 74 68 69 73 20 74 72  ing, and this tr
1810: 69 67 67 65 72 20 69 73 20 6e 6f 74 20 6f 6e 20  igger is not on 
1820: 61 20 54 45 4d 50 20 74 61 62 6c 65 2c 20 0a 20  a TEMP table, . 
1830: 20 2a 2a 20 62 75 69 6c 64 20 74 68 65 20 73 71   ** build the sq
1840: 6c 69 74 65 5f 6d 61 73 74 65 72 20 65 6e 74 72  lite_master entr
1850: 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  y.  */.  if( !db
1860: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
1870: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
1880: 20 69 6e 73 65 72 74 54 72 69 67 5b 5d 20 3d 20   insertTrig[] = 
1890: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 77  {.      { OP_New
18a0: 52 65 63 6e 6f 2c 20 20 20 30 2c 20 30 2c 20 20  Recno,   0, 0,  
18b0: 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  0          },.  
18c0: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
18d0: 20 20 20 20 20 30 2c 20 30 2c 20 20 22 74 72 69       0, 0,  "tri
18e0: 67 67 65 72 22 20 20 7d 2c 0a 20 20 20 20 20 20  gger"  },.      
18f0: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
1900: 20 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20   0, 0,  0       
1910: 20 20 20 7d 2c 20 20 2f 2a 20 32 3a 20 74 72 69     },  /* 2: tri
1920: 67 67 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  gger name */.   
1930: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20     { OP_String, 
1940: 20 20 20 20 30 2c 20 30 2c 20 20 30 20 20 20 20      0, 0,  0    
1950: 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20 33 3a 20        },  /* 3: 
1960: 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
1970: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
1980: 2c 20 20 20 20 30 2c 20 30 2c 20 20 30 20 20 20  ,    0, 0,  0   
1990: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
19a0: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
19b0: 20 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20   0, 0,  0       
19c0: 20 20 20 7d 2c 20 20 2f 2a 20 35 3a 20 53 51 4c     },  /* 5: SQL
19d0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d   */.      { OP_M
19e0: 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 2c  akeRecord, 5, 0,
19f0: 20 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a    0          },.
1a00: 20 20 20 20 20 20 7b 20 4f 50 5f 50 75 74 49 6e        { OP_PutIn
1a10: 74 4b 65 79 2c 20 20 30 2c 20 30 2c 20 20 30 20  tKey,  0, 0,  0 
1a20: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1a30: 7d 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  };.    int addr;
1a40: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  .    Vdbe *v;.. 
1a50: 20 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     /* Make an en
1a60: 74 72 79 20 69 6e 20 74 68 65 20 73 71 6c 69 74  try in the sqlit
1a70: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e_master table *
1a80: 2f 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  /.    v = sqlite
1a90: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1aa0: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
1ab0: 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69  goto triggerfini
1ac0: 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  sh_cleanup;.    
1ad0: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
1ae0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1af0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1b00: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
1b10: 6c 65 28 76 2c 20 6e 74 2d 3e 69 44 62 29 3b 0a  le(v, nt->iDb);.
1b20: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
1b30: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
1b40: 2c 20 41 72 72 61 79 53 69 7a 65 28 69 6e 73 65  , ArraySize(inse
1b50: 72 74 54 72 69 67 29 2c 20 69 6e 73 65 72 74 54  rtTrig), insertT
1b60: 72 69 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rig);.    sqlite
1b70: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
1b80: 61 64 64 72 2b 32 2c 20 6e 74 2d 3e 6e 61 6d 65  addr+2, nt->name
1b90: 2c 20 30 29 3b 20 0a 20 20 20 20 73 71 6c 69 74  , 0); .    sqlit
1ba0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
1bb0: 20 61 64 64 72 2b 33 2c 20 6e 74 2d 3e 74 61 62   addr+3, nt->tab
1bc0: 6c 65 2c 20 30 29 3b 20 0a 20 20 20 20 73 71 6c  le, 0); .    sql
1bd0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
1be0: 76 2c 20 61 64 64 72 2b 35 2c 20 70 41 6c 6c 2d  v, addr+5, pAll-
1bf0: 3e 7a 2c 20 70 41 6c 6c 2d 3e 6e 29 3b 0a 20 20  >z, pAll->n);.  
1c00: 20 20 69 66 28 20 6e 74 2d 3e 69 44 62 3d 3d 30    if( nt->iDb==0
1c10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c20: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
1c30: 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   v);.    }.    s
1c40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
1c50: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
1c60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64  );.    sqliteEnd
1c70: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1c80: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  Parse);.  }..  i
1c90: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
1ca0: 61 69 6e 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ain ){.    Table
1cb0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 73 71 6c 69   *pTab;.    sqli
1cc0: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
1cd0: 2d 3e 61 44 62 5b 6e 74 2d 3e 69 44 62 5d 2e 74  ->aDb[nt->iDb].t
1ce0: 72 69 67 48 61 73 68 2c 20 0a 20 20 20 20 20 20  rigHash, .      
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
1d00: 74 2d 3e 6e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  t->name, strlen(
1d10: 6e 74 2d 3e 6e 61 6d 65 29 2b 31 2c 20 6e 74 29  nt->name)+1, nt)
1d20: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
1d30: 69 74 65 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  iteLocateTable(p
1d40: 50 61 72 73 65 2c 20 6e 74 2d 3e 74 61 62 6c 65  Parse, nt->table
1d50: 2c 20 64 62 2d 3e 61 44 62 5b 6e 74 2d 3e 69 54  , db->aDb[nt->iT
1d60: 61 62 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  abDb].zName);.  
1d70: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
1d80: 30 20 29 3b 0a 20 20 20 20 6e 74 2d 3e 70 4e 65  0 );.    nt->pNe
1d90: 78 74 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67  xt = pTab->pTrig
1da0: 67 65 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  ger;.    pTab->p
1db0: 54 72 69 67 67 65 72 20 3d 20 6e 74 3b 0a 20 20  Trigger = nt;.  
1dc0: 20 20 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 74    nt = 0;.  }..t
1dd0: 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65  riggerfinish_cle
1de0: 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 44 65  anup:.  sqliteDe
1df0: 6c 65 74 65 54 72 69 67 67 65 72 28 6e 74 29 3b  leteTrigger(nt);
1e00: 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54  .  sqliteDeleteT
1e10: 72 69 67 67 65 72 28 70 50 61 72 73 65 2d 3e 70  rigger(pParse->p
1e20: 4e 65 77 54 72 69 67 67 65 72 29 3b 0a 20 20 70  NewTrigger);.  p
1e30: 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67  Parse->pNewTrigg
1e40: 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
1e50: 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65  DeleteTriggerSte
1e60: 70 28 70 53 74 65 70 4c 69 73 74 29 3b 0a 7d 0a  p(pStepList);.}.
1e70: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f  ./*.** Make a co
1e80: 70 79 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 6f 6e  py of all compon
1e90: 65 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76 65  ents of the give
1ea0: 6e 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20  n trigger step. 
1eb0: 20 54 68 69 73 20 68 61 73 0a 2a 2a 20 74 68 65   This has.** the
1ec0: 20 65 66 66 65 63 74 20 6f 66 20 63 6f 70 79 69   effect of copyi
1ed0: 6e 67 20 61 6c 6c 20 45 78 70 72 2e 74 6f 6b 65  ng all Expr.toke
1ee0: 6e 2e 7a 20 76 61 6c 75 65 73 20 69 6e 74 6f 20  n.z values into 
1ef0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a  memory obtained.
1f00: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
1f10: 6c 6c 6f 63 28 29 2e 20 20 41 73 20 69 6e 69 74  lloc().  As init
1f20: 69 61 6c 6c 79 20 63 72 65 61 74 65 64 2c 20 74  ially created, t
1f30: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
1f40: 76 61 6c 75 65 73 0a 2a 2a 20 61 6c 6c 20 70 6f  values.** all po
1f50: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
1f60: 20 73 74 72 69 6e 67 20 74 68 61 74 20 77 61 73   string that was
1f70: 20 66 65 64 20 74 6f 20 74 68 65 20 70 61 72 73   fed to the pars
1f80: 65 72 2e 20 20 42 75 74 20 74 68 61 74 0a 2a 2a  er.  But that.**
1f90: 20 73 74 72 69 6e 67 20 69 73 20 65 70 68 65 6d   string is ephem
1fa0: 65 72 61 6c 20 2d 20 69 74 20 77 69 6c 6c 20 67  eral - it will g
1fb0: 6f 20 61 77 61 79 20 61 73 20 73 6f 6f 6e 20 61  o away as soon a
1fc0: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 65 78 65  s the sqlite_exe
1fd0: 63 28 29 0a 2a 2a 20 63 61 6c 6c 20 74 68 61 74  c().** call that
1fe0: 20 73 74 61 72 74 65 64 20 74 68 65 20 70 61 72   started the par
1ff0: 73 65 72 20 65 78 69 74 73 2e 20 20 54 68 69 73  ser exits.  This
2000: 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 61   routine makes a
2010: 20 70 65 72 73 69 73 74 65 6e 74 0a 2a 2a 20 63   persistent.** c
2020: 6f 70 79 20 6f 66 20 61 6c 6c 20 74 68 65 20 45  opy of all the E
2030: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 73 74 72 69  xpr.token.z stri
2040: 6e 67 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ngs so that the 
2050: 54 72 69 67 67 65 72 53 74 65 70 20 73 74 72 75  TriggerStep stru
2060: 63 74 75 72 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  cture.** will be
2070: 20 76 61 6c 69 64 20 65 76 65 6e 20 61 66 74 65   valid even afte
2080: 72 20 74 68 65 20 73 71 6c 69 74 65 5f 65 78 65  r the sqlite_exe
2090: 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  c() call returns
20a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20b0: 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54 72   sqlitePersistTr
20c0: 69 67 67 65 72 53 74 65 70 28 54 72 69 67 67 65  iggerStep(Trigge
20d0: 72 53 74 65 70 20 2a 70 29 7b 0a 20 20 69 66 28  rStep *p){.  if(
20e0: 20 70 2d 3e 74 61 72 67 65 74 2e 7a 20 29 7b 0a   p->target.z ){.
20f0: 20 20 20 20 70 2d 3e 74 61 72 67 65 74 2e 7a 20      p->target.z 
2100: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
2110: 70 2d 3e 74 61 72 67 65 74 2e 7a 2c 20 70 2d 3e  p->target.z, p->
2120: 74 61 72 67 65 74 2e 6e 29 3b 0a 20 20 20 20 70  target.n);.    p
2130: 2d 3e 74 61 72 67 65 74 2e 64 79 6e 20 3d 20 31  ->target.dyn = 1
2140: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2150: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 53 65  Select ){.    Se
2160: 6c 65 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c  lect *pNew = sql
2170: 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 2d 3e  iteSelectDup(p->
2180: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
2190: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
21a0: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
21b0: 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70    p->pSelect = p
21c0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  New;.  }.  if( p
21d0: 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
21e0: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
21f0: 69 74 65 45 78 70 72 44 75 70 28 70 2d 3e 70 57  iteExprDup(p->pW
2200: 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
2210: 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  eExprDelete(p->p
2220: 57 68 65 72 65 29 3b 0a 20 20 20 20 70 2d 3e 70  Where);.    p->p
2230: 57 68 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Where = pNew;.  
2240: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 78 70 72  }.  if( p->pExpr
2250: 4c 69 73 74 20 29 7b 0a 20 20 20 20 45 78 70 72  List ){.    Expr
2260: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c  List *pNew = sql
2270: 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70  iteExprListDup(p
2280: 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b 0a 20 20  ->pExprList);.  
2290: 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74    sqliteExprList
22a0: 44 65 6c 65 74 65 28 70 2d 3e 70 45 78 70 72 4c  Delete(p->pExprL
22b0: 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 78  ist);.    p->pEx
22c0: 70 72 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  prList = pNew;. 
22d0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 4c   }.  if( p->pIdL
22e0: 69 73 74 20 29 7b 0a 20 20 20 20 49 64 4c 69 73  ist ){.    IdLis
22f0: 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  t *pNew = sqlite
2300: 49 64 4c 69 73 74 44 75 70 28 70 2d 3e 70 49 64  IdListDup(p->pId
2310: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
2320: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  eIdListDelete(p-
2330: 3e 70 49 64 4c 69 73 74 29 3b 0a 20 20 20 20 70  >pIdList);.    p
2340: 2d 3e 70 49 64 4c 69 73 74 20 3d 20 70 4e 65 77  ->pIdList = pNew
2350: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2360: 75 72 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  urn a SELECT sta
2370: 74 65 6d 65 6e 74 20 28 74 68 61 74 20 74 68 65  tement (that the
2380: 20 70 53 65 6c 65 63 74 20 70 61 72 61 6d 65 74   pSelect paramet
2390: 65 72 20 70 6f 69 6e 74 73 20 74 6f 29 20 69 6e  er points to) in
23a0: 74 6f 0a 2a 2a 20 61 20 74 72 69 67 67 65 72 20  to.** a trigger 
23b0: 73 74 65 70 2e 20 20 52 65 74 75 72 6e 20 61 20  step.  Return a 
23c0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 72 69  pointer to a Tri
23d0: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
23e0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  re..**.** The pa
23f0: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
2400: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 20  routine when it 
2410: 66 69 6e 64 73 20 61 20 53 45 4c 45 43 54 20 73  finds a SELECT s
2420: 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62  tatement in.** b
2430: 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52  ody of a TRIGGER
2440: 2e 20 20 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74  .  .*/.TriggerSt
2450: 65 70 20 2a 73 71 6c 69 74 65 54 72 69 67 67 65  ep *sqliteTrigge
2460: 72 53 65 6c 65 63 74 53 74 65 70 28 53 65 6c 65  rSelectStep(Sele
2470: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
2480: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72  TriggerStep *pTr
2490: 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69  iggerStep = sqli
24a0: 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
24b0: 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a 20  TriggerStep));. 
24c0: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65   if( pTriggerSte
24d0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
24e0: 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ..  pTriggerStep
24f0: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
2500: 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ;.  pTriggerStep
2510: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ->pSelect = pSel
2520: 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53  ect;.  pTriggerS
2530: 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45  tep->orconf = OE
2540: 5f 44 65 66 61 75 6c 74 3b 0a 20 20 73 71 6c 69  _Default;.  sqli
2550: 74 65 50 65 72 73 69 73 74 54 72 69 67 67 65 72  tePersistTrigger
2560: 53 74 65 70 28 70 54 72 69 67 67 65 72 53 74 65  Step(pTriggerSte
2570: 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54  p);..  return pT
2580: 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f  riggerStep;.}../
2590: 2a 0a 2a 2a 20 42 75 69 6c 64 20 61 20 74 72 69  *.** Build a tri
25a0: 67 67 65 72 20 73 74 65 70 20 6f 75 74 20 6f 66  gger step out of
25b0: 20 61 6e 20 49 4e 53 45 52 54 20 73 74 61 74 65   an INSERT state
25c0: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
25d0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
25e0: 65 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 74  e new trigger st
25f0: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ep..**.** The pa
2600: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
2610: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 20  routine when it 
2620: 73 65 65 73 20 61 6e 20 49 4e 53 45 52 54 20 69  sees an INSERT i
2630: 6e 73 69 64 65 20 74 68 65 0a 2a 2a 20 62 6f 64  nside the.** bod
2640: 79 20 6f 66 20 61 20 74 72 69 67 67 65 72 2e 0a  y of a trigger..
2650: 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a  */.TriggerStep *
2660: 73 71 6c 69 74 65 54 72 69 67 67 65 72 49 6e 73  sqliteTriggerIns
2670: 65 72 74 53 74 65 70 28 0a 20 20 54 6f 6b 65 6e  ertStep(.  Token
2680: 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 2f   *pTableName,  /
2690: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
26a0: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
26b0: 65 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 49 64  e insert */.  Id
26c0: 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20  List *pColumn,  
26d0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
26e0: 75 6d 6e 73 20 69 6e 20 70 54 61 62 6c 65 4e 61  umns in pTableNa
26f0: 6d 65 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  me to insert int
2700: 6f 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  o */.  ExprList 
2710: 2a 70 45 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68  *pEList,   /* Th
2720: 65 20 56 41 4c 55 45 20 63 6c 61 75 73 65 3a 20  e VALUE clause: 
2730: 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
2740: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
2750: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
2760: 6c 65 63 74 2c 20 20 20 20 2f 2a 20 41 20 53 45  lect,    /* A SE
2770: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
2780: 68 61 74 20 73 75 70 70 6c 69 65 73 20 76 61 6c  hat supplies val
2790: 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63  ues */.  int orc
27a0: 6f 6e 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20  onf          /* 
27b0: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
27c0: 6f 72 69 74 68 6d 20 28 4f 45 5f 41 62 6f 72 74  orithm (OE_Abort
27d0: 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 65 74  , OE_Replace, et
27e0: 63 2e 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  c.) */.){.  Trig
27f0: 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65  gerStep *pTrigge
2800: 72 53 74 65 70 20 3d 20 73 71 6c 69 74 65 4d 61  rStep = sqliteMa
2810: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69 67  lloc(sizeof(Trig
2820: 67 65 72 53 74 65 70 29 29 3b 0a 20 20 69 66 28  gerStep));.  if(
2830: 20 70 54 72 69 67 67 65 72 53 74 65 70 3d 3d 30   pTriggerStep==0
2840: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
2850: 61 73 73 65 72 74 28 70 45 4c 69 73 74 20 3d 3d  assert(pEList ==
2860: 20 30 20 7c 7c 20 70 53 65 6c 65 63 74 20 3d 3d   0 || pSelect ==
2870: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 45   0);.  assert(pE
2880: 4c 69 73 74 20 21 3d 20 30 20 7c 7c 20 70 53 65  List != 0 || pSe
2890: 6c 65 63 74 20 21 3d 20 30 29 3b 0a 0a 20 20 70  lect != 0);..  p
28a0: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20  TriggerStep->op 
28b0: 3d 20 54 4b 5f 49 4e 53 45 52 54 3b 0a 20 20 70  = TK_INSERT;.  p
28c0: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53 65  TriggerStep->pSe
28d0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  lect = pSelect;.
28e0: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
28f0: 74 61 72 67 65 74 20 20 3d 20 2a 70 54 61 62 6c  target  = *pTabl
2900: 65 4e 61 6d 65 3b 0a 20 20 70 54 72 69 67 67 65  eName;.  pTrigge
2910: 72 53 74 65 70 2d 3e 70 49 64 4c 69 73 74 20 3d  rStep->pIdList =
2920: 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 72 69   pColumn;.  pTri
2930: 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c  ggerStep->pExprL
2940: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
2950: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 72  pTriggerStep->or
2960: 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20  conf = orconf;. 
2970: 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54 72   sqlitePersistTr
2980: 69 67 67 65 72 53 74 65 70 28 70 54 72 69 67 67  iggerStep(pTrigg
2990: 65 72 53 74 65 70 29 3b 0a 0a 20 20 72 65 74 75  erStep);..  retu
29a0: 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b  rn pTriggerStep;
29b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
29c0: 75 63 74 20 61 20 74 72 69 67 67 65 72 20 73 74  uct a trigger st
29d0: 65 70 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ep that implemen
29e0: 74 73 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  ts an UPDATE sta
29f0: 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72  tement and retur
2a00: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
2a10: 6f 20 74 68 61 74 20 74 72 69 67 67 65 72 20 73  o that trigger s
2a20: 74 65 70 2e 20 20 54 68 65 20 70 61 72 73 65 72  tep.  The parser
2a30: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
2a40: 69 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73  ine when it.** s
2a50: 65 65 73 20 61 6e 20 55 50 44 41 54 45 20 73 74  ees an UPDATE st
2a60: 61 74 65 6d 65 6e 74 20 69 6e 73 69 64 65 20 74  atement inside t
2a70: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 43 52 45  he body of a CRE
2a80: 41 54 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a  ATE TRIGGER..*/.
2a90: 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c  TriggerStep *sql
2aa0: 69 74 65 54 72 69 67 67 65 72 55 70 64 61 74 65  iteTriggerUpdate
2ab0: 53 74 65 70 28 0a 20 20 54 6f 6b 65 6e 20 2a 70  Step(.  Token *p
2ac0: 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20  TableName,   /* 
2ad0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
2ae0: 65 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  e to be updated 
2af0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2b00: 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20 54 68 65  EList,    /* The
2b10: 20 53 45 54 20 63 6c 61 75 73 65 3a 20 6c 69 73   SET clause: lis
2b20: 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  t of column and 
2b30: 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  new values */.  
2b40: 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
2b50: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2b60: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
2b70: 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20  t orconf        
2b80: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69     /* The confli
2b90: 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f  ct algorithm. (O
2ba0: 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
2bb0: 72 65 2c 20 65 74 63 29 20 2a 2f 0a 29 7b 0a 20  re, etc) */.){. 
2bc0: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54   TriggerStep *pT
2bd0: 72 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c  riggerStep = sql
2be0: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
2bf0: 28 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a  (TriggerStep));.
2c00: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
2c10: 65 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ep==0 ) return 0
2c20: 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  ;..  pTriggerSte
2c30: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 55 50 44 41 54  p->op = TK_UPDAT
2c40: 45 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  E;.  pTriggerSte
2c50: 70 2d 3e 74 61 72 67 65 74 20 20 3d 20 2a 70 54  p->target  = *pT
2c60: 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 70 54 72 69  ableName;.  pTri
2c70: 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c  ggerStep->pExprL
2c80: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
2c90: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57  pTriggerStep->pW
2ca0: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
2cb0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f   pTriggerStep->o
2cc0: 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a  rconf = orconf;.
2cd0: 20 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54    sqlitePersistT
2ce0: 72 69 67 67 65 72 53 74 65 70 28 70 54 72 69 67  riggerStep(pTrig
2cf0: 67 65 72 53 74 65 70 29 3b 0a 0a 20 20 72 65 74  gerStep);..  ret
2d00: 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70  urn pTriggerStep
2d10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  ;.}../*.** Const
2d20: 72 75 63 74 20 61 20 74 72 69 67 67 65 72 20 73  ruct a trigger s
2d30: 74 65 70 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  tep that impleme
2d40: 6e 74 73 20 61 20 44 45 4c 45 54 45 20 73 74 61  nts a DELETE sta
2d50: 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72  tement and retur
2d60: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
2d70: 6f 20 74 68 61 74 20 74 72 69 67 67 65 72 20 73  o that trigger s
2d80: 74 65 70 2e 20 20 54 68 65 20 70 61 72 73 65 72  tep.  The parser
2d90: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
2da0: 69 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73  ine when it.** s
2db0: 65 65 73 20 61 20 44 45 4c 45 54 45 20 73 74 61  ees a DELETE sta
2dc0: 74 65 6d 65 6e 74 20 69 6e 73 69 64 65 20 74 68  tement inside th
2dd0: 65 20 62 6f 64 79 20 6f 66 20 61 20 43 52 45 41  e body of a CREA
2de0: 54 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a 54  TE TRIGGER..*/.T
2df0: 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69  riggerStep *sqli
2e00: 74 65 54 72 69 67 67 65 72 44 65 6c 65 74 65 53  teTriggerDeleteS
2e10: 74 65 70 28 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  tep(Token *pTabl
2e20: 65 4e 61 6d 65 2c 20 45 78 70 72 20 2a 70 57 68  eName, Expr *pWh
2e30: 65 72 65 29 7b 0a 20 20 54 72 69 67 67 65 72 53  ere){.  TriggerS
2e40: 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65  tep *pTriggerSte
2e50: 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  p = sqliteMalloc
2e60: 28 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53  (sizeof(TriggerS
2e70: 74 65 70 29 29 3b 0a 20 20 69 66 28 20 70 54 72  tep));.  if( pTr
2e80: 69 67 67 65 72 53 74 65 70 3d 3d 30 20 29 20 72  iggerStep==0 ) r
2e90: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 70 54 72 69  eturn 0;..  pTri
2ea0: 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 54  ggerStep->op = T
2eb0: 4b 5f 44 45 4c 45 54 45 3b 0a 20 20 70 54 72 69  K_DELETE;.  pTri
2ec0: 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74  ggerStep->target
2ed0: 20 20 3d 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b    = *pTableName;
2ee0: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
2ef0: 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
2f00: 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ;.  pTriggerStep
2f10: 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44 65  ->orconf = OE_De
2f20: 66 61 75 6c 74 3b 0a 20 20 73 71 6c 69 74 65 50  fault;.  sqliteP
2f30: 65 72 73 69 73 74 54 72 69 67 67 65 72 53 74 65  ersistTriggerSte
2f40: 70 28 70 54 72 69 67 67 65 72 53 74 65 70 29 3b  p(pTriggerStep);
2f50: 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67  ..  return pTrig
2f60: 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a  gerStep;.}../* .
2f70: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64  ** Recursively d
2f80: 65 6c 65 74 65 20 61 20 54 72 69 67 67 65 72 20  elete a Trigger 
2f90: 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 76 6f 69  structure.*/.voi
2fa0: 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 72  d sqliteDeleteTr
2fb0: 69 67 67 65 72 28 54 72 69 67 67 65 72 20 2a 70  igger(Trigger *p
2fc0: 54 72 69 67 67 65 72 29 7b 0a 20 20 69 66 28 20  Trigger){.  if( 
2fd0: 70 54 72 69 67 67 65 72 3d 3d 30 20 29 20 72 65  pTrigger==0 ) re
2fe0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 44 65  turn;.  sqliteDe
2ff0: 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28  leteTriggerStep(
3000: 70 54 72 69 67 67 65 72 2d 3e 73 74 65 70 5f 6c  pTrigger->step_l
3010: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ist);.  sqliteFr
3020: 65 65 28 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  ee(pTrigger->nam
3030: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
3040: 28 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65  (pTrigger->table
3050: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 44  );.  sqliteExprD
3060: 65 6c 65 74 65 28 70 54 72 69 67 67 65 72 2d 3e  elete(pTrigger->
3070: 70 57 68 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65  pWhen);.  sqlite
3080: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54 72  IdListDelete(pTr
3090: 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 29  igger->pColumns)
30a0: 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  ;.  if( pTrigger
30b0: 2d 3e 6e 61 6d 65 54 6f 6b 65 6e 2e 64 79 6e 20  ->nameToken.dyn 
30c0: 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68  ) sqliteFree((ch
30d0: 61 72 2a 29 70 54 72 69 67 67 65 72 2d 3e 6e 61  ar*)pTrigger->na
30e0: 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71  meToken.z);.  sq
30f0: 6c 69 74 65 46 72 65 65 28 70 54 72 69 67 67 65  liteFree(pTrigge
3100: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 54 68 69  r);.}../*. * Thi
3110: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3120: 6c 6c 65 64 20 74 6f 20 64 72 6f 70 20 61 20 74  lled to drop a t
3130: 72 69 67 67 65 72 20 66 72 6f 6d 20 74 68 65 20  rigger from the 
3140: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
3150: 20 0a 20 2a 0a 20 2a 20 54 68 69 73 20 6d 61 79   . *. * This may
3160: 20 62 65 20 63 61 6c 6c 65 64 20 64 69 72 65 63   be called direc
3170: 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 70 61 72  tly from the par
3180: 73 65 72 20 61 6e 64 20 74 68 65 72 65 66 6f 72  ser and therefor
3190: 65 20 69 64 65 6e 74 69 66 69 65 73 0a 20 2a 20  e identifies. * 
31a0: 74 68 65 20 74 72 69 67 67 65 72 20 62 79 20 6e  the trigger by n
31b0: 61 6d 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ame.  The sqlite
31c0: 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 29  DropTriggerPtr()
31d0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
31e0: 65 0a 20 2a 20 73 61 6d 65 20 6a 6f 62 20 61 73  e. * same job as
31f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78   this routine ex
3200: 63 65 70 74 20 69 74 20 74 61 6b 65 20 61 20 73  cept it take a s
3210: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
3220: 72 69 67 67 65 72 0a 20 2a 20 69 6e 73 74 65 61  rigger. * instea
3230: 64 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72  d of the trigger
3240: 20 6e 61 6d 65 2e 0a 20 2a 0a 20 2a 20 4e 6f 74   name.. *. * Not
3250: 65 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  e that this func
3260: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 64 65  tion does not de
3270: 6c 65 74 65 20 74 68 65 20 74 72 69 67 67 65 72  lete the trigger
3280: 20 65 6e 74 69 72 65 6c 79 2e 20 49 6e 73 74 65   entirely. Inste
3290: 61 64 20 69 74 0a 20 2a 20 72 65 6d 6f 76 65 73  ad it. * removes
32a0: 20 69 74 20 66 72 6f 6d 20 74 68 65 20 69 6e 74   it from the int
32b0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
32c0: 20 70 6c 61 63 65 73 20 69 74 20 69 6e 20 74 68   places it in th
32d0: 65 20 74 72 69 67 44 72 6f 70 20 68 61 73 68 20  e trigDrop hash 
32e0: 0a 20 2a 20 74 61 62 6c 65 2e 20 54 68 69 73 20  . * table. This 
32f0: 69 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 74  is so that the t
3300: 72 69 67 67 65 72 20 63 61 6e 20 62 65 20 72 65  rigger can be re
3310: 73 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20  stored into the 
3320: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 0a  database schema.
3330: 20 2a 20 69 66 20 74 68 65 20 74 72 61 6e 73 61   * if the transa
3340: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
3350: 62 61 63 6b 2e 0a 20 2a 2f 0a 76 6f 69 64 20 73  back.. */.void s
3360: 71 6c 69 74 65 44 72 6f 70 54 72 69 67 67 65 72  qliteDropTrigger
3370: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3380: 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b  SrcList *pName){
3390: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
33a0: 67 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  gger;.  int i;. 
33b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
33c0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
33d0: 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 4e 61  zName;.  int nNa
33e0: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  me;.  sqlite *db
33f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
3400: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
3410: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
3420: 6f 20 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63  o drop_trigger_c
3430: 6c 65 61 6e 75 70 3b 0a 20 20 61 73 73 65 72 74  leanup;.  assert
3440: 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
3450: 20 29 3b 0a 20 20 7a 44 62 20 3d 20 70 4e 61 6d   );.  zDb = pNam
3460: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
3470: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 4e 61  e;.  zName = pNa
3480: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a  me->a[0].zName;.
3490: 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e    nName = strlen
34a0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  (zName);.  for(i
34b0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
34c0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
34d0: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
34e0: 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d  ;  /* Search TEM
34f0: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
3500: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20  .    if( zDb && 
3510: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 64 62  sqliteStrICmp(db
3520: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  ->aDb[j].zName, 
3530: 7a 44 62 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  zDb) ) continue;
3540: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
3550: 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26  sqliteHashFind(&
3560: 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 72 69 67  (db->aDb[j].trig
3570: 48 61 73 68 29 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  Hash), zName, nN
3580: 61 6d 65 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  ame+1);.    if( 
3590: 70 54 72 69 67 67 65 72 20 29 20 62 72 65 61 6b  pTrigger ) break
35a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 54 72  ;.  }.  if( !pTr
35b0: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  igger ){.    sql
35c0: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
35d0: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 72 69  se, "no such tri
35e0: 67 67 65 72 3a 20 25 53 22 2c 20 70 4e 61 6d 65  gger: %S", pName
35f0: 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 64  , 0);.    goto d
3600: 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61  rop_trigger_clea
3610: 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nup;.  }.  sqlit
3620: 65 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  eDropTriggerPtr(
3630: 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
3640: 2c 20 30 29 3b 0a 0a 64 72 6f 70 5f 74 72 69 67  , 0);..drop_trig
3650: 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  ger_cleanup:.  s
3660: 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65  qliteSrcListDele
3670: 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
3680: 0a 2a 2a 20 44 72 6f 70 20 61 20 74 72 69 67 67  .** Drop a trigg
3690: 65 72 20 67 69 76 65 6e 20 61 20 70 6f 69 6e 74  er given a point
36a0: 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67 67  er to that trigg
36b0: 65 72 2e 20 20 49 66 20 6e 65 73 74 65 64 20 69  er.  If nested i
36c0: 73 20 66 61 6c 73 65 2c 0a 2a 2a 20 74 68 65 6e  s false,.** then
36d0: 20 61 6c 73 6f 20 67 65 6e 65 72 61 74 65 20 63   also generate c
36e0: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
36f0: 65 20 74 72 69 67 67 65 72 20 66 72 6f 6d 20 74  e trigger from t
3700: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
3710: 0a 2a 2a 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  .** table..*/.vo
3720: 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 72 69  id sqliteDropTri
3730: 67 67 65 72 50 74 72 28 50 61 72 73 65 20 2a 70  ggerPtr(Parse *p
3740: 50 61 72 73 65 2c 20 54 72 69 67 67 65 72 20 2a  Parse, Trigger *
3750: 70 54 72 69 67 67 65 72 2c 20 69 6e 74 20 6e 65  pTrigger, int ne
3760: 73 74 65 64 29 7b 0a 20 20 54 61 62 6c 65 20 20  sted){.  Table  
3770: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65   *pTable;.  Vdbe
3780: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *v;.  sqlite *d
3790: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
37a0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67  .  assert( pTrig
37b0: 67 65 72 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62  ger->iDb<db->nDb
37c0: 20 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67   );.  if( pTrigg
37d0: 65 72 2d 3e 69 44 62 3e 3d 32 20 29 7b 0a 20 20  er->iDb>=2 ){.  
37e0: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
37f0: 28 70 50 61 72 73 65 2c 20 22 74 72 69 67 67 65  (pParse, "trigge
3800: 72 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 72 65  rs may not be re
3810: 6d 6f 76 65 64 20 66 72 6f 6d 20 22 0a 20 20 20  moved from ".   
3820: 20 20 20 20 22 61 75 78 69 6c 69 61 72 79 20 64      "auxiliary d
3830: 61 74 61 62 61 73 65 20 25 73 22 2c 20 64 62 2d  atabase %s", db-
3840: 3e 61 44 62 5b 70 54 72 69 67 67 65 72 2d 3e 69  >aDb[pTrigger->i
3850: 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db].zName);.    
3860: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
3870: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 46 69 6e  able = sqliteFin
3880: 64 54 61 62 6c 65 28 64 62 2c 20 70 54 72 69 67  dTable(db, pTrig
3890: 67 65 72 2d 3e 74 61 62 6c 65 2c 64 62 2d 3e 61  ger->table,db->a
38a0: 44 62 5b 70 54 72 69 67 67 65 72 2d 3e 69 54 61  Db[pTrigger->iTa
38b0: 62 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 61  bDb].zName);.  a
38c0: 73 73 65 72 74 28 70 54 61 62 6c 65 29 3b 0a 20  ssert(pTable);. 
38d0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
38e0: 3e 69 44 62 3d 3d 70 54 72 69 67 67 65 72 2d 3e  >iDb==pTrigger->
38f0: 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d  iDb || pTrigger-
3900: 3e 69 44 62 3d 3d 31 20 29 3b 0a 23 69 66 6e 64  >iDb==1 );.#ifnd
3910: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
3920: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
3930: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
3940: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47  SQLITE_DROP_TRIG
3950: 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  GER;.    const c
3960: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
3970: 44 62 5b 70 54 72 69 67 67 65 72 2d 3e 69 44 62  Db[pTrigger->iDb
3980: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
3990: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
39a0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 72  SCHEMA_TABLE(pTr
39b0: 69 67 67 65 72 2d 3e 69 44 62 29 3b 0a 20 20 20  igger->iDb);.   
39c0: 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e 69   if( pTrigger->i
39d0: 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
39e0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49  TE_DROP_TEMP_TRI
39f0: 47 47 45 52 3b 0a 20 20 20 20 69 66 28 20 73 71  GGER;.    if( sq
3a00: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
3a10: 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 72 69  arse, code, pTri
3a20: 67 67 65 72 2d 3e 6e 61 6d 65 2c 20 70 54 61 62  gger->name, pTab
3a30: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  le->zName, zDb) 
3a40: 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 41  ||.      sqliteA
3a50: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
3a60: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
3a70: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
3a80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
3a90: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
3aa0: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
3ab0: 6f 64 65 20 74 6f 20 64 65 73 74 72 6f 79 20 74  ode to destroy t
3ac0: 68 65 20 64 61 74 61 62 61 73 65 20 72 65 63 6f  he database reco
3ad0: 72 64 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  rd of the trigge
3ae0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  r..  */.  if( pT
3af0: 61 62 6c 65 21 3d 30 20 26 26 20 21 6e 65 73 74  able!=0 && !nest
3b00: 65 64 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  ed && (v = sqlit
3b10: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
3b20: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
3b30: 62 61 73 65 3b 0a 20 20 20 20 73 74 61 74 69 63  base;.    static
3b40: 20 56 64 62 65 4f 70 20 64 72 6f 70 54 72 69 67   VdbeOp dropTrig
3b50: 67 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ger[] = {.      
3b60: 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
3b70: 20 30 2c 20 41 44 44 52 28 39 29 2c 20 20 30 7d   0, ADDR(9),  0}
3b80: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72  ,.      { OP_Str
3b90: 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ing,     0, 0,  
3ba0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
3bb0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  /.      { OP_Col
3bc0: 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20  umn,     0, 1,  
3bd0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3be0: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
3bf0: 20 30 2c 20 41 44 44 52 28 38 29 2c 20 20 30 7d   0, ADDR(8),  0}
3c00: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72  ,.      { OP_Str
3c10: 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ing,     0, 0,  
3c20: 20 20 20 20 20 20 22 74 72 69 67 67 65 72 22 7d        "trigger"}
3c30: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
3c40: 75 6d 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  umn,     0, 0,  
3c50: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3c60: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
3c70: 20 30 2c 20 41 44 44 52 28 38 29 2c 20 20 30 7d   0, ADDR(8),  0}
3c80: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c  ,.      { OP_Del
3c90: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ete,     0, 0,  
3ca0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3cb0: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
3cc0: 20 30 2c 20 41 44 44 52 28 31 29 2c 20 20 30 7d   0, ADDR(1),  0}
3cd0: 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b  , /* 8 */.    };
3ce0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69  ..    sqliteBegi
3cf0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
3d00: 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20  pParse, 0, 0);. 
3d10: 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73     sqliteOpenMas
3d20: 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54 72 69  terTable(v, pTri
3d30: 67 67 65 72 2d 3e 69 44 62 29 3b 0a 20 20 20 20  gger->iDb);.    
3d40: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62  base = sqliteVdb
3d50: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 20 41  eAddOpList(v,  A
3d60: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 72 69  rraySize(dropTri
3d70: 67 67 65 72 29 2c 20 64 72 6f 70 54 72 69 67 67  gger), dropTrigg
3d80: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  er);.    sqliteV
3d90: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
3da0: 61 73 65 2b 31 2c 20 70 54 72 69 67 67 65 72 2d  ase+1, pTrigger-
3db0: 3e 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69  >name, 0);.    i
3dc0: 66 28 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62  f( pTrigger->iDb
3dd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
3de0: 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  iteChangeCookie(
3df0: 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20  db, v);.    }.  
3e00: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3e10: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
3e20: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3e30: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
3e40: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a  n(pParse);.  }..
3e50: 20 20 2f 2a 0a 20 20 20 2a 20 49 66 20 74 68 69    /*.   * If thi
3e60: 73 20 69 73 20 6e 6f 74 20 61 6e 20 22 65 78 70  s is not an "exp
3e70: 6c 61 69 6e 22 2c 20 74 68 65 6e 20 64 65 6c 65  lain", then dele
3e80: 74 65 20 74 68 65 20 74 72 69 67 67 65 72 20 73  te the trigger s
3e90: 74 72 75 63 74 75 72 65 2e 0a 20 20 20 2a 2f 0a  tructure..   */.
3ea0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
3eb0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 63 6f  xplain ){.    co
3ec0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
3ed0: 3d 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65  = pTrigger->name
3ee0: 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 20  ;.    int nName 
3ef0: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
3f00: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d  .    if( pTable-
3f10: 3e 70 54 72 69 67 67 65 72 20 3d 3d 20 70 54 72  >pTrigger == pTr
3f20: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 70  igger ){.      p
3f30: 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 20  Table->pTrigger 
3f40: 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
3f50: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
3f60: 20 20 20 20 54 72 69 67 67 65 72 20 2a 63 63 20      Trigger *cc 
3f70: 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67  = pTable->pTrigg
3f80: 65 72 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  er;.      while(
3f90: 20 63 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20   cc ){ .        
3fa0: 69 66 28 20 63 63 2d 3e 70 4e 65 78 74 20 3d 3d  if( cc->pNext ==
3fb0: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
3fc0: 20 20 20 20 20 20 20 63 63 2d 3e 70 4e 65 78 74         cc->pNext
3fd0: 20 3d 20 63 63 2d 3e 70 4e 65 78 74 2d 3e 70 4e   = cc->pNext->pN
3fe0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ext;.          b
3ff0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4000: 20 20 20 20 20 20 20 20 63 63 20 3d 20 63 63 2d          cc = cc-
4010: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
4020: 20 20 20 20 20 20 61 73 73 65 72 74 28 63 63 29        assert(cc)
4030: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4040: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 28 64  teHashInsert(&(d
4050: 62 2d 3e 61 44 62 5b 70 54 72 69 67 67 65 72 2d  b->aDb[pTrigger-
4060: 3e 69 44 62 5d 2e 74 72 69 67 48 61 73 68 29 2c  >iDb].trigHash),
4070: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 2c   zName, nName+1,
4080: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44   0);.    sqliteD
4090: 65 6c 65 74 65 54 72 69 67 67 65 72 28 70 54 72  eleteTrigger(pTr
40a0: 69 67 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  igger);.  }.}../
40b0: 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 74  *.** pEList is t
40c0: 68 65 20 53 45 54 20 63 6c 61 75 73 65 20 6f 66  he SET clause of
40d0: 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
40e0: 6d 65 6e 74 2e 20 20 45 61 63 68 20 65 6e 74 72  ment.  Each entr
40f0: 79 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 69  y.** in pEList i
4100: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 61 74 20  s of the format 
4110: 3c 69 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49 66  <id>=<expr>.  If
4120: 20 61 6e 79 20 6f 66 20 74 68 65 20 65 6e 74 72   any of the entr
4130: 69 65 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74  ies.** in pEList
4140: 20 68 61 76 65 20 61 6e 20 3c 69 64 3e 20 77 68   have an <id> wh
4150: 69 63 68 20 6d 61 74 63 68 65 73 20 61 6e 20 69  ich matches an i
4160: 64 65 6e 74 69 66 69 65 72 20 69 6e 20 70 49 64  dentifier in pId
4170: 4c 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  List,.** then re
4180: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 70  turn TRUE.  If p
4190: 49 64 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74 68  IdList==NULL, th
41a0: 65 6e 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65  en it is conside
41b0: 72 65 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61 72  red a.** wildcar
41c0: 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  d that matches a
41d0: 6e 79 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77 69  nything.  Likewi
41e0: 73 65 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55  se if pEList==NU
41f0: 4c 4c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d 61  LL then.** it ma
4200: 74 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20 73  tches anything s
4210: 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20  o always return 
4220: 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61  true.  Return fa
4230: 6c 73 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lse only.** if t
4240: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68  here is no match
4250: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4260: 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 4c  checkColumnOverL
4270: 61 70 28 49 64 4c 69 73 74 20 2a 70 49 64 4c 69  ap(IdList *pIdLi
4280: 73 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  st, ExprList *pE
4290: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b 0a  List){.  int e;.
42a0: 20 20 69 66 28 20 21 70 49 64 4c 69 73 74 20 7c    if( !pIdList |
42b0: 7c 20 21 70 45 4c 69 73 74 20 29 20 72 65 74 75  | !pEList ) retu
42c0: 72 6e 20 31 3b 0a 20 20 66 6f 72 28 65 3d 30 3b  rn 1;.  for(e=0;
42d0: 20 65 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   e<pEList->nExpr
42e0: 3b 20 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; e++){.    if( 
42f0: 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e 64 65  sqliteIdListInde
4300: 78 28 70 49 64 4c 69 73 74 2c 20 70 45 4c 69 73  x(pIdList, pELis
4310: 74 2d 3e 61 5b 65 5d 2e 7a 4e 61 6d 65 29 3e 3d  t->a[e].zName)>=
4320: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
4330: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 20 0a 7d  }.  return 0; .}
4340: 0a 0a 2f 2a 20 41 20 67 6c 6f 62 61 6c 20 76 61  ../* A global va
4350: 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 54  riable that is T
4360: 52 55 45 20 69 66 20 77 65 20 73 68 6f 75 6c 64  RUE if we should
4370: 20 61 6c 77 61 79 73 20 73 65 74 20 75 70 20 74   always set up t
4380: 65 6d 70 20 74 61 62 6c 65 73 20 66 6f 72 0a 20  emp tables for. 
4390: 2a 20 66 6f 72 20 74 72 69 67 67 65 72 73 2c 20  * for triggers, 
43a0: 65 76 65 6e 20 69 66 20 74 68 65 72 65 20 61 72  even if there ar
43b0: 65 20 6e 6f 20 74 72 69 67 67 65 72 73 20 74 6f  e no triggers to
43c0: 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75   code. This is u
43d0: 73 65 64 20 74 6f 20 74 65 73 74 20 0a 20 2a 20  sed to test . * 
43e0: 68 6f 77 20 6d 75 63 68 20 6f 76 65 72 68 65 61  how much overhea
43f0: 64 20 74 68 65 20 74 72 69 67 67 65 72 73 20 61  d the triggers a
4400: 6c 67 6f 72 69 74 68 6d 20 69 73 20 63 61 75 73  lgorithm is caus
4410: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 54 68 69 73 20  ing.. *. * This 
4420: 66 6c 61 67 20 63 61 6e 20 62 65 20 73 65 74 20  flag can be set 
4430: 6f 72 20 63 6c 65 61 72 65 64 20 75 73 69 6e 67  or cleared using
4440: 20 74 68 65 20 22 74 72 69 67 67 65 72 5f 6f 76   the "trigger_ov
4450: 65 72 68 65 61 64 5f 74 65 73 74 22 20 70 72 61  erhead_test" pra
4460: 67 6d 61 2e 0a 20 2a 20 54 68 65 20 70 72 61 67  gma.. * The prag
4470: 6d 61 20 69 73 20 6e 6f 74 20 64 6f 63 75 6d 65  ma is not docume
4480: 6e 74 65 64 20 73 69 6e 63 65 20 69 74 20 69 73  nted since it is
4490: 20 6e 6f 74 20 72 65 61 6c 6c 79 20 70 61 72 74   not really part
44a0: 20 6f 66 20 74 68 65 20 69 6e 74 65 72 66 61 63   of the interfac
44b0: 65 0a 20 2a 20 74 6f 20 53 51 4c 69 74 65 2c 20  e. * to SQLite, 
44c0: 6a 75 73 74 20 74 68 65 20 74 65 73 74 20 70 72  just the test pr
44d0: 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ocedure..*/.int 
44e0: 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72 69 67  always_code_trig
44f0: 67 65 72 5f 73 65 74 75 70 20 3d 20 30 3b 0a 0a  ger_setup = 0;..
4500: 2f 2a 0a 20 2a 20 52 65 74 75 72 6e 73 20 74 72  /*. * Returns tr
4510: 75 65 20 69 66 20 61 20 74 72 69 67 67 65 72 20  ue if a trigger 
4520: 6d 61 74 63 68 69 6e 67 20 6f 70 2c 20 74 72 5f  matching op, tr_
4530: 74 6d 20 61 6e 64 20 66 6f 72 65 61 63 68 20 74  tm and foreach t
4540: 68 61 74 20 69 73 20 4e 4f 54 20 61 6c 72 65 61  hat is NOT alrea
4550: 64 79 0a 20 2a 20 6f 6e 20 74 68 65 20 50 61 72  dy. * on the Par
4560: 73 65 20 6f 62 6a 65 63 74 73 20 74 72 69 67 67  se objects trigg
4570: 65 72 2d 73 74 61 63 6b 20 28 74 6f 20 70 72 65  er-stack (to pre
4580: 76 65 6e 74 20 72 65 63 75 72 73 69 76 65 20 74  vent recursive t
4590: 72 69 67 67 65 72 20 66 69 72 69 6e 67 29 20 69  rigger firing) i
45a0: 73 0a 20 2a 20 66 6f 75 6e 64 20 69 6e 20 74 68  s. * found in th
45b0: 65 20 6c 69 73 74 20 73 70 65 63 69 66 69 65 64  e list specified
45c0: 20 61 73 20 70 54 72 69 67 67 65 72 2e 0a 20 2a   as pTrigger.. *
45d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 54 72 69 67  /.int sqliteTrig
45e0: 67 65 72 73 45 78 69 73 74 28 0a 20 20 50 61 72  gersExist(.  Par
45f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4600: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
4610: 63 68 65 63 6b 20 66 6f 72 20 72 65 63 75 72 73  check for recurs
4620: 69 76 65 20 74 72 69 67 67 65 72 73 20 2a 2f 0a  ive triggers */.
4630: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
4640: 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 41 20 6c  ger,      /* A l
4650: 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73 20  ist of triggers 
4660: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4670: 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  a table */.  int
4680: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
4690: 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66 20 54       /* one of T
46a0: 4b 5f 44 45 4c 45 54 45 2c 20 54 4b 5f 49 4e 53  K_DELETE, TK_INS
46b0: 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 20 2a  ERT, TK_UPDATE *
46c0: 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20  /.  int tr_tm,  
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
46e0: 6e 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c  ne of TK_BEFORE,
46f0: 20 54 4b 5f 41 46 54 45 52 20 2a 2f 0a 20 20 69   TK_AFTER */.  i
4700: 6e 74 20 66 6f 72 65 61 63 68 2c 20 20 20 20 20  nt foreach,     
4710: 20 20 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66         /* one of
4720: 20 54 4b 5f 52 4f 57 20 6f 72 20 54 4b 5f 53 54   TK_ROW or TK_ST
4730: 41 54 45 4d 45 4e 54 20 2a 2f 0a 20 20 45 78 70  ATEMENT */.  Exp
4740: 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 20  rList *pChanges 
4750: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20       /* Columns 
4760: 74 68 61 74 20 63 68 61 6e 67 65 20 69 6e 20 61  that change in a
4770: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
4780: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  nt */.){.  Trigg
4790: 65 72 20 2a 20 70 54 72 69 67 67 65 72 43 75 72  er * pTriggerCur
47a0: 73 6f 72 3b 0a 0a 20 20 69 66 28 20 61 6c 77 61  sor;..  if( alwa
47b0: 79 73 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f  ys_code_trigger_
47c0: 73 65 74 75 70 20 29 7b 0a 20 20 20 20 72 65 74  setup ){.    ret
47d0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 70 54  urn 1;.  }..  pT
47e0: 72 69 67 67 65 72 43 75 72 73 6f 72 20 3d 20 70  riggerCursor = p
47f0: 54 72 69 67 67 65 72 3b 0a 20 20 77 68 69 6c 65  Trigger;.  while
4800: 28 20 70 54 72 69 67 67 65 72 43 75 72 73 6f 72  ( pTriggerCursor
4810: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 72 69   ){.    if( pTri
4820: 67 67 65 72 43 75 72 73 6f 72 2d 3e 6f 70 20 3d  ggerCursor->op =
4830: 3d 20 6f 70 20 26 26 20 0a 09 70 54 72 69 67 67  = op && ..pTrigg
4840: 65 72 43 75 72 73 6f 72 2d 3e 74 72 5f 74 6d 20  erCursor->tr_tm 
4850: 3d 3d 20 74 72 5f 74 6d 20 26 26 20 0a 09 70 54  == tr_tm && ..pT
4860: 72 69 67 67 65 72 43 75 72 73 6f 72 2d 3e 66 6f  riggerCursor->fo
4870: 72 65 61 63 68 20 3d 3d 20 66 6f 72 65 61 63 68  reach == foreach
4880: 20 26 26 0a 09 63 68 65 63 6b 43 6f 6c 75 6d 6e   &&..checkColumn
4890: 4f 76 65 72 4c 61 70 28 70 54 72 69 67 67 65 72  OverLap(pTrigger
48a0: 43 75 72 73 6f 72 2d 3e 70 43 6f 6c 75 6d 6e 73  Cursor->pColumns
48b0: 2c 20 70 43 68 61 6e 67 65 73 29 20 29 7b 0a 20  , pChanges) ){. 
48c0: 20 20 20 20 20 54 72 69 67 67 65 72 53 74 61 63       TriggerStac
48d0: 6b 20 2a 20 73 73 3b 0a 20 20 20 20 20 20 73 73  k * ss;.      ss
48e0: 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53   = pParse->trigS
48f0: 74 61 63 6b 3b 0a 20 20 20 20 20 20 77 68 69 6c  tack;.      whil
4900: 65 28 20 73 73 20 26 26 20 73 73 2d 3e 70 54 72  e( ss && ss->pTr
4910: 69 67 67 65 72 20 21 3d 20 70 54 72 69 67 67 65  igger != pTrigge
4920: 72 20 29 7b 0a 09 73 73 20 3d 20 73 73 2d 3e 70  r ){..ss = ss->p
4930: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
4940: 20 20 20 20 69 66 28 20 21 73 73 20 29 72 65 74      if( !ss )ret
4950: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
4960: 20 70 54 72 69 67 67 65 72 43 75 72 73 6f 72 20   pTriggerCursor 
4970: 3d 20 70 54 72 69 67 67 65 72 43 75 72 73 6f 72  = pTriggerCursor
4980: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  ->pNext;.  }..  
4990: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
49a0: 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
49b0: 53 74 65 70 2d 3e 74 61 72 67 65 74 20 74 6f 6b  Step->target tok
49c0: 65 6e 20 69 6e 74 6f 20 61 20 53 72 63 4c 69 73  en into a SrcLis
49d0: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
49e0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 61  ointer.** to tha
49f0: 74 20 53 72 63 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a  t SrcList..**.**
4a00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
4a10: 64 73 20 61 20 73 70 65 63 69 66 69 63 20 64 61  ds a specific da
4a20: 74 61 62 61 73 65 20 6e 61 6d 65 2c 20 69 66 20  tabase name, if 
4a30: 6e 65 65 64 65 64 2c 20 74 6f 20 74 68 65 20 74  needed, to the t
4a40: 61 72 67 65 74 20 77 68 65 6e 0a 2a 2a 20 66 6f  arget when.** fo
4a50: 72 6d 69 6e 67 20 74 68 65 20 53 72 63 4c 69 73  rming the SrcLis
4a60: 74 2e 20 20 54 68 69 73 20 70 72 65 76 65 6e 74  t.  This prevent
4a70: 73 20 61 20 74 72 69 67 67 65 72 20 69 6e 20 6f  s a trigger in o
4a80: 6e 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  ne database from
4a90: 0a 2a 2a 20 72 65 66 65 72 72 69 6e 67 20 74 6f  .** referring to
4aa0: 20 61 20 74 61 72 67 65 74 20 69 6e 20 61 6e 6f   a target in ano
4ab0: 74 68 65 72 20 64 61 74 61 62 61 73 65 2e 20 20  ther database.  
4ac0: 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  An exception is 
4ad0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 74 72 69 67  when the.** trig
4ae0: 67 65 72 20 69 73 20 69 6e 20 54 45 4d 50 20 69  ger is in TEMP i
4af0: 6e 20 77 68 69 63 68 20 63 61 73 65 20 69 74 20  n which case it 
4b00: 63 61 6e 20 72 65 66 65 72 20 74 6f 20 61 6e 79  can refer to any
4b10: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
4b20: 69 74 0a 2a 2a 20 77 61 6e 74 73 2e 0a 2a 2f 0a  it.** wants..*/.
4b30: 73 74 61 74 69 63 20 53 72 63 4c 69 73 74 20 2a  static SrcList *
4b40: 74 61 72 67 65 74 53 72 63 4c 69 73 74 28 0a 20  targetSrcList(. 
4b50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4b60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
4b70: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
4b80: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
4b90: 53 74 65 70 20 20 20 2f 2a 20 54 68 65 20 74 72  Step   /* The tr
4ba0: 69 67 67 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  igger containing
4bb0: 20 74 68 65 20 74 61 72 67 65 74 20 74 6f 6b 65   the target toke
4bc0: 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20  n */.){.  Token 
4bd0: 73 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  sDb;           /
4be0: 2a 20 44 75 6d 6d 79 20 64 61 74 61 62 61 73 65  * Dummy database
4bf0: 20 6e 61 6d 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20   name token */. 
4c00: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
4c10: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
4c20: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
4c30: 6f 20 75 73 65 20 2a 2f 0a 20 20 53 72 63 4c 69  o use */.  SrcLi
4c40: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20  st *pSrc;       
4c50: 2f 2a 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65  /* SrcList to be
4c60: 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 0a 20 20   returned */..  
4c70: 69 44 62 20 3d 20 70 53 74 65 70 2d 3e 70 54 72  iDb = pStep->pTr
4c80: 69 67 2d 3e 69 44 62 3b 0a 20 20 69 66 28 20 69  ig->iDb;.  if( i
4c90: 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 3d 32 20  Db==0 || iDb>=2 
4ca0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
4cb0: 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  Db<pParse->db->n
4cc0: 44 62 20 29 3b 0a 20 20 20 20 73 44 62 2e 7a 20  Db );.    sDb.z 
4cd0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
4ce0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
4cf0: 20 20 73 44 62 2e 6e 20 3d 20 73 74 72 6c 65 6e    sDb.n = strlen
4d00: 28 73 44 62 2e 7a 29 3b 0a 20 20 20 20 70 53 72  (sDb.z);.    pSr
4d10: 63 20 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73  c = sqliteSrcLis
4d20: 74 41 70 70 65 6e 64 28 30 2c 20 26 73 44 62 2c  tAppend(0, &sDb,
4d30: 20 26 70 53 74 65 70 2d 3e 74 61 72 67 65 74 29   &pStep->target)
4d40: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
4d50: 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 53 72   pSrc = sqliteSr
4d60: 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26  cListAppend(0, &
4d70: 70 53 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 30  pStep->target, 0
4d80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4d90: 70 53 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pSrc;.}../*.** G
4da0: 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
4db0: 65 20 66 6f 72 20 7a 65 72 6f 20 6f 72 20 6d 6f  e for zero or mo
4dc0: 72 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  re statements in
4dd0: 73 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66  side the body of
4de0: 20 61 0a 2a 2a 20 74 72 69 67 67 65 72 2e 20 20   a.** trigger.  
4df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
4e00: 6f 64 65 54 72 69 67 67 65 72 50 72 6f 67 72 61  odeTriggerProgra
4e10: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
4e20: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
4e30: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
4e40: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
4e50: 72 53 74 65 70 20 2a 70 53 74 65 70 4c 69 73 74  rStep *pStepList
4e60: 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 73  ,   /* List of s
4e70: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
4e80: 20 74 68 65 20 74 72 69 67 67 65 72 20 62 6f 64   the trigger bod
4e90: 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e  y */.  int orcon
4ea0: 66 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  fin             
4eb0: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 61 6c 67   /* Conflict alg
4ec0: 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72  orithm. (OE_Abor
4ed0: 74 2c 20 65 74 63 29 20 2a 2f 20 20 0a 29 7b 0a  t, etc) */  .){.
4ee0: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 20    TriggerStep * 
4ef0: 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 70  pTriggerStep = p
4f00: 53 74 65 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  StepList;.  int 
4f10: 6f 72 63 6f 6e 66 3b 0a 0a 20 20 77 68 69 6c 65  orconf;..  while
4f20: 28 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29  ( pTriggerStep )
4f30: 7b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 4e 54  {.    int saveNT
4f40: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
4f50: 62 3b 0a 20 0a 20 20 20 20 6f 72 63 6f 6e 66 20  b;. .    orconf 
4f60: 3d 20 28 6f 72 63 6f 6e 66 69 6e 20 3d 3d 20 4f  = (orconfin == O
4f70: 45 5f 44 65 66 61 75 6c 74 29 3f 70 54 72 69 67  E_Default)?pTrig
4f80: 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 3a  gerStep->orconf:
4f90: 6f 72 63 6f 6e 66 69 6e 3b 0a 20 20 20 20 70 50  orconfin;.    pP
4fa0: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d  arse->trigStack-
4fb0: 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66  >orconf = orconf
4fc0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 54  ;.    switch( pT
4fd0: 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 29  riggerStep->op )
4fe0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  {.      case TK_
4ff0: 53 45 4c 45 43 54 3a 20 7b 0a 09 53 65 6c 65 63  SELECT: {..Selec
5000: 74 20 2a 20 73 73 20 3d 20 73 71 6c 69 74 65 53  t * ss = sqliteS
5010: 65 6c 65 63 74 44 75 70 28 70 54 72 69 67 67 65  electDup(pTrigge
5020: 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 29 3b  rStep->pSelect);
5030: 09 09 20 20 0a 09 61 73 73 65 72 74 28 73 73 29  ..  ..assert(ss)
5040: 3b 0a 09 61 73 73 65 72 74 28 73 73 2d 3e 70 53  ;..assert(ss->pS
5050: 72 63 29 3b 0a 09 73 71 6c 69 74 65 53 65 6c 65  rc);..sqliteSele
5060: 63 74 28 70 50 61 72 73 65 2c 20 73 73 2c 20 53  ct(pParse, ss, S
5070: 52 54 5f 44 69 73 63 61 72 64 2c 20 30 2c 20 30  RT_Discard, 0, 0
5080: 2c 20 30 2c 20 30 29 3b 0a 09 73 71 6c 69 74 65  , 0, 0);..sqlite
5090: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 73 29  SelectDelete(ss)
50a0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;..break;.      
50b0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
50c0: 55 50 44 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  UPDATE: {.      
50d0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
50e0: 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20  .        pSrc = 
50f0: 74 61 72 67 65 74 53 72 63 4c 69 73 74 28 70 50  targetSrcList(pP
5100: 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 53 74  arse, pTriggerSt
5110: 65 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ep);.        sql
5120: 69 74 65 56 64 62 65 41 64 64 4f 70 28 70 50 61  iteVdbeAddOp(pPa
5130: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4c  rse->pVdbe, OP_L
5140: 69 73 74 50 75 73 68 2c 20 30 2c 20 30 29 3b 0a  istPush, 0, 0);.
5150: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 55 70          sqliteUp
5160: 64 61 74 65 28 70 50 61 72 73 65 2c 20 70 53 72  date(pParse, pSr
5170: 63 2c 0a 09 09 73 71 6c 69 74 65 45 78 70 72 4c  c,...sqliteExprL
5180: 69 73 74 44 75 70 28 70 54 72 69 67 67 65 72 53  istDup(pTriggerS
5190: 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 2c  tep->pExprList),
51a0: 20 0a 09 09 73 71 6c 69 74 65 45 78 70 72 44 75   ...sqliteExprDu
51b0: 70 28 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  p(pTriggerStep->
51c0: 70 57 68 65 72 65 29 2c 20 6f 72 63 6f 6e 66 29  pWhere), orconf)
51d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
51e0: 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65  VdbeAddOp(pParse
51f0: 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4c 69 73 74  ->pVdbe, OP_List
5200: 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Pop, 0, 0);.    
5210: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5220: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b   }.      case TK
5230: 5f 49 4e 53 45 52 54 3a 20 7b 0a 20 20 20 20 20  _INSERT: {.     
5240: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
5250: 3b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d  ;.        pSrc =
5260: 20 74 61 72 67 65 74 53 72 63 4c 69 73 74 28 70   targetSrcList(p
5270: 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 53  Parse, pTriggerS
5280: 74 65 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  tep);.        sq
5290: 6c 69 74 65 49 6e 73 65 72 74 28 70 50 61 72 73  liteInsert(pPars
52a0: 65 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  e, pSrc,.       
52b0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73     sqliteExprLis
52c0: 74 44 75 70 28 70 54 72 69 67 67 65 72 53 74 65  tDup(pTriggerSte
52d0: 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 2c 20 0a  p->pExprList), .
52e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
52f0: 53 65 6c 65 63 74 44 75 70 28 70 54 72 69 67 67  SelectDup(pTrigg
5300: 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 29  erStep->pSelect)
5310: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
5320: 69 74 65 49 64 4c 69 73 74 44 75 70 28 70 54 72  iteIdListDup(pTr
5330: 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c 69  iggerStep->pIdLi
5340: 73 74 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20  st), orconf);.  
5350: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5360: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5370: 54 4b 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20  TK_DELETE: {.   
5380: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53       SrcList *pS
5390: 72 63 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rc;.        sqli
53a0: 74 65 56 64 62 65 41 64 64 4f 70 28 70 50 61 72  teVdbeAddOp(pPar
53b0: 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4c 69  se->pVdbe, OP_Li
53c0: 73 74 50 75 73 68 2c 20 30 2c 20 30 29 3b 0a 20  stPush, 0, 0);. 
53d0: 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 74 61         pSrc = ta
53e0: 72 67 65 74 53 72 63 4c 69 73 74 28 70 50 61 72  rgetSrcList(pPar
53f0: 73 65 2c 20 70 54 72 69 67 67 65 72 53 74 65 70  se, pTriggerStep
5400: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5410: 65 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72  eDeleteFrom(pPar
5420: 73 65 2c 20 70 53 72 63 2c 20 73 71 6c 69 74 65  se, pSrc, sqlite
5430: 45 78 70 72 44 75 70 28 70 54 72 69 67 67 65 72  ExprDup(pTrigger
5440: 53 74 65 70 2d 3e 70 57 68 65 72 65 29 29 3b 0a  Step->pWhere));.
5450: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
5460: 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e  beAddOp(pParse->
5470: 70 56 64 62 65 2c 20 4f 50 5f 4c 69 73 74 50 6f  pVdbe, OP_ListPo
5480: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
5490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
54a0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
54b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 30          assert(0
54c0: 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 70 50  );.    } .    pP
54d0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 73 61 76  arse->nTab = sav
54e0: 65 4e 54 61 62 3b 0a 20 20 20 20 70 54 72 69 67  eNTab;.    pTrig
54f0: 67 65 72 53 74 65 70 20 3d 20 70 54 72 69 67 67  gerStep = pTrigg
5500: 65 72 53 74 65 70 2d 3e 70 4e 65 78 74 3b 0a 20  erStep->pNext;. 
5510: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
5520: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
5530: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 64 65 20   called to code 
5540: 46 4f 52 20 45 41 43 48 20 52 4f 57 20 74 72 69  FOR EACH ROW tri
5550: 67 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ggers..**.** Whe
5560: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
5570: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65  this function ge
5580: 6e 65 72 61 74 65 73 20 69 73 20 65 78 65 63 75  nerates is execu
5590: 74 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ted, the followi
55a0: 6e 67 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 74  ng .** must be t
55b0: 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 31 2e 20 4e 6f  rue:.**.** 1. No
55c0: 20 63 75 72 73 6f 72 73 20 6d 61 79 20 62 65 20   cursors may be 
55d0: 6f 70 65 6e 20 69 6e 20 74 68 65 20 6d 61 69 6e  open in the main
55e0: 20 64 61 74 61 62 61 73 65 2e 20 20 28 42 75 74   database.  (But
55f0: 20 6e 65 77 49 64 78 20 61 6e 64 20 6f 6c 64 49   newIdx and oldI
5600: 64 78 0a 2a 2a 20 20 20 20 63 61 6e 20 62 65 20  dx.**    can be 
5610: 69 6e 64 69 63 65 73 20 6f 66 20 63 75 72 73 6f  indices of curso
5620: 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  rs in temporary 
5630: 74 61 62 6c 65 73 2e 20 20 53 65 65 20 62 65 6c  tables.  See bel
5640: 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 32 2e 20 49 66  ow.).**.** 2. If
5650: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 62 65   the triggers be
5660: 69 6e 67 20 63 6f 64 65 64 20 61 72 65 20 4f 4e  ing coded are ON
5670: 20 49 4e 53 45 52 54 20 6f 72 20 4f 4e 20 55 50   INSERT or ON UP
5680: 44 41 54 45 20 74 72 69 67 67 65 72 73 2c 20 74  DATE triggers, t
5690: 68 65 6e 0a 2a 2a 20 20 20 20 61 20 74 65 6d 70  hen.**    a temp
56a0: 6f 72 61 72 79 20 76 64 62 65 20 63 75 72 73 6f  orary vdbe curso
56b0: 72 20 28 69 6e 64 65 78 20 6e 65 77 49 64 78 29  r (index newIdx)
56c0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61 6e   must be open an
56d0: 64 20 70 6f 69 6e 74 69 6e 67 20 61 74 0a 2a 2a  d pointing at.**
56e0: 20 20 20 20 61 20 72 6f 77 20 63 6f 6e 74 61 69      a row contai
56f0: 6e 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 62  ning values to b
5700: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 66 6f  e substituted fo
5710: 72 20 6e 65 77 2e 2a 20 65 78 70 72 65 73 73 69  r new.* expressi
5720: 6f 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ons in the.**   
5730: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
5740: 28 73 29 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 49 66  (s)..**.** 3. If
5750: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 62 65   the triggers be
5760: 69 6e 67 20 63 6f 64 65 64 20 61 72 65 20 4f 4e  ing coded are ON
5770: 20 44 45 4c 45 54 45 20 6f 72 20 4f 4e 20 55 50   DELETE or ON UP
5780: 44 41 54 45 20 74 72 69 67 67 65 72 73 2c 20 74  DATE triggers, t
5790: 68 65 6e 0a 2a 2a 20 20 20 20 61 20 74 65 6d 70  hen.**    a temp
57a0: 6f 72 61 72 79 20 76 64 62 65 20 63 75 72 73 6f  orary vdbe curso
57b0: 72 20 28 69 6e 64 65 78 20 6f 6c 64 49 64 78 29  r (index oldIdx)
57c0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61 6e   must be open an
57d0: 64 20 70 6f 69 6e 74 69 6e 67 20 61 74 0a 2a 2a  d pointing at.**
57e0: 20 20 20 20 61 20 72 6f 77 20 63 6f 6e 74 61 69      a row contai
57f0: 6e 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 62  ning values to b
5800: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 66 6f  e substituted fo
5810: 72 20 6f 6c 64 2e 2a 20 65 78 70 72 65 73 73 69  r old.* expressi
5820: 6f 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ons in the.**   
5830: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
5840: 28 73 29 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  (s)..**.*/.int s
5850: 71 6c 69 74 65 43 6f 64 65 52 6f 77 54 72 69 67  qliteCodeRowTrig
5860: 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ger(.  Parse *pP
5870: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
5880: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
5890: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
58a0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
58b0: 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f 49   TK_UPDATE, TK_I
58c0: 4e 53 45 52 54 2c 20 54 4b 5f 44 45 4c 45 54 45  NSERT, TK_DELETE
58d0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
58e0: 70 43 68 61 6e 67 65 73 2c 20 20 2f 2a 20 43 68  pChanges,  /* Ch
58f0: 61 6e 67 65 73 20 6c 69 73 74 20 66 6f 72 20 61  anges list for a
5900: 6e 79 20 55 50 44 41 54 45 20 4f 46 20 74 72 69  ny UPDATE OF tri
5910: 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74  ggers */.  int t
5920: 72 5f 74 6d 2c 20 20 20 20 20 20 20 20 20 20 20  r_tm,           
5930: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 42 45 46  /* One of TK_BEF
5940: 4f 52 45 2c 20 54 4b 5f 41 46 54 45 52 20 2a 2f  ORE, TK_AFTER */
5950: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
5960: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
5970: 61 62 6c 65 20 74 6f 20 63 6f 64 65 20 74 72 69  able to code tri
5980: 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20 20  ggers from */.  
5990: 69 6e 74 20 6e 65 77 49 64 78 2c 20 20 20 20 20  int newIdx,     
59a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 69       /* The indi
59b0: 63 65 20 6f 66 20 74 68 65 20 22 6e 65 77 22 20  ce of the "new" 
59c0: 72 6f 77 20 74 6f 20 61 63 63 65 73 73 20 2a 2f  row to access */
59d0: 0a 20 20 69 6e 74 20 6f 6c 64 49 64 78 2c 20 20  .  int oldIdx,  
59e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
59f0: 6e 64 69 63 65 20 6f 66 20 74 68 65 20 22 6f 6c  ndice of the "ol
5a00: 64 22 20 72 6f 77 20 74 6f 20 61 63 63 65 73 73  d" row to access
5a10: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66   */.  int orconf
5a20: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e  ,          /* ON
5a30: 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79   CONFLICT policy
5a40: 20 2a 2f 0a 20 20 69 6e 74 20 69 67 6e 6f 72 65   */.  int ignore
5a50: 4a 75 6d 70 20 20 20 20 20 20 20 2f 2a 20 49 6e  Jump       /* In
5a60: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6a 75 6d  struction to jum
5a70: 70 20 74 6f 20 66 6f 72 20 52 41 49 53 45 28 49  p to for RAISE(I
5a80: 47 4e 4f 52 45 29 20 2a 2f 0a 29 7b 0a 20 20 54  GNORE) */.){.  T
5a90: 72 69 67 67 65 72 20 2a 20 70 54 72 69 67 67 65  rigger * pTrigge
5aa0: 72 3b 0a 20 20 54 72 69 67 67 65 72 53 74 61 63  r;.  TriggerStac
5ab0: 6b 20 2a 20 70 54 72 69 67 67 65 72 53 74 61 63  k * pTriggerStac
5ac0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 6f 70 20  k;..  assert(op 
5ad0: 3d 3d 20 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20  == TK_UPDATE || 
5ae0: 6f 70 20 3d 3d 20 54 4b 5f 49 4e 53 45 52 54 20  op == TK_INSERT 
5af0: 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 44 45 4c 45  || op == TK_DELE
5b00: 54 45 29 3b 0a 20 20 61 73 73 65 72 74 28 74 72  TE);.  assert(tr
5b10: 5f 74 6d 20 3d 3d 20 54 4b 5f 42 45 46 4f 52 45  _tm == TK_BEFORE
5b20: 20 7c 7c 20 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f   || tr_tm == TK_
5b30: 41 46 54 45 52 20 29 3b 0a 0a 20 20 61 73 73 65  AFTER );..  asse
5b40: 72 74 28 6e 65 77 49 64 78 20 21 3d 20 2d 31 20  rt(newIdx != -1 
5b50: 7c 7c 20 6f 6c 64 49 64 78 20 21 3d 20 2d 31 29  || oldIdx != -1)
5b60: 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  ;..  pTrigger = 
5b70: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
5b80: 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
5b90: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 69 72  r ){.    int fir
5ba0: 65 5f 74 68 69 73 20 3d 20 30 3b 0a 0a 20 20 20  e_this = 0;..   
5bb0: 20 2f 2a 20 64 65 74 65 72 6d 69 6e 65 20 77 68   /* determine wh
5bc0: 65 74 68 65 72 20 77 65 20 73 68 6f 75 6c 64 20  ether we should 
5bd0: 63 6f 64 65 20 74 68 69 73 20 74 72 69 67 67 65  code this trigge
5be0: 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 72  r */.    if( pTr
5bf0: 69 67 67 65 72 2d 3e 6f 70 20 3d 3d 20 6f 70 20  igger->op == op 
5c00: 26 26 20 70 54 72 69 67 67 65 72 2d 3e 74 72 5f  && pTrigger->tr_
5c10: 74 6d 20 3d 3d 20 74 72 5f 74 6d 20 26 26 20 0a  tm == tr_tm && .
5c20: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
5c30: 2d 3e 66 6f 72 65 61 63 68 20 3d 3d 20 54 4b 5f  ->foreach == TK_
5c40: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 69 72  ROW ){.      fir
5c50: 65 5f 74 68 69 73 20 3d 20 31 3b 0a 20 20 20 20  e_this = 1;.    
5c60: 20 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 20    pTriggerStack 
5c70: 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  = pParse->trigSt
5c80: 61 63 6b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ack;.      while
5c90: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 20  ( pTriggerStack 
5ca0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
5cb0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
5cc0: 72 69 67 67 65 72 20 3d 3d 20 70 54 72 69 67 67  rigger == pTrigg
5cd0: 65 72 20 29 7b 0a 09 20 20 66 69 72 65 5f 74 68  er ){..  fire_th
5ce0: 69 73 20 3d 20 30 3b 0a 09 7d 0a 20 20 20 20 20  is = 0;..}.     
5cf0: 20 20 20 70 54 72 69 67 67 65 72 53 74 61 63 6b     pTriggerStack
5d00: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
5d10: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
5d20: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 3d 3d  .      if( op ==
5d30: 20 54 4b 5f 55 50 44 41 54 45 20 26 26 20 70 54   TK_UPDATE && pT
5d40: 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73  rigger->pColumns
5d50: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 21 63   &&.          !c
5d60: 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 4c 61  heckColumnOverLa
5d70: 70 28 70 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c  p(pTrigger->pCol
5d80: 75 6d 6e 73 2c 20 70 43 68 61 6e 67 65 73 29 20  umns, pChanges) 
5d90: 29 7b 0a 20 20 20 20 20 20 20 20 66 69 72 65 5f  ){.        fire_
5da0: 74 68 69 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  this = 0;.      
5db0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
5dc0: 20 66 69 72 65 5f 74 68 69 73 20 26 26 20 28 70   fire_this && (p
5dd0: 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20 73  TriggerStack = s
5de0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65  qliteMalloc(size
5df0: 6f 66 28 54 72 69 67 67 65 72 53 74 61 63 6b 29  of(TriggerStack)
5e00: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ))!=0 ){.      i
5e10: 6e 74 20 65 6e 64 54 72 69 67 67 65 72 3b 0a 20  nt endTrigger;. 
5e20: 20 20 20 20 20 53 72 63 4c 69 73 74 20 64 75 6d       SrcList dum
5e30: 6d 79 54 61 62 6c 69 73 74 3b 0a 20 20 20 20 20  myTablist;.     
5e40: 20 45 78 70 72 20 2a 20 77 68 65 6e 45 78 70 72   Expr * whenExpr
5e50: 3b 0a 20 20 20 20 20 20 41 75 74 68 43 6f 6e 74  ;.      AuthCont
5e60: 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 0a 0a 20  ext sContext;.. 
5e70: 20 20 20 20 20 64 75 6d 6d 79 54 61 62 6c 69 73       dummyTablis
5e80: 74 2e 6e 53 72 63 20 3d 20 30 3b 0a 0a 20 20 20  t.nSrc = 0;..   
5e90: 20 20 20 2f 2a 20 50 75 73 68 20 61 6e 20 65 6e     /* Push an en
5ea0: 74 72 79 20 6f 6e 20 74 6f 20 74 68 65 20 74 72  try on to the tr
5eb0: 69 67 67 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20  igger stack */. 
5ec0: 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74 61       pTriggerSta
5ed0: 63 6b 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70  ck->pTrigger = p
5ee0: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 70  Trigger;.      p
5ef0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
5f00: 77 49 64 78 20 3d 20 6e 65 77 49 64 78 3b 0a 20  wIdx = newIdx;. 
5f10: 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74 61       pTriggerSta
5f20: 63 6b 2d 3e 6f 6c 64 49 64 78 20 3d 20 6f 6c 64  ck->oldIdx = old
5f30: 49 64 78 3b 0a 20 20 20 20 20 20 70 54 72 69 67  Idx;.      pTrig
5f40: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 3d  gerStack->pTab =
5f50: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 70 54 72   pTab;.      pTr
5f60: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 4e 65 78  iggerStack->pNex
5f70: 74 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67  t = pParse->trig
5f80: 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 70 54 72  Stack;.      pTr
5f90: 69 67 67 65 72 53 74 61 63 6b 2d 3e 69 67 6e 6f  iggerStack->igno
5fa0: 72 65 4a 75 6d 70 20 3d 20 69 67 6e 6f 72 65 4a  reJump = ignoreJ
5fb0: 75 6d 70 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ump;.      pPars
5fc0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 70  e->trigStack = p
5fd0: 54 72 69 67 67 65 72 53 74 61 63 6b 3b 0a 20 20  TriggerStack;.  
5fe0: 20 20 20 20 73 71 6c 69 74 65 41 75 74 68 43 6f      sqliteAuthCo
5ff0: 6e 74 65 78 74 50 75 73 68 28 70 50 61 72 73 65  ntextPush(pParse
6000: 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70 54 72  , &sContext, pTr
6010: 69 67 67 65 72 2d 3e 6e 61 6d 65 29 3b 0a 0a 20  igger->name);.. 
6020: 20 20 20 20 20 2f 2a 20 63 6f 64 65 20 74 68 65       /* code the
6030: 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
6040: 20 20 20 20 20 20 65 6e 64 54 72 69 67 67 65 72        endTrigger
6050: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
6060: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 2d 3e 70  eLabel(pParse->p
6070: 56 64 62 65 29 3b 0a 20 20 20 20 20 20 77 68 65  Vdbe);.      whe
6080: 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78  nExpr = sqliteEx
6090: 70 72 44 75 70 28 70 54 72 69 67 67 65 72 2d 3e  prDup(pTrigger->
60a0: 70 57 68 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  pWhen);.      if
60b0: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
60c0: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 26  lveIds(pParse, &
60d0: 64 75 6d 6d 79 54 61 62 6c 69 73 74 2c 20 30 2c  dummyTablist, 0,
60e0: 20 77 68 65 6e 45 78 70 72 29 20 29 7b 0a 20 20   whenExpr) ){.  
60f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72        pParse->tr
6100: 69 67 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65  igStack = pParse
6110: 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 70 4e 65  ->trigStack->pNe
6120: 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  xt;.        sqli
6130: 74 65 46 72 65 65 28 70 54 72 69 67 67 65 72 53  teFree(pTriggerS
6140: 74 61 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  tack);.        s
6150: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
6160: 77 68 65 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  whenExpr);.     
6170: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
6180: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
6190: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
61a0: 72 73 65 2c 20 77 68 65 6e 45 78 70 72 2c 20 65  rse, whenExpr, e
61b0: 6e 64 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20  ndTrigger, 1);. 
61c0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
61d0: 65 6c 65 74 65 28 77 68 65 6e 45 78 70 72 29 3b  elete(whenExpr);
61e0: 0a 0a 20 20 20 20 20 20 63 6f 64 65 54 72 69 67  ..      codeTrig
61f0: 67 65 72 50 72 6f 67 72 61 6d 28 70 50 61 72 73  gerProgram(pPars
6200: 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 73 74 65  e, pTrigger->ste
6210: 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e 66 29 3b  p_list, orconf);
6220: 20 0a 0a 20 20 20 20 20 20 2f 2a 20 50 6f 70 20   ..      /* Pop 
6230: 74 68 65 20 65 6e 74 72 79 20 6f 66 66 20 74 68  the entry off th
6240: 65 20 74 72 69 67 67 65 72 20 73 74 61 63 6b 20  e trigger stack 
6250: 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  */.      pParse-
6260: 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 70 50 61  >trigStack = pPa
6270: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e  rse->trigStack->
6280: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
6290: 69 74 65 41 75 74 68 43 6f 6e 74 65 78 74 50 6f  iteAuthContextPo
62a0: 70 28 26 73 43 6f 6e 74 65 78 74 29 3b 0a 20 20  p(&sContext);.  
62b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
62c0: 54 72 69 67 67 65 72 53 74 61 63 6b 29 3b 0a 0a  TriggerStack);..
62d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
62e0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 70 50 61  ResolveLabel(pPa
62f0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 65 6e 64 54  rse->pVdbe, endT
6300: 72 69 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  rigger);.    }. 
6310: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
6320: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
6330: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
6340: 7d 0a                                            }.