/ Hex Artifact Content
Login

Artifact ce83e017b407d046e909d05373d7f8ee70f9f7f9:


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 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
09e0: 46 6c 61 67 20 0a 20 20 20 26 26 20 73 71 6c 69  Flag .   && sqli
09f0: 74 65 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  teFixInit(&sFix,
0a00: 20 70 50 61 72 73 65 2c 20 70 50 61 72 73 65 2d   pParse, pParse-
0a10: 3e 69 44 62 2c 20 22 74 72 69 67 67 65 72 22 2c  >iDb, "trigger",
0a20: 20 70 4e 61 6d 65 29 0a 20 20 20 26 26 20 73 71   pName).   && sq
0a30: 6c 69 74 65 46 69 78 53 72 63 4c 69 73 74 28 26  liteFixSrcList(&
0a40: 73 46 69 78 2c 20 70 54 61 62 6c 65 4e 61 6d 65  sFix, pTableName
0a50: 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ).  ){.    goto 
0a60: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
0a70: 0a 20 20 7d 0a 20 20 74 61 62 20 3d 20 73 71 6c  .  }.  tab = sql
0a80: 69 74 65 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  iteSrcListLookup
0a90: 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 4e  (pParse, pTableN
0aa0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 74 61 62  ame);.  if( !tab
0ab0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69   ){.    goto tri
0ac0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
0ad0: 7d 0a 20 20 69 44 62 20 3d 20 69 73 54 65 6d 70  }.  iDb = isTemp
0ae0: 20 3f 20 31 20 3a 20 74 61 62 2d 3e 69 44 62 3b   ? 1 : tab->iDb;
0af0: 0a 20 20 69 66 28 20 69 44 62 3e 3d 32 20 26 26  .  if( iDb>=2 &&
0b00: 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c   !pParse->initFl
0b10: 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ag ){.    sqlite
0b20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
0b30: 20 22 74 72 69 67 67 65 72 73 20 6d 61 79 20 6e   "triggers may n
0b40: 6f 74 20 62 65 20 61 64 64 65 64 20 74 6f 20 61  ot be added to a
0b50: 75 78 69 6c 69 61 72 79 20 22 0a 20 20 20 20 20  uxiliary ".     
0b60: 20 20 22 64 61 74 61 62 61 73 65 20 25 73 22 2c    "database %s",
0b70: 20 64 62 2d 3e 61 44 62 5b 74 61 62 2d 3e 69 44   db->aDb[tab->iD
0b80: 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b].zName);.    g
0b90: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
0ba0: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 7a 4e 61 6d  nup;.  }..  zNam
0bb0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
0bc0: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
0bd0: 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  e->n);.  sqliteD
0be0: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
0bf0: 20 69 66 28 20 73 71 6c 69 74 65 48 61 73 68 46   if( sqliteHashF
0c00: 69 6e 64 28 26 28 64 62 2d 3e 61 44 62 5b 69 44  ind(&(db->aDb[iD
0c10: 62 5d 2e 74 72 69 67 48 61 73 68 29 2c 20 7a 4e  b].trigHash), zN
0c20: 61 6d 65 2c 70 4e 61 6d 65 2d 3e 6e 2b 31 29 20  ame,pName->n+1) 
0c30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
0c40: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
0c50: 72 69 67 67 65 72 20 25 54 20 61 6c 72 65 61 64  rigger %T alread
0c60: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
0c70: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67  );.    goto trig
0c80: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
0c90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
0ca0: 4e 49 43 6d 70 28 74 61 62 2d 3e 7a 4e 61 6d 65  NICmp(tab->zName
0cb0: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
0cc0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0cd0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
0ce0: 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "cannot create 
0cf0: 74 72 69 67 67 65 72 20 6f 6e 20 73 79 73 74 65  trigger on syste
0d00: 6d 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 70  m table");.    p
0d10: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
0d20: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
0d30: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69  cleanup;.  }.  i
0d40: 66 28 20 74 61 62 2d 3e 70 53 65 6c 65 63 74 20  f( tab->pSelect 
0d50: 26 26 20 74 72 5f 74 6d 20 21 3d 20 54 4b 5f 49  && tr_tm != TK_I
0d60: 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73 71  NSTEAD ){.    sq
0d70: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
0d80: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65  rse, "cannot cre
0d90: 61 74 65 20 25 73 20 74 72 69 67 67 65 72 20 6f  ate %s trigger o
0da0: 6e 20 76 69 65 77 3a 20 25 53 22 2c 20 0a 20 20  n view: %S", .  
0db0: 20 20 20 20 20 20 28 74 72 5f 74 6d 20 3d 3d 20        (tr_tm == 
0dc0: 54 4b 5f 42 45 46 4f 52 45 29 3f 22 42 45 46 4f  TK_BEFORE)?"BEFO
0dd0: 52 45 22 3a 22 41 46 54 45 52 22 2c 20 70 54 61  RE":"AFTER", pTa
0de0: 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  bleName, 0);.   
0df0: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
0e00: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28  eanup;.  }.  if(
0e10: 20 21 74 61 62 2d 3e 70 53 65 6c 65 63 74 20 26   !tab->pSelect &
0e20: 26 20 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 49 4e  & tr_tm == TK_IN
0e30: 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73 71 6c  STEAD ){.    sql
0e40: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
0e50: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61  se, "cannot crea
0e60: 74 65 20 49 4e 53 54 45 41 44 20 4f 46 22 0a 20  te INSTEAD OF". 
0e70: 20 20 20 20 20 20 20 22 20 74 72 69 67 67 65 72         " trigger
0e80: 20 6f 6e 20 74 61 62 6c 65 3a 20 25 53 22 2c 20   on table: %S", 
0e90: 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a  pTableName, 0);.
0ea0: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
0eb0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 23 69  _cleanup;.  }.#i
0ec0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0ed0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
0ee0: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
0ef0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
0f00: 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 63 6f  _TRIGGER;.    co
0f10: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
0f20: 64 62 2d 3e 61 44 62 5b 74 61 62 2d 3e 69 44 62  db->aDb[tab->iDb
0f30: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
0f40: 73 74 20 63 68 61 72 20 2a 7a 44 62 54 72 69 67  st char *zDbTrig
0f50: 20 3d 20 69 73 54 65 6d 70 20 3f 20 64 62 2d 3e   = isTemp ? db->
0f60: 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3a 20 7a  aDb[1].zName : z
0f70: 44 62 3b 0a 20 20 20 20 69 66 28 20 74 61 62 2d  Db;.    if( tab-
0f80: 3e 69 44 62 3d 3d 31 20 7c 7c 20 69 73 54 65 6d  >iDb==1 || isTem
0f90: 70 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  p ) code = SQLIT
0fa0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52  E_CREATE_TEMP_TR
0fb0: 49 47 47 45 52 3b 0a 20 20 20 20 69 66 28 20 73  IGGER;.    if( s
0fc0: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
0fd0: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61  Parse, code, zNa
0fe0: 6d 65 2c 20 74 61 62 2d 3e 7a 4e 61 6d 65 2c 20  me, tab->zName, 
0ff0: 7a 44 62 54 72 69 67 29 20 29 7b 0a 20 20 20 20  zDbTrig) ){.    
1000: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
1010: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
1020: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
1030: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1040: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
1050: 45 4d 41 5f 54 41 42 4c 45 28 74 61 62 2d 3e 69  EMA_TABLE(tab->i
1060: 44 62 29 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Db), 0, zDb)){. 
1070: 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65       goto trigge
1080: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  r_cleanup;.    }
1090: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
10a0: 2a 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69  * INSTEAD OF tri
10b0: 67 67 65 72 73 20 63 61 6e 20 6f 6e 6c 79 20 61  ggers can only a
10c0: 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73 20 61  ppear on views a
10d0: 6e 64 20 42 45 47 49 4e 20 74 72 69 67 67 65 72  nd BEGIN trigger
10e0: 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 61 70  s.  ** cannot ap
10f0: 70 65 61 72 20 6f 6e 20 76 69 65 77 73 2e 20 20  pear on views.  
1100: 53 6f 20 77 65 20 6d 69 67 68 74 20 61 73 20 77  So we might as w
1110: 65 6c 6c 20 74 72 61 6e 73 6c 61 74 65 20 65 76  ell translate ev
1120: 65 72 79 0a 20 20 2a 2a 20 49 4e 53 54 45 41 44  ery.  ** INSTEAD
1130: 20 4f 46 20 74 72 69 67 67 65 72 20 69 6e 74 6f   OF trigger into
1140: 20 61 20 42 45 46 4f 52 45 20 74 72 69 67 67 65   a BEFORE trigge
1150: 72 2e 20 20 49 74 20 73 69 6d 70 6c 69 66 69 65  r.  It simplifie
1160: 73 20 63 6f 64 65 0a 20 20 2a 2a 20 65 6c 73 65  s code.  ** else
1170: 77 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  where..  */.  if
1180: 20 28 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 49 4e   (tr_tm == TK_IN
1190: 53 54 45 41 44 29 7b 0a 20 20 20 20 74 72 5f 74  STEAD){.    tr_t
11a0: 6d 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 0a 20  m = TK_BEFORE;. 
11b0: 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 74   }..  /* Build t
11c0: 68 65 20 54 72 69 67 67 65 72 20 6f 62 6a 65 63  he Trigger objec
11d0: 74 20 2a 2f 0a 20 20 6e 74 20 3d 20 28 54 72 69  t */.  nt = (Tri
11e0: 67 67 65 72 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  gger*)sqliteMall
11f0: 6f 63 28 73 69 7a 65 6f 66 28 54 72 69 67 67 65  oc(sizeof(Trigge
1200: 72 29 29 3b 0a 20 20 69 66 28 20 6e 74 3d 3d 30  r));.  if( nt==0
1210: 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f   ) goto trigger_
1220: 63 6c 65 61 6e 75 70 3b 0a 20 20 6e 74 2d 3e 6e  cleanup;.  nt->n
1230: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7a  ame = zName;.  z
1240: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 6e 74 2d 3e  Name = 0;.  nt->
1250: 74 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 53 74  table = sqliteSt
1260: 72 44 75 70 28 70 54 61 62 6c 65 4e 61 6d 65 2d  rDup(pTableName-
1270: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[0].zName);.  
1280: 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  if( sqlite_mallo
1290: 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  c_failed ) goto 
12a0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
12b0: 0a 20 20 6e 74 2d 3e 69 44 62 20 3d 20 69 44 62  .  nt->iDb = iDb
12c0: 3b 0a 20 20 6e 74 2d 3e 69 54 61 62 44 62 20 3d  ;.  nt->iTabDb =
12d0: 20 74 61 62 2d 3e 69 44 62 3b 0a 20 20 6e 74 2d   tab->iDb;.  nt-
12e0: 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 6e 74 2d 3e  >op = op;.  nt->
12f0: 74 72 5f 74 6d 20 3d 20 74 72 5f 74 6d 3b 0a 20  tr_tm = tr_tm;. 
1300: 20 6e 74 2d 3e 70 57 68 65 6e 20 3d 20 73 71 6c   nt->pWhen = sql
1310: 69 74 65 45 78 70 72 44 75 70 28 70 57 68 65 6e  iteExprDup(pWhen
1320: 29 3b 0a 20 20 6e 74 2d 3e 70 43 6f 6c 75 6d 6e  );.  nt->pColumn
1330: 73 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74  s = sqliteIdList
1340: 44 75 70 28 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20  Dup(pColumns);. 
1350: 20 6e 74 2d 3e 66 6f 72 65 61 63 68 20 3d 20 66   nt->foreach = f
1360: 6f 72 65 61 63 68 3b 0a 20 20 73 71 6c 69 74 65  oreach;.  sqlite
1370: 54 6f 6b 65 6e 43 6f 70 79 28 26 6e 74 2d 3e 6e  TokenCopy(&nt->n
1380: 61 6d 65 54 6f 6b 65 6e 2c 70 4e 61 6d 65 29 3b  ameToken,pName);
1390: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
13a0: 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 3d 3d  e->pNewTrigger==
13b0: 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  0 );.  pParse->p
13c0: 4e 65 77 54 72 69 67 67 65 72 20 3d 20 6e 74 3b  NewTrigger = nt;
13d0: 0a 0a 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  ..trigger_cleanu
13e0: 70 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  p:.  sqliteFree(
13f0: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
1400: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
1410: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  ableName);.  sql
1420: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
1430: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73 71 6c  pColumns);.  sql
1440: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 57  iteExprDelete(pW
1450: 68 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  hen);.}../*.** T
1460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1470: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c 20  alled after all 
1480: 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20 61  of the trigger a
1490: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
14a0: 20 70 61 72 73 65 64 0a 2a 2a 20 69 6e 20 6f 72   parsed.** in or
14b0: 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
14c0: 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62  the process of b
14d0: 75 69 6c 64 69 6e 67 20 74 68 65 20 74 72 69 67  uilding the trig
14e0: 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
14f0: 69 74 65 46 69 6e 69 73 68 54 72 69 67 67 65 72  iteFinishTrigger
1500: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1510: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
1520: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1530: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
1540: 70 53 74 65 70 4c 69 73 74 2c 20 2f 2a 20 54 68  pStepList, /* Th
1550: 65 20 74 72 69 67 67 65 72 65 64 20 70 72 6f 67  e triggered prog
1560: 72 61 6d 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ram */.  Token *
1570: 70 41 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  pAll            
1580: 20 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74 20 64   /* Token that d
1590: 65 73 63 72 69 62 65 73 20 74 68 65 20 63 6f 6d  escribes the com
15a0: 70 6c 65 74 65 20 43 52 45 41 54 45 20 54 52 49  plete CREATE TRI
15b0: 47 47 45 52 20 2a 2f 0a 29 7b 0a 20 20 54 72 69  GGER */.){.  Tri
15c0: 67 67 65 72 20 2a 6e 74 20 3d 20 30 3b 20 20 20  gger *nt = 0;   
15d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
15e0: 69 67 67 65 72 20 77 68 6f 73 65 20 63 6f 6e 73  igger whose cons
15f0: 74 72 75 63 74 69 6f 6e 20 69 73 20 66 69 6e 69  truction is fini
1600: 73 68 69 6e 67 20 75 70 20 2a 2f 0a 20 20 73 71  shing up */.  sq
1610: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
1620: 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
1630: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 44 62 46  atabase */.  DbF
1640: 69 78 65 72 20 73 46 69 78 3b 0a 0a 20 20 69 66  ixer sFix;..  if
1650: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1660: 7c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72  | pParse->pNewTr
1670: 69 67 67 65 72 3d 3d 30 20 29 20 67 6f 74 6f 20  igger==0 ) goto 
1680: 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c  triggerfinish_cl
1690: 65 61 6e 75 70 3b 0a 20 20 6e 74 20 3d 20 70 50  eanup;.  nt = pP
16a0: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
16b0: 72 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  r;.  pParse->pNe
16c0: 77 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20  wTrigger = 0;.  
16d0: 6e 74 2d 3e 73 74 65 70 5f 6c 69 73 74 20 3d 20  nt->step_list = 
16e0: 70 53 74 65 70 4c 69 73 74 3b 0a 20 20 77 68 69  pStepList;.  whi
16f0: 6c 65 28 20 70 53 74 65 70 4c 69 73 74 20 29 7b  le( pStepList ){
1700: 0a 20 20 20 20 70 53 74 65 70 4c 69 73 74 2d 3e  .    pStepList->
1710: 70 54 72 69 67 20 3d 20 6e 74 3b 0a 20 20 20 20  pTrig = nt;.    
1720: 70 53 74 65 70 4c 69 73 74 20 3d 20 70 53 74 65  pStepList = pSte
1730: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
1740: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 46 69  }.  if( sqliteFi
1750: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
1760: 72 73 65 2c 20 6e 74 2d 3e 69 44 62 2c 20 22 74  rse, nt->iDb, "t
1770: 72 69 67 67 65 72 22 2c 20 26 6e 74 2d 3e 6e 61  rigger", &nt->na
1780: 6d 65 54 6f 6b 65 6e 29 20 0a 20 20 20 20 20 20  meToken) .      
1790: 20 20 20 20 26 26 20 73 71 6c 69 74 65 46 69 78      && sqliteFix
17a0: 54 72 69 67 67 65 72 53 74 65 70 28 26 73 46 69  TriggerStep(&sFi
17b0: 78 2c 20 6e 74 2d 3e 73 74 65 70 5f 6c 69 73 74  x, nt->step_list
17c0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
17d0: 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61  iggerfinish_clea
17e0: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 69  nup;.  }..  /* i
17f0: 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69  f we are not ini
1800: 74 69 61 6c 69 7a 69 6e 67 2c 20 61 6e 64 20 74  tializing, and t
1810: 68 69 73 20 74 72 69 67 67 65 72 20 69 73 20 6e  his trigger is n
1820: 6f 74 20 6f 6e 20 61 20 54 45 4d 50 20 74 61 62  ot on a TEMP tab
1830: 6c 65 2c 20 0a 20 20 2a 2a 20 62 75 69 6c 64 20  le, .  ** build 
1840: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
1850: 72 20 65 6e 74 72 79 0a 20 20 2a 2f 0a 20 20 69  r entry.  */.  i
1860: 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  f( !pParse->init
1870: 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 74 61 74  Flag ){.    stat
1880: 69 63 20 56 64 62 65 4f 70 20 69 6e 73 65 72 74  ic VdbeOp insert
1890: 54 72 69 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Trig[] = {.     
18a0: 20 7b 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20   { OP_NewRecno, 
18b0: 20 20 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20    0, 0,  0      
18c0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f      },.      { O
18d0: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c  P_String,     0,
18e0: 20 30 2c 20 20 22 74 72 69 67 67 65 72 22 20 20   0,  "trigger"  
18f0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  },.      { OP_St
1900: 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20  ring,     0, 0, 
1910: 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 20 20   0          },  
1920: 2f 2a 20 32 3a 20 74 72 69 67 67 65 72 20 6e 61  /* 2: trigger na
1930: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50  me */.      { OP
1940: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
1950: 30 2c 20 20 30 20 20 20 20 20 20 20 20 20 20 7d  0,  0          }
1960: 2c 20 20 2f 2a 20 33 3a 20 74 61 62 6c 65 20 6e  ,  /* 3: table n
1970: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  ame */.      { O
1980: 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 30 2c  P_Integer,    0,
1990: 20 30 2c 20 20 30 20 20 20 20 20 20 20 20 20 20   0,  0          
19a0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  },.      { OP_St
19b0: 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20  ring,     0, 0, 
19c0: 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 20 20   0          },  
19d0: 2f 2a 20 35 3a 20 53 51 4c 20 2a 2f 0a 20 20 20  /* 5: SQL */.   
19e0: 20 20 20 7b 20 4f 50 5f 4d 61 6b 65 52 65 63 6f     { OP_MakeReco
19f0: 72 64 2c 20 35 2c 20 30 2c 20 20 30 20 20 20 20  rd, 5, 0,  0    
1a00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
1a10: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 20   OP_PutIntKey,  
1a20: 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20 20  0, 0,  0        
1a30: 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20    },.    };.    
1a40: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 56 64  int addr;.    Vd
1a50: 62 65 20 2a 76 3b 0a 0a 20 20 20 20 2f 2a 20 4d  be *v;..    /* M
1a60: 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ake an entry in 
1a70: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
1a80: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 76  r table */.    v
1a90: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
1aa0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
1ab0: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72  ( v==0 ) goto tr
1ac0: 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61  iggerfinish_clea
1ad0: 6e 75 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 42  nup;.    sqliteB
1ae0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1af0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29  on(pParse, 0, 0)
1b00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e  ;.    sqliteOpen
1b10: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 6e  MasterTable(v, n
1b20: 74 2d 3e 69 44 62 29 3b 0a 20 20 20 20 61 64 64  t->iDb);.    add
1b30: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
1b40: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
1b50: 53 69 7a 65 28 69 6e 73 65 72 74 54 72 69 67 29  Size(insertTrig)
1b60: 2c 20 69 6e 73 65 72 74 54 72 69 67 29 3b 0a 20  , insertTrig);. 
1b70: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
1b80: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2b 32 2c  ngeP3(v, addr+2,
1b90: 20 6e 74 2d 3e 6e 61 6d 65 2c 20 30 29 3b 20 0a   nt->name, 0); .
1ba0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
1bb0: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2b 33  angeP3(v, addr+3
1bc0: 2c 20 6e 74 2d 3e 74 61 62 6c 65 2c 20 30 29 3b  , nt->table, 0);
1bd0: 20 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65   .    sqliteVdbe
1be0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
1bf0: 2b 35 2c 20 70 41 6c 6c 2d 3e 7a 2c 20 70 41 6c  +5, pAll->z, pAl
1c00: 6c 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e  l->n);.    if( n
1c10: 74 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20  t->iDb==0 ){.   
1c20: 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43     sqliteChangeC
1c30: 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20  ookie(db, v);.  
1c40: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
1c50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
1c60: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
1c70: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
1c80: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
1c90: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
1ca0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
1cb0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
1cc0: 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49  .    sqliteHashI
1cd0: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 6e  nsert(&db->aDb[n
1ce0: 74 2d 3e 69 44 62 5d 2e 74 72 69 67 48 61 73 68  t->iDb].trigHash
1cf0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1d00: 20 20 20 20 20 20 20 20 6e 74 2d 3e 6e 61 6d 65          nt->name
1d10: 2c 20 73 74 72 6c 65 6e 28 6e 74 2d 3e 6e 61 6d  , strlen(nt->nam
1d20: 65 29 2b 31 2c 20 6e 74 29 3b 0a 20 20 20 20 70  e)+1, nt);.    p
1d30: 54 61 62 20 3d 20 73 71 6c 69 74 65 4c 6f 63 61  Tab = sqliteLoca
1d40: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
1d50: 6e 74 2d 3e 74 61 62 6c 65 2c 20 64 62 2d 3e 61  nt->table, db->a
1d60: 44 62 5b 6e 74 2d 3e 69 54 61 62 44 62 5d 2e 7a  Db[nt->iTabDb].z
1d70: 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Name);.    asser
1d80: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
1d90: 20 20 6e 74 2d 3e 70 4e 65 78 74 20 3d 20 70 54    nt->pNext = pT
1da0: 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20  ab->pTrigger;.  
1db0: 20 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72    pTab->pTrigger
1dc0: 20 3d 20 6e 74 3b 0a 20 20 20 20 6e 74 20 3d 20   = nt;.    nt = 
1dd0: 30 3b 0a 20 20 7d 0a 0a 74 72 69 67 67 65 72 66  0;.  }..triggerf
1de0: 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3a 0a 20  inish_cleanup:. 
1df0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 72 69   sqliteDeleteTri
1e00: 67 67 65 72 28 6e 74 29 3b 0a 20 20 73 71 6c 69  gger(nt);.  sqli
1e10: 74 65 44 65 6c 65 74 65 54 72 69 67 67 65 72 28  teDeleteTrigger(
1e20: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
1e30: 67 65 72 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ger);.  pParse->
1e40: 70 4e 65 77 54 72 69 67 67 65 72 20 3d 20 30 3b  pNewTrigger = 0;
1e50: 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54  .  sqliteDeleteT
1e60: 72 69 67 67 65 72 53 74 65 70 28 70 53 74 65 70  riggerStep(pStep
1e70: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1e80: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 61  Make a copy of a
1e90: 6c 6c 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66  ll components of
1ea0: 20 74 68 65 20 67 69 76 65 6e 20 74 72 69 67 67   the given trigg
1eb0: 65 72 20 73 74 65 70 2e 20 20 54 68 69 73 20 68  er step.  This h
1ec0: 61 73 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74  as.** the effect
1ed0: 20 6f 66 20 63 6f 70 79 69 6e 67 20 61 6c 6c 20   of copying all 
1ee0: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
1ef0: 75 65 73 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ues into memory 
1f00: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
1f10: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
1f20: 20 20 41 73 20 69 6e 69 74 69 61 6c 6c 79 20 63    As initially c
1f30: 72 65 61 74 65 64 2c 20 74 68 65 20 45 78 70 72  reated, the Expr
1f40: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 0a  .token.z values.
1f50: 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ** all point to 
1f60: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
1f70: 20 74 68 61 74 20 77 61 73 20 66 65 64 20 74 6f   that was fed to
1f80: 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 42 75   the parser.  Bu
1f90: 74 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67  t that.** string
1fa0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 20 2d 20   is ephemeral - 
1fb0: 69 74 20 77 69 6c 6c 20 67 6f 20 61 77 61 79 20  it will go away 
1fc0: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 73  as soon as the s
1fd0: 71 6c 69 74 65 5f 65 78 65 63 28 29 0a 2a 2a 20  qlite_exec().** 
1fe0: 63 61 6c 6c 20 74 68 61 74 20 73 74 61 72 74 65  call that starte
1ff0: 64 20 74 68 65 20 70 61 72 73 65 72 20 65 78 69  d the parser exi
2000: 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ts.  This routin
2010: 65 20 6d 61 6b 65 73 20 61 20 70 65 72 73 69 73  e makes a persis
2020: 74 65 6e 74 0a 2a 2a 20 63 6f 70 79 20 6f 66 20  tent.** copy of 
2030: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
2040: 65 6e 2e 7a 20 73 74 72 69 6e 67 73 20 73 6f 20  en.z strings so 
2050: 74 68 61 74 20 74 68 65 20 54 72 69 67 67 65 72  that the Trigger
2060: 53 74 65 70 20 73 74 72 75 63 74 75 72 65 0a 2a  Step structure.*
2070: 2a 20 77 69 6c 6c 20 62 65 20 76 61 6c 69 64 20  * will be valid 
2080: 65 76 65 6e 20 61 66 74 65 72 20 74 68 65 20 73  even after the s
2090: 71 6c 69 74 65 5f 65 78 65 63 28 29 20 63 61 6c  qlite_exec() cal
20a0: 6c 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74  l returns..*/.st
20b0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
20c0: 50 65 72 73 69 73 74 54 72 69 67 67 65 72 53 74  PersistTriggerSt
20d0: 65 70 28 54 72 69 67 67 65 72 53 74 65 70 20 2a  ep(TriggerStep *
20e0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 61 72  p){.  if( p->tar
20f0: 67 65 74 2e 7a 20 29 7b 0a 20 20 20 20 70 2d 3e  get.z ){.    p->
2100: 74 61 72 67 65 74 2e 7a 20 3d 20 73 71 6c 69 74  target.z = sqlit
2110: 65 53 74 72 4e 44 75 70 28 70 2d 3e 74 61 72 67  eStrNDup(p->targ
2120: 65 74 2e 7a 2c 20 70 2d 3e 74 61 72 67 65 74 2e  et.z, p->target.
2130: 6e 29 3b 0a 20 20 20 20 70 2d 3e 74 61 72 67 65  n);.    p->targe
2140: 74 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20  t.dyn = 1;.  }. 
2150: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20   if( p->pSelect 
2160: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
2170: 4e 65 77 20 3d 20 73 71 6c 69 74 65 53 65 6c 65  New = sqliteSele
2180: 63 74 44 75 70 28 70 2d 3e 70 53 65 6c 65 63 74  ctDup(p->pSelect
2190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c  );.    sqliteSel
21a0: 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65  ectDelete(p->pSe
21b0: 6c 65 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53  lect);.    p->pS
21c0: 65 6c 65 63 74 20 3d 20 70 4e 65 77 3b 0a 20 20  elect = pNew;.  
21d0: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  }.  if( p->pWher
21e0: 65 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  e ){.    Expr *p
21f0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70 72  New = sqliteExpr
2200: 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  Dup(p->pWhere);.
2210: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
2220: 6c 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b  lete(p->pWhere);
2230: 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
2240: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   pNew;.  }.  if(
2250: 20 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 29 7b   p->pExprList ){
2260: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
2270: 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70 72  New = sqliteExpr
2280: 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 78 70 72  ListDup(p->pExpr
2290: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
22a0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
22b0: 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b 0a 20  p->pExprList);. 
22c0: 20 20 20 70 2d 3e 70 45 78 70 72 4c 69 73 74 20     p->pExprList 
22d0: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66  = pNew;.  }.  if
22e0: 28 20 70 2d 3e 70 49 64 4c 69 73 74 20 29 7b 0a  ( p->pIdList ){.
22f0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77      IdList *pNew
2300: 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44   = sqliteIdListD
2310: 75 70 28 70 2d 3e 70 49 64 4c 69 73 74 29 3b 0a  up(p->pIdList);.
2320: 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74      sqliteIdList
2330: 44 65 6c 65 74 65 28 70 2d 3e 70 49 64 4c 69 73  Delete(p->pIdLis
2340: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 49 64 4c 69  t);.    p->pIdLi
2350: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  st = pNew;.  }.}
2360: 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 53  ../*.** Turn a S
2370: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2380: 28 74 68 61 74 20 74 68 65 20 70 53 65 6c 65 63  (that the pSelec
2390: 74 20 70 61 72 61 6d 65 74 65 72 20 70 6f 69 6e  t parameter poin
23a0: 74 73 20 74 6f 29 20 69 6e 74 6f 0a 2a 2a 20 61  ts to) into.** a
23b0: 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20 20   trigger step.  
23c0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
23d0: 20 74 6f 20 61 20 54 72 69 67 67 65 72 53 74 65   to a TriggerSte
23e0: 70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  p structure..**.
23f0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
2400: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
2410: 20 77 68 65 6e 20 69 74 20 66 69 6e 64 73 20 61   when it finds a
2420: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2430: 74 20 69 6e 0a 2a 2a 20 62 6f 64 79 20 6f 66 20  t in.** body of 
2440: 61 20 54 52 49 47 47 45 52 2e 20 20 0a 2a 2f 0a  a TRIGGER.  .*/.
2450: 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c  TriggerStep *sql
2460: 69 74 65 54 72 69 67 67 65 72 53 65 6c 65 63 74  iteTriggerSelect
2470: 53 74 65 70 28 53 65 6c 65 63 74 20 2a 70 53 65  Step(Select *pSe
2480: 6c 65 63 74 29 7b 0a 20 20 54 72 69 67 67 65 72  lect){.  Trigger
2490: 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74  Step *pTriggerSt
24a0: 65 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ep = sqliteMallo
24b0: 63 28 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72  c(sizeof(Trigger
24c0: 53 74 65 70 29 29 3b 0a 20 20 69 66 28 20 70 54  Step));.  if( pT
24d0: 72 69 67 67 65 72 53 74 65 70 3d 3d 30 20 29 20  riggerStep==0 ) 
24e0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 70 54 72  return 0;..  pTr
24f0: 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20  iggerStep->op = 
2500: 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 54 72  TK_SELECT;.  pTr
2510: 69 67 67 65 72 53 74 65 70 2d 3e 70 53 65 6c 65  iggerStep->pSele
2520: 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20  ct = pSelect;.  
2530: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 72  pTriggerStep->or
2540: 63 6f 6e 66 20 3d 20 4f 45 5f 44 65 66 61 75 6c  conf = OE_Defaul
2550: 74 3b 0a 20 20 73 71 6c 69 74 65 50 65 72 73 69  t;.  sqlitePersi
2560: 73 74 54 72 69 67 67 65 72 53 74 65 70 28 70 54  stTriggerStep(pT
2570: 72 69 67 67 65 72 53 74 65 70 29 3b 0a 0a 20 20  riggerStep);..  
2580: 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53  return pTriggerS
2590: 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75  tep;.}../*.** Bu
25a0: 69 6c 64 20 61 20 74 72 69 67 67 65 72 20 73 74  ild a trigger st
25b0: 65 70 20 6f 75 74 20 6f 66 20 61 6e 20 49 4e 53  ep out of an INS
25c0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ERT statement.  
25d0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25e0: 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 77 20 74  .** to the new t
25f0: 72 69 67 67 65 72 20 73 74 65 70 2e 0a 2a 2a 0a  rigger step..**.
2600: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
2610: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
2620: 20 77 68 65 6e 20 69 74 20 73 65 65 73 20 61 6e   when it sees an
2630: 20 49 4e 53 45 52 54 20 69 6e 73 69 64 65 20 74   INSERT inside t
2640: 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20  he.** body of a 
2650: 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72 69 67  trigger..*/.Trig
2660: 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 54  gerStep *sqliteT
2670: 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 65 70  riggerInsertStep
2680: 28 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  (.  Token *pTabl
2690: 65 4e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  eName,  /* Name 
26a0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  of the table int
26b0: 6f 20 77 68 69 63 68 20 77 65 20 69 6e 73 65 72  o which we inser
26c0: 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  t */.  IdList *p
26d0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20 4c 69  Column,    /* Li
26e0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
26f0: 20 70 54 61 62 6c 65 4e 61 6d 65 20 74 6f 20 69   pTableName to i
2700: 6e 73 65 72 74 20 69 6e 74 6f 20 2a 2f 0a 20 20  nsert into */.  
2710: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
2720: 2c 20 20 20 2f 2a 20 54 68 65 20 56 41 4c 55 45  ,   /* The VALUE
2730: 20 63 6c 61 75 73 65 3a 20 61 20 6c 69 73 74 20   clause: a list 
2740: 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  of values to be 
2750: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 53 65  inserted */.  Se
2760: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
2770: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
2780: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 73 75 70  atement that sup
2790: 70 6c 69 65 73 20 76 61 6c 75 65 73 20 2a 2f 0a  plies values */.
27a0: 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20    int orconf    
27b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
27c0: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20  flict algorithm 
27d0: 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 52 65  (OE_Abort, OE_Re
27e0: 70 6c 61 63 65 2c 20 65 74 63 2e 29 20 2a 2f 0a  place, etc.) */.
27f0: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
2800: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 20 3d   *pTriggerStep =
2810: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
2820: 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70  zeof(TriggerStep
2830: 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67  ));.  if( pTrigg
2840: 65 72 53 74 65 70 3d 3d 30 20 29 20 72 65 74 75  erStep==0 ) retu
2850: 72 6e 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28  rn 0;..  assert(
2860: 70 45 4c 69 73 74 20 3d 3d 20 30 20 7c 7c 20 70  pEList == 0 || p
2870: 53 65 6c 65 63 74 20 3d 3d 20 30 29 3b 0a 20 20  Select == 0);.  
2880: 61 73 73 65 72 74 28 70 45 4c 69 73 74 20 21 3d  assert(pEList !=
2890: 20 30 20 7c 7c 20 70 53 65 6c 65 63 74 20 21 3d   0 || pSelect !=
28a0: 20 30 29 3b 0a 0a 20 20 70 54 72 69 67 67 65 72   0);..  pTrigger
28b0: 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e  Step->op = TK_IN
28c0: 53 45 52 54 3b 0a 20 20 70 54 72 69 67 67 65 72  SERT;.  pTrigger
28d0: 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Step->pSelect = 
28e0: 70 53 65 6c 65 63 74 3b 0a 20 20 70 54 72 69 67  pSelect;.  pTrig
28f0: 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74 20  gerStep->target 
2900: 20 3d 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a   = *pTableName;.
2910: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
2920: 70 49 64 4c 69 73 74 20 3d 20 70 43 6f 6c 75 6d  pIdList = pColum
2930: 6e 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  n;.  pTriggerSte
2940: 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 70  p->pExprList = p
2950: 45 4c 69 73 74 3b 0a 20 20 70 54 72 69 67 67 65  EList;.  pTrigge
2960: 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20  rStep->orconf = 
2970: 6f 72 63 6f 6e 66 3b 0a 20 20 73 71 6c 69 74 65  orconf;.  sqlite
2980: 50 65 72 73 69 73 74 54 72 69 67 67 65 72 53 74  PersistTriggerSt
2990: 65 70 28 70 54 72 69 67 67 65 72 53 74 65 70 29  ep(pTriggerStep)
29a0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69  ;..  return pTri
29b0: 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a  ggerStep;.}../*.
29c0: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 74  ** Construct a t
29d0: 72 69 67 67 65 72 20 73 74 65 70 20 74 68 61 74  rigger step that
29e0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 55   implements an U
29f0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
2a00: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  and return.** a 
2a10: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
2a20: 74 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 54  trigger step.  T
2a30: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
2a40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
2a50: 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20 61 6e 20  n it.** sees an 
2a60: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
2a70: 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79   inside the body
2a80: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 52 49   of a CREATE TRI
2a90: 47 47 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65 72  GGER..*/.Trigger
2aa0: 53 74 65 70 20 2a 73 71 6c 69 74 65 54 72 69 67  Step *sqliteTrig
2ab0: 67 65 72 55 70 64 61 74 65 53 74 65 70 28 0a 20  gerUpdateStep(. 
2ac0: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
2ad0: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2ae0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
2af0: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 45 78   updated */.  Ex
2b00: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
2b10: 20 20 20 2f 2a 20 54 68 65 20 53 45 54 20 63 6c     /* The SET cl
2b20: 61 75 73 65 3a 20 6c 69 73 74 20 6f 66 20 63 6f  ause: list of co
2b30: 6c 75 6d 6e 20 61 6e 64 20 6e 65 77 20 76 61 6c  lumn and new val
2b40: 75 65 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ues */.  Expr *p
2b50: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 2f 2a  Where,        /*
2b60: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2b70: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e  e */.  int orcon
2b80: 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  f           /* T
2b90: 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  he conflict algo
2ba0: 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72 74  rithm. (OE_Abort
2bb0: 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63  , OE_Ignore, etc
2bc0: 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65  ) */.){.  Trigge
2bd0: 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53  rStep *pTriggerS
2be0: 74 65 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tep = sqliteMall
2bf0: 6f 63 28 73 69 7a 65 6f 66 28 54 72 69 67 67 65  oc(sizeof(Trigge
2c00: 72 53 74 65 70 29 29 3b 0a 20 20 69 66 28 20 70  rStep));.  if( p
2c10: 54 72 69 67 67 65 72 53 74 65 70 3d 3d 30 20 29  TriggerStep==0 )
2c20: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 70 54   return 0;..  pT
2c30: 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d  riggerStep->op =
2c40: 20 54 4b 5f 55 50 44 41 54 45 3b 0a 20 20 70 54   TK_UPDATE;.  pT
2c50: 72 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67  riggerStep->targ
2c60: 65 74 20 20 3d 20 2a 70 54 61 62 6c 65 4e 61 6d  et  = *pTableNam
2c70: 65 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  e;.  pTriggerSte
2c80: 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 70  p->pExprList = p
2c90: 45 4c 69 73 74 3b 0a 20 20 70 54 72 69 67 67 65  EList;.  pTrigge
2ca0: 72 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d 20  rStep->pWhere = 
2cb0: 70 57 68 65 72 65 3b 0a 20 20 70 54 72 69 67 67  pWhere;.  pTrigg
2cc0: 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d  erStep->orconf =
2cd0: 20 6f 72 63 6f 6e 66 3b 0a 20 20 73 71 6c 69 74   orconf;.  sqlit
2ce0: 65 50 65 72 73 69 73 74 54 72 69 67 67 65 72 53  ePersistTriggerS
2cf0: 74 65 70 28 70 54 72 69 67 67 65 72 53 74 65 70  tep(pTriggerStep
2d00: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 72  );..  return pTr
2d10: 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a  iggerStep;.}../*
2d20: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
2d30: 74 72 69 67 67 65 72 20 73 74 65 70 20 74 68 61  trigger step tha
2d40: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 44  t implements a D
2d50: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
2d60: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  and return.** a 
2d70: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
2d80: 74 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 54  trigger step.  T
2d90: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
2da0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
2db0: 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20 61 20 44  n it.** sees a D
2dc0: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
2dd0: 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79 20  inside the body 
2de0: 6f 66 20 61 20 43 52 45 41 54 45 20 54 52 49 47  of a CREATE TRIG
2df0: 47 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53  GER..*/.TriggerS
2e00: 74 65 70 20 2a 73 71 6c 69 74 65 54 72 69 67 67  tep *sqliteTrigg
2e10: 65 72 44 65 6c 65 74 65 53 74 65 70 28 54 6f 6b  erDeleteStep(Tok
2e20: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20  en *pTableName, 
2e30: 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20  Expr *pWhere){. 
2e40: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54   TriggerStep *pT
2e50: 72 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c  riggerStep = sql
2e60: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
2e70: 28 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a  (TriggerStep));.
2e80: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
2e90: 65 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ep==0 ) return 0
2ea0: 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  ;..  pTriggerSte
2eb0: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 44 45 4c 45 54  p->op = TK_DELET
2ec0: 45 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  E;.  pTriggerSte
2ed0: 70 2d 3e 74 61 72 67 65 74 20 20 3d 20 2a 70 54  p->target  = *pT
2ee0: 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 70 54 72 69  ableName;.  pTri
2ef0: 67 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65  ggerStep->pWhere
2f00: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 54 72   = pWhere;.  pTr
2f10: 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e  iggerStep->orcon
2f20: 66 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  f = OE_Default;.
2f30: 20 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54    sqlitePersistT
2f40: 72 69 67 67 65 72 53 74 65 70 28 70 54 72 69 67  riggerStep(pTrig
2f50: 67 65 72 53 74 65 70 29 3b 0a 0a 20 20 72 65 74  gerStep);..  ret
2f60: 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70  urn pTriggerStep
2f70: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 63 75  ;.}../* .** Recu
2f80: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
2f90: 20 54 72 69 67 67 65 72 20 73 74 72 75 63 74 75   Trigger structu
2fa0: 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  re.*/.void sqlit
2fb0: 65 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 54  eDeleteTrigger(T
2fc0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
2fd0: 29 7b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  ){.  if( pTrigge
2fe0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
2ff0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 72 69   sqliteDeleteTri
3000: 67 67 65 72 53 74 65 70 28 70 54 72 69 67 67 65  ggerStep(pTrigge
3010: 72 2d 3e 73 74 65 70 5f 6c 69 73 74 29 3b 0a 20  r->step_list);. 
3020: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 72 69   sqliteFree(pTri
3030: 67 67 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 73  gger->name);.  s
3040: 71 6c 69 74 65 46 72 65 65 28 70 54 72 69 67 67  qliteFree(pTrigg
3050: 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 73 71  er->table);.  sq
3060: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
3070: 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b  Trigger->pWhen);
3080: 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44  .  sqliteIdListD
3090: 65 6c 65 74 65 28 70 54 72 69 67 67 65 72 2d 3e  elete(pTrigger->
30a0: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 69 66 28  pColumns);.  if(
30b0: 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 54   pTrigger->nameT
30c0: 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74  oken.dyn ) sqlit
30d0: 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 54 72  eFree((char*)pTr
30e0: 69 67 67 65 72 2d 3e 6e 61 6d 65 54 6f 6b 65 6e  igger->nameToken
30f0: 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  .z);.  sqliteFre
3100: 65 28 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a  e(pTrigger);.}..
3110: 2f 2a 0a 20 2a 20 54 68 69 73 20 66 75 6e 63 74  /*. * This funct
3120: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
3130: 20 64 72 6f 70 20 61 20 74 72 69 67 67 65 72 20   drop a trigger 
3140: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
3150: 65 20 73 63 68 65 6d 61 2e 20 0a 20 2a 0a 20 2a  e schema. . *. *
3160: 20 54 68 69 73 20 6d 61 79 20 62 65 20 63 61 6c   This may be cal
3170: 6c 65 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f  led directly fro
3180: 6d 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64  m the parser and
3190: 20 74 68 65 72 65 66 6f 72 65 20 69 64 65 6e 74   therefore ident
31a0: 69 66 69 65 73 0a 20 2a 20 74 68 65 20 74 72 69  ifies. * the tri
31b0: 67 67 65 72 20 62 79 20 6e 61 6d 65 2e 20 20 54  gger by name.  T
31c0: 68 65 20 73 71 6c 69 74 65 44 72 6f 70 54 72 69  he sqliteDropTri
31d0: 67 67 65 72 50 74 72 28 29 20 72 6f 75 74 69 6e  ggerPtr() routin
31e0: 65 20 64 6f 65 73 20 74 68 65 0a 20 2a 20 73 61  e does the. * sa
31f0: 6d 65 20 6a 6f 62 20 61 73 20 74 68 69 73 20 72  me job as this r
3200: 6f 75 74 69 6e 65 20 65 78 63 65 70 74 20 69 74  outine except it
3210: 20 74 61 6b 65 20 61 20 73 70 6f 69 6e 74 65 72   take a spointer
3220: 20 74 6f 20 74 68 65 20 74 72 69 67 67 65 72 0a   to the trigger.
3230: 20 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68   * instead of th
3240: 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 2e 0a  e trigger name..
3250: 20 2a 0a 20 2a 20 4e 6f 74 65 20 74 68 61 74 20   *. * Note that 
3260: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
3270: 65 73 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  es not delete th
3280: 65 20 74 72 69 67 67 65 72 20 65 6e 74 69 72 65  e trigger entire
3290: 6c 79 2e 20 49 6e 73 74 65 61 64 20 69 74 0a 20  ly. Instead it. 
32a0: 2a 20 72 65 6d 6f 76 65 73 20 69 74 20 66 72 6f  * removes it fro
32b0: 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  m the internal s
32c0: 63 68 65 6d 61 20 61 6e 64 20 70 6c 61 63 65 73  chema and places
32d0: 20 69 74 20 69 6e 20 74 68 65 20 74 72 69 67 44   it in the trigD
32e0: 72 6f 70 20 68 61 73 68 20 0a 20 2a 20 74 61 62  rop hash . * tab
32f0: 6c 65 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74  le. This is so t
3300: 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72 20  hat the trigger 
3310: 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
3320: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
3330: 65 20 73 63 68 65 6d 61 0a 20 2a 20 69 66 20 74  e schema. * if t
3340: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
3350: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  s rolled back.. 
3360: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72  */.void sqliteDr
3370: 6f 70 54 72 69 67 67 65 72 28 50 61 72 73 65 20  opTrigger(Parse 
3380: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
3390: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 72 69 67   *pName){.  Trig
33a0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
33b0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
33c0: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e  char *zDb;.  con
33d0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
33e0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 73    int nName;.  s
33f0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
3400: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 73  se->db;..  if( s
3410: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
3420: 6c 65 64 20 29 20 67 6f 74 6f 20 64 72 6f 70 5f  led ) goto drop_
3430: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
3440: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
3450: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 7a  ->nSrc==1 );.  z
3460: 44 62 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  Db = pName->a[0]
3470: 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7a 4e  .zDatabase;.  zN
3480: 61 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30  ame = pName->a[0
3490: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 6e 4e 61 6d 65  ].zName;.  nName
34a0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
34b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
34c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
34d0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
34e0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
34f0: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
3500: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
3510: 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 53  ( zDb && sqliteS
3520: 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 6a  trICmp(db->aDb[j
3530: 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 20  ].zName, zDb) ) 
3540: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 54  continue;.    pT
3550: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 48  rigger = sqliteH
3560: 61 73 68 46 69 6e 64 28 26 28 64 62 2d 3e 61 44  ashFind(&(db->aD
3570: 62 5b 6a 5d 2e 74 72 69 67 48 61 73 68 29 2c 20  b[j].trigHash), 
3580: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b  zName, nName+1);
3590: 0a 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65  .    if( pTrigge
35a0: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  r ) break;.  }. 
35b0: 20 69 66 28 20 21 70 54 72 69 67 67 65 72 20 29   if( !pTrigger )
35c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
35d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
35e0: 20 73 75 63 68 20 74 72 69 67 67 65 72 3a 20 25   such trigger: %
35f0: 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
3600: 20 20 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69     goto drop_tri
3610: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
3620: 7d 0a 20 20 73 71 6c 69 74 65 44 72 6f 70 54 72  }.  sqliteDropTr
3630: 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
3640: 20 70 54 72 69 67 67 65 72 2c 20 30 29 3b 0a 0a   pTrigger, 0);..
3650: 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65  drop_trigger_cle
3660: 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 53 72  anup:.  sqliteSr
3670: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
3680: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f  e);.}../*.** Dro
3690: 70 20 61 20 74 72 69 67 67 65 72 20 67 69 76 65  p a trigger give
36a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
36b0: 68 61 74 20 74 72 69 67 67 65 72 2e 20 20 49 66  hat trigger.  If
36c0: 20 6e 65 73 74 65 64 20 69 73 20 66 61 6c 73 65   nested is false
36d0: 2c 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 67  ,.** then also g
36e0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
36f0: 72 65 6d 6f 76 65 20 74 68 65 20 74 72 69 67 67  remove the trigg
3700: 65 72 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49  er from the SQLI
3710: 54 45 5f 4d 41 53 54 45 52 0a 2a 2a 20 74 61 62  TE_MASTER.** tab
3720: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
3730: 74 65 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  teDropTriggerPtr
3740: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3750: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
3760: 72 2c 20 69 6e 74 20 6e 65 73 74 65 64 29 7b 0a  r, int nested){.
3770: 20 20 54 61 62 6c 65 20 20 20 2a 70 54 61 62 6c    Table   *pTabl
3780: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
3790: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
37a0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  rse->db;..  asse
37b0: 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69 44  rt( pTrigger->iD
37c0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 69  b<db->nDb );.  i
37d0: 66 28 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62  f( pTrigger->iDb
37e0: 3e 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=2 ){.    sqlit
37f0: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
3800: 2c 20 22 74 72 69 67 67 65 72 73 20 6d 61 79 20  , "triggers may 
3810: 6e 6f 74 20 62 65 20 72 65 6d 6f 76 65 64 20 66  not be removed f
3820: 72 6f 6d 20 22 0a 20 20 20 20 20 20 20 22 61 75  rom ".       "au
3830: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
3840: 20 25 73 22 2c 20 64 62 2d 3e 61 44 62 5b 70 54   %s", db->aDb[pT
3850: 72 69 67 67 65 72 2d 3e 69 44 62 5d 2e 7a 4e 61  rigger->iDb].zNa
3860: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
3870: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
3880: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
3890: 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61  db, pTrigger->ta
38a0: 62 6c 65 2c 64 62 2d 3e 61 44 62 5b 70 54 72 69  ble,db->aDb[pTri
38b0: 67 67 65 72 2d 3e 69 54 61 62 44 62 5d 2e 7a 4e  gger->iTabDb].zN
38c0: 61 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70  ame);.  assert(p
38d0: 54 61 62 6c 65 29 3b 0a 20 20 61 73 73 65 72 74  Table);.  assert
38e0: 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 70  ( pTable->iDb==p
38f0: 54 72 69 67 67 65 72 2d 3e 69 44 62 20 7c 7c 20  Trigger->iDb || 
3900: 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31  pTrigger->iDb==1
3910: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
3920: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
3930: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
3940: 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
3950: 44 52 4f 50 5f 54 52 49 47 47 45 52 3b 0a 20 20  DROP_TRIGGER;.  
3960: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
3970: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 72 69  b = db->aDb[pTri
3980: 67 67 65 72 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  gger->iDb].zName
3990: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
39a0: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
39b0: 54 41 42 4c 45 28 70 54 72 69 67 67 65 72 2d 3e  TABLE(pTrigger->
39c0: 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  iDb);.    if( pT
39d0: 72 69 67 67 65 72 2d 3e 69 44 62 20 29 20 63 6f  rigger->iDb ) co
39e0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
39f0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20  _TEMP_TRIGGER;. 
3a00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
3a10: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
3a20: 6f 64 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e  ode, pTrigger->n
3a30: 61 6d 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ame, pTable->zNa
3a40: 6d 65 2c 20 7a 44 62 29 20 7c 7c 0a 20 20 20 20  me, zDb) ||.    
3a50: 20 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63    sqliteAuthChec
3a60: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
3a70: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
3a80: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
3a90: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
3aa0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
3ab0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
3ac0: 64 65 73 74 72 6f 79 20 74 68 65 20 64 61 74 61  destroy the data
3ad0: 62 61 73 65 20 72 65 63 6f 72 64 20 6f 66 20 74  base record of t
3ae0: 68 65 20 74 72 69 67 67 65 72 2e 0a 20 20 2a 2f  he trigger..  */
3af0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30  .  if( pTable!=0
3b00: 20 26 26 20 21 6e 65 73 74 65 64 20 26 26 20 28   && !nested && (
3b10: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
3b20: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
3b30: 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20  .    int base;. 
3b40: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
3b50: 20 64 72 6f 70 54 72 69 67 67 65 72 5b 5d 20 3d   dropTrigger[] =
3b60: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65   {.      { OP_Re
3b70: 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44  wind,     0, ADD
3b80: 52 28 39 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20  R(9),  0},.     
3b90: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
3ba0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
3bb0: 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  }, /* 1 */.     
3bc0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
3bd0: 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20 30    0, 1,        0
3be0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
3bf0: 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44  ,         0, ADD
3c00: 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20  R(8),  0},.     
3c10: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
3c20: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22    0, 0,        "
3c30: 74 72 69 67 67 65 72 22 7d 2c 0a 20 20 20 20 20  trigger"},.     
3c40: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
3c50: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
3c60: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
3c70: 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44  ,         0, ADD
3c80: 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20  R(8),  0},.     
3c90: 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
3ca0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
3cb0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
3cc0: 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
3cd0: 52 28 31 29 2c 20 20 30 7d 2c 20 2f 2a 20 38 20  R(1),  0}, /* 8 
3ce0: 2a 2f 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 73  */.    };..    s
3cf0: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
3d00: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
3d10: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
3d20: 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  teOpenMasterTabl
3d30: 65 28 76 2c 20 70 54 72 69 67 67 65 72 2d 3e 69  e(v, pTrigger->i
3d40: 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20  Db);.    base = 
3d50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
3d60: 69 73 74 28 76 2c 20 20 41 72 72 61 79 53 69 7a  ist(v,  ArraySiz
3d70: 65 28 64 72 6f 70 54 72 69 67 67 65 72 29 2c 20  e(dropTrigger), 
3d80: 64 72 6f 70 54 72 69 67 67 65 72 29 3b 0a 20 20  dropTrigger);.  
3d90: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
3da0: 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20  geP3(v, base+1, 
3db0: 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 2c 20  pTrigger->name, 
3dc0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72 69  0);.    if( pTri
3dd0: 67 67 65 72 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a  gger->iDb==0 ){.
3de0: 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e        sqliteChan
3df0: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b  geCookie(db, v);
3e00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3e10: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3e20: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
3e30: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
3e40: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
3e50: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  e);.  }..  /*.  
3e60: 20 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f   * If this is no
3e70: 74 20 61 6e 20 22 65 78 70 6c 61 69 6e 22 2c 20  t an "explain", 
3e80: 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
3e90: 74 72 69 67 67 65 72 20 73 74 72 75 63 74 75 72  trigger structur
3ea0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21  e..   */.  if( !
3eb0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
3ec0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
3ed0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 72 69 67  r *zName = pTrig
3ee0: 67 65 72 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 69  ger->name;.    i
3ef0: 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65  nt nName = strle
3f00: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  n(zName);.    if
3f10: 28 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67  ( pTable->pTrigg
3f20: 65 72 20 3d 3d 20 70 54 72 69 67 67 65 72 20 29  er == pTrigger )
3f30: 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  {.      pTable->
3f40: 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
3f50: 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ger->pNext;.    
3f60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 72 69  }else{.      Tri
3f70: 67 67 65 72 20 2a 63 63 20 3d 20 70 54 61 62 6c  gger *cc = pTabl
3f80: 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  e->pTrigger;.   
3f90: 20 20 20 77 68 69 6c 65 28 20 63 63 20 29 7b 20     while( cc ){ 
3fa0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 63 2d  .        if( cc-
3fb0: 3e 70 4e 65 78 74 20 3d 3d 20 70 54 72 69 67 67  >pNext == pTrigg
3fc0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
3fd0: 63 63 2d 3e 70 4e 65 78 74 20 3d 20 63 63 2d 3e  cc->pNext = cc->
3fe0: 70 4e 65 78 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pNext->pNext;.  
3ff0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4000: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4010: 20 63 63 20 3d 20 63 63 2d 3e 70 4e 65 78 74 3b   cc = cc->pNext;
4020: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
4030: 73 73 65 72 74 28 63 63 29 3b 0a 20 20 20 20 7d  ssert(cc);.    }
4040: 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49  .    sqliteHashI
4050: 6e 73 65 72 74 28 26 28 64 62 2d 3e 61 44 62 5b  nsert(&(db->aDb[
4060: 70 54 72 69 67 67 65 72 2d 3e 69 44 62 5d 2e 74  pTrigger->iDb].t
4070: 72 69 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65 2c  rigHash), zName,
4080: 20 6e 4e 61 6d 65 2b 31 2c 20 30 29 3b 0a 20 20   nName+1, 0);.  
4090: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 72    sqliteDeleteTr
40a0: 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b  igger(pTrigger);
40b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  .  }.}../*.** pE
40c0: 4c 69 73 74 20 69 73 20 74 68 65 20 53 45 54 20  List is the SET 
40d0: 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44  clause of an UPD
40e0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ATE statement.  
40f0: 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a 20 69 6e  Each entry.** in
4100: 20 70 45 4c 69 73 74 20 69 73 20 6f 66 20 74 68   pEList is of th
4110: 65 20 66 6f 72 6d 61 74 20 3c 69 64 3e 3d 3c 65  e format <id>=<e
4120: 78 70 72 3e 2e 20 20 49 66 20 61 6e 79 20 6f 66  xpr>.  If any of
4130: 20 74 68 65 20 65 6e 74 72 69 65 73 0a 2a 2a 20   the entries.** 
4140: 69 6e 20 70 45 4c 69 73 74 20 68 61 76 65 20 61  in pEList have a
4150: 6e 20 3c 69 64 3e 20 77 68 69 63 68 20 6d 61 74  n <id> which mat
4160: 63 68 65 73 20 61 6e 20 69 64 65 6e 74 69 66 69  ches an identifi
4170: 65 72 20 69 6e 20 70 49 64 4c 69 73 74 2c 0a 2a  er in pIdList,.*
4180: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52  * then return TR
4190: 55 45 2e 20 20 49 66 20 70 49 64 4c 69 73 74 3d  UE.  If pIdList=
41a0: 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69  =NULL, then it i
41b0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 0a 2a  s considered a.*
41c0: 2a 20 77 69 6c 64 63 61 72 64 20 74 68 61 74 20  * wildcard that 
41d0: 6d 61 74 63 68 65 73 20 61 6e 79 74 68 69 6e 67  matches anything
41e0: 2e 20 20 4c 69 6b 65 77 69 73 65 20 69 66 20 70  .  Likewise if p
41f0: 45 4c 69 73 74 3d 3d 4e 55 4c 4c 20 74 68 65 6e  EList==NULL then
4200: 0a 2a 2a 20 69 74 20 6d 61 74 63 68 65 73 20 61  .** it matches a
4210: 6e 79 74 68 69 6e 67 20 73 6f 20 61 6c 77 61 79  nything so alway
4220: 73 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  s return true.  
4230: 52 65 74 75 72 6e 20 66 61 6c 73 65 20 6f 6e 6c  Return false onl
4240: 79 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  y.** if there is
4250: 20 6e 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74   no match..*/.st
4260: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 43 6f  atic int checkCo
4270: 6c 75 6d 6e 4f 76 65 72 4c 61 70 28 49 64 4c 69  lumnOverLap(IdLi
4280: 73 74 20 2a 70 49 64 4c 69 73 74 2c 20 45 78 70  st *pIdList, Exp
4290: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
42a0: 20 20 69 6e 74 20 65 3b 0a 20 20 69 66 28 20 21    int e;.  if( !
42b0: 70 49 64 4c 69 73 74 20 7c 7c 20 21 70 45 4c 69  pIdList || !pELi
42c0: 73 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  st ) return 1;. 
42d0: 20 66 6f 72 28 65 3d 30 3b 20 65 3c 70 45 4c 69   for(e=0; e<pELi
42e0: 73 74 2d 3e 6e 45 78 70 72 3b 20 65 2b 2b 29 7b  st->nExpr; e++){
42f0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 49  .    if( sqliteI
4300: 64 4c 69 73 74 49 6e 64 65 78 28 70 49 64 4c 69  dListIndex(pIdLi
4310: 73 74 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 65 5d  st, pEList->a[e]
4320: 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 20 72 65 74  .zName)>=0 ) ret
4330: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
4340: 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a 20 41 20  urn 0; .}../* A 
4350: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
4360: 74 68 61 74 20 69 73 20 54 52 55 45 20 69 66 20  that is TRUE if 
4370: 77 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  we should always
4380: 20 73 65 74 20 75 70 20 74 65 6d 70 20 74 61 62   set up temp tab
4390: 6c 65 73 20 66 6f 72 0a 20 2a 20 66 6f 72 20 74  les for. * for t
43a0: 72 69 67 67 65 72 73 2c 20 65 76 65 6e 20 69 66  riggers, even if
43b0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
43c0: 69 67 67 65 72 73 20 74 6f 20 63 6f 64 65 2e 20  iggers to code. 
43d0: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
43e0: 74 65 73 74 20 0a 20 2a 20 68 6f 77 20 6d 75 63  test . * how muc
43f0: 68 20 6f 76 65 72 68 65 61 64 20 74 68 65 20 74  h overhead the t
4400: 72 69 67 67 65 72 73 20 61 6c 67 6f 72 69 74 68  riggers algorith
4410: 6d 20 69 73 20 63 61 75 73 69 6e 67 2e 0a 20 2a  m is causing.. *
4420: 0a 20 2a 20 54 68 69 73 20 66 6c 61 67 20 63 61  . * This flag ca
4430: 6e 20 62 65 20 73 65 74 20 6f 72 20 63 6c 65 61  n be set or clea
4440: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 22 74  red using the "t
4450: 72 69 67 67 65 72 5f 6f 76 65 72 68 65 61 64 5f  rigger_overhead_
4460: 74 65 73 74 22 20 70 72 61 67 6d 61 2e 0a 20 2a  test" pragma.. *
4470: 20 54 68 65 20 70 72 61 67 6d 61 20 69 73 20 6e   The pragma is n
4480: 6f 74 20 64 6f 63 75 6d 65 6e 74 65 64 20 73 69  ot documented si
4490: 6e 63 65 20 69 74 20 69 73 20 6e 6f 74 20 72 65  nce it is not re
44a0: 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65  ally part of the
44b0: 20 69 6e 74 65 72 66 61 63 65 0a 20 2a 20 74 6f   interface. * to
44c0: 20 53 51 4c 69 74 65 2c 20 6a 75 73 74 20 74 68   SQLite, just th
44d0: 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65  e test procedure
44e0: 2e 0a 2a 2f 0a 69 6e 74 20 61 6c 77 61 79 73 5f  ..*/.int always_
44f0: 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74  code_trigger_set
4500: 75 70 20 3d 20 30 3b 0a 0a 2f 2a 0a 20 2a 20 52  up = 0;../*. * R
4510: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 61  eturns true if a
4520: 20 74 72 69 67 67 65 72 20 6d 61 74 63 68 69 6e   trigger matchin
4530: 67 20 6f 70 2c 20 74 72 5f 74 6d 20 61 6e 64 20  g op, tr_tm and 
4540: 66 6f 72 65 61 63 68 20 74 68 61 74 20 69 73 20  foreach that is 
4550: 4e 4f 54 20 61 6c 72 65 61 64 79 0a 20 2a 20 6f  NOT already. * o
4560: 6e 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  n the Parse obje
4570: 63 74 73 20 74 72 69 67 67 65 72 2d 73 74 61 63  cts trigger-stac
4580: 6b 20 28 74 6f 20 70 72 65 76 65 6e 74 20 72 65  k (to prevent re
4590: 63 75 72 73 69 76 65 20 74 72 69 67 67 65 72 20  cursive trigger 
45a0: 66 69 72 69 6e 67 29 20 69 73 0a 20 2a 20 66 6f  firing) is. * fo
45b0: 75 6e 64 20 69 6e 20 74 68 65 20 6c 69 73 74 20  und in the list 
45c0: 73 70 65 63 69 66 69 65 64 20 61 73 20 70 54 72  specified as pTr
45d0: 69 67 67 65 72 2e 0a 20 2a 2f 0a 69 6e 74 20 73  igger.. */.int s
45e0: 71 6c 69 74 65 54 72 69 67 67 65 72 73 45 78 69  qliteTriggersExi
45f0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
4600: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
4610: 20 55 73 65 64 20 74 6f 20 63 68 65 63 6b 20 66   Used to check f
4620: 6f 72 20 72 65 63 75 72 73 69 76 65 20 74 72 69  or recursive tri
4630: 67 67 65 72 73 20 2a 2f 0a 20 20 54 72 69 67 67  ggers */.  Trigg
4640: 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20 20  er *pTrigger,   
4650: 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
4660: 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
4670: 74 65 64 20 77 69 74 68 20 61 20 74 61 62 6c 65  ted with a table
4680: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
46a0: 20 6f 6e 65 20 6f 66 20 54 4b 5f 44 45 4c 45 54   one of TK_DELET
46b0: 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b  E, TK_INSERT, TK
46c0: 5f 55 50 44 41 54 45 20 2a 2f 0a 20 20 69 6e 74  _UPDATE */.  int
46d0: 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20 20   tr_tm,         
46e0: 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66 20 54       /* one of T
46f0: 4b 5f 42 45 46 4f 52 45 2c 20 54 4b 5f 41 46 54  K_BEFORE, TK_AFT
4700: 45 52 20 2a 2f 0a 20 20 69 6e 74 20 66 6f 72 65  ER */.  int fore
4710: 61 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ach,            
4720: 2f 2a 20 6f 6e 65 20 6f 66 20 54 4b 5f 52 4f 57  /* one of TK_ROW
4730: 20 6f 72 20 54 4b 5f 53 54 41 54 45 4d 45 4e 54   or TK_STATEMENT
4740: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4750: 70 43 68 61 6e 67 65 73 20 20 20 20 20 20 2f 2a  pChanges      /*
4760: 20 43 6f 6c 75 6d 6e 73 20 74 68 61 74 20 63 68   Columns that ch
4770: 61 6e 67 65 20 69 6e 20 61 6e 20 55 50 44 41 54  ange in an UPDAT
4780: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  E statement */.)
4790: 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 20 70 54  {.  Trigger * pT
47a0: 72 69 67 67 65 72 43 75 72 73 6f 72 3b 0a 0a 20  riggerCursor;.. 
47b0: 20 69 66 28 20 61 6c 77 61 79 73 5f 63 6f 64 65   if( always_code
47c0: 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70 20 29  _trigger_setup )
47d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
47e0: 20 20 7d 0a 0a 20 20 70 54 72 69 67 67 65 72 43    }..  pTriggerC
47f0: 75 72 73 6f 72 20 3d 20 70 54 72 69 67 67 65 72  ursor = pTrigger
4800: 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67  ;.  while( pTrig
4810: 67 65 72 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  gerCursor ){.   
4820: 20 69 66 28 20 70 54 72 69 67 67 65 72 43 75 72   if( pTriggerCur
4830: 73 6f 72 2d 3e 6f 70 20 3d 3d 20 6f 70 20 26 26  sor->op == op &&
4840: 20 0a 09 70 54 72 69 67 67 65 72 43 75 72 73 6f   ..pTriggerCurso
4850: 72 2d 3e 74 72 5f 74 6d 20 3d 3d 20 74 72 5f 74  r->tr_tm == tr_t
4860: 6d 20 26 26 20 0a 09 70 54 72 69 67 67 65 72 43  m && ..pTriggerC
4870: 75 72 73 6f 72 2d 3e 66 6f 72 65 61 63 68 20 3d  ursor->foreach =
4880: 3d 20 66 6f 72 65 61 63 68 20 26 26 0a 09 63 68  = foreach &&..ch
4890: 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 4c 61 70  eckColumnOverLap
48a0: 28 70 54 72 69 67 67 65 72 43 75 72 73 6f 72 2d  (pTriggerCursor-
48b0: 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70 43 68 61 6e  >pColumns, pChan
48c0: 67 65 73 29 20 29 7b 0a 20 20 20 20 20 20 54 72  ges) ){.      Tr
48d0: 69 67 67 65 72 53 74 61 63 6b 20 2a 20 73 73 3b  iggerStack * ss;
48e0: 0a 20 20 20 20 20 20 73 73 20 3d 20 70 50 61 72  .      ss = pPar
48f0: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20  se->trigStack;. 
4900: 20 20 20 20 20 77 68 69 6c 65 28 20 73 73 20 26       while( ss &
4910: 26 20 73 73 2d 3e 70 54 72 69 67 67 65 72 20 21  & ss->pTrigger !
4920: 3d 20 70 54 72 69 67 67 65 72 20 29 7b 0a 09 73  = pTrigger ){..s
4930: 73 20 3d 20 73 73 2d 3e 70 4e 65 78 74 3b 0a 20  s = ss->pNext;. 
4940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4950: 20 21 73 73 20 29 72 65 74 75 72 6e 20 31 3b 0a   !ss )return 1;.
4960: 20 20 20 20 7d 0a 20 20 20 20 70 54 72 69 67 67      }.    pTrigg
4970: 65 72 43 75 72 73 6f 72 20 3d 20 70 54 72 69 67  erCursor = pTrig
4980: 67 65 72 43 75 72 73 6f 72 2d 3e 70 4e 65 78 74  gerCursor->pNext
4990: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
49a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  0;.}../*.** Conv
49b0: 65 72 74 20 74 68 65 20 70 53 74 65 70 2d 3e 74  ert the pStep->t
49c0: 61 72 67 65 74 20 74 6f 6b 65 6e 20 69 6e 74 6f  arget token into
49d0: 20 61 20 53 72 63 4c 69 73 74 20 61 6e 64 20 72   a SrcList and r
49e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
49f0: 2a 2a 20 74 6f 20 74 68 61 74 20 53 72 63 4c 69  ** to that SrcLi
4a00: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  st..**.** This r
4a10: 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 73 70  outine adds a sp
4a20: 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20  ecific database 
4a30: 6e 61 6d 65 2c 20 69 66 20 6e 65 65 64 65 64 2c  name, if needed,
4a40: 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 77   to the target w
4a50: 68 65 6e 0a 2a 2a 20 66 6f 72 6d 69 6e 67 20 74  hen.** forming t
4a60: 68 65 20 53 72 63 4c 69 73 74 2e 20 20 54 68 69  he SrcList.  Thi
4a70: 73 20 70 72 65 76 65 6e 74 73 20 61 20 74 72 69  s prevents a tri
4a80: 67 67 65 72 20 69 6e 20 6f 6e 65 20 64 61 74 61  gger in one data
4a90: 62 61 73 65 20 66 72 6f 6d 0a 2a 2a 20 72 65 66  base from.** ref
4aa0: 65 72 72 69 6e 67 20 74 6f 20 61 20 74 61 72 67  erring to a targ
4ab0: 65 74 20 69 6e 20 61 6e 6f 74 68 65 72 20 64 61  et in another da
4ac0: 74 61 62 61 73 65 2e 20 20 41 6e 20 65 78 63 65  tabase.  An exce
4ad0: 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 74 68  ption is when th
4ae0: 65 0a 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20  e.** trigger is 
4af0: 69 6e 20 54 45 4d 50 20 69 6e 20 77 68 69 63 68  in TEMP in which
4b00: 20 63 61 73 65 20 69 74 20 63 61 6e 20 72 65 66   case it can ref
4b10: 65 72 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  er to any other 
4b20: 64 61 74 61 62 61 73 65 20 69 74 0a 2a 2a 20 77  database it.** w
4b30: 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ants..*/.static 
4b40: 53 72 63 4c 69 73 74 20 2a 74 61 72 67 65 74 53  SrcList *targetS
4b50: 72 63 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  rcList(.  Parse 
4b60: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
4b70: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
4b80: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67  ntext */.  Trigg
4b90: 65 72 53 74 65 70 20 2a 70 53 74 65 70 20 20 20  erStep *pStep   
4ba0: 2f 2a 20 54 68 65 20 74 72 69 67 67 65 72 20 63  /* The trigger c
4bb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
4bc0: 72 67 65 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  rget token */.){
4bd0: 0a 20 20 54 6f 6b 65 6e 20 73 44 62 3b 20 20 20  .  Token sDb;   
4be0: 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79          /* Dummy
4bf0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 74   database name t
4c00: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  oken */.  int iD
4c10: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
4c20: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
4c30: 61 74 61 62 61 73 65 20 74 6f 20 75 73 65 20 2a  atabase to use *
4c40: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
4c50: 63 3b 20 20 20 20 20 20 20 2f 2a 20 53 72 63 4c  c;       /* SrcL
4c60: 69 73 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  ist to be return
4c70: 65 64 20 2a 2f 0a 0a 20 20 69 44 62 20 3d 20 70  ed */..  iDb = p
4c80: 53 74 65 70 2d 3e 70 54 72 69 67 2d 3e 69 44 62  Step->pTrig->iDb
4c90: 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c  ;.  if( iDb==0 |
4ca0: 7c 20 69 44 62 3e 3d 32 20 29 7b 0a 20 20 20 20  | iDb>=2 ){.    
4cb0: 61 73 73 65 72 74 28 20 69 44 62 3c 70 50 61 72  assert( iDb<pPar
4cc0: 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  se->db->nDb );. 
4cd0: 20 20 20 73 44 62 2e 7a 20 3d 20 70 50 61 72 73     sDb.z = pPars
4ce0: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
4cf0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 44 62 2e 6e  zName;.    sDb.n
4d00: 20 3d 20 73 74 72 6c 65 6e 28 73 44 62 2e 7a 29   = strlen(sDb.z)
4d10: 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c  ;.    pSrc = sql
4d20: 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64  iteSrcListAppend
4d30: 28 30 2c 20 26 73 44 62 2c 20 26 70 53 74 65 70  (0, &sDb, &pStep
4d40: 2d 3e 74 61 72 67 65 74 29 3b 0a 20 20 7d 20 65  ->target);.  } e
4d50: 6c 73 65 20 7b 0a 20 20 20 20 70 53 72 63 20 3d  lse {.    pSrc =
4d60: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70   sqliteSrcListAp
4d70: 70 65 6e 64 28 30 2c 20 26 70 53 74 65 70 2d 3e  pend(0, &pStep->
4d80: 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 0a  target, 0);.  }.
4d90: 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d    return pSrc;.}
4da0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
4db0: 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 7a   VDBE code for z
4dc0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 74 61 74  ero or more stat
4dd0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 20 74 68  ements inside th
4de0: 65 20 62 6f 64 79 20 6f 66 20 61 0a 2a 2a 20 74  e body of a.** t
4df0: 72 69 67 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61  rigger.  .*/.sta
4e00: 74 69 63 20 69 6e 74 20 63 6f 64 65 54 72 69 67  tic int codeTrig
4e10: 67 65 72 50 72 6f 67 72 61 6d 28 0a 20 20 50 61  gerProgram(.  Pa
4e20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4e30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
4e40: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4e50: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
4e60: 70 53 74 65 70 4c 69 73 74 2c 20 20 20 2f 2a 20  pStepList,   /* 
4e70: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 6d 65 6e  List of statemen
4e80: 74 73 20 69 6e 73 69 64 65 20 74 68 65 20 74 72  ts inside the tr
4e90: 69 67 67 65 72 20 62 6f 64 79 20 2a 2f 0a 20 20  igger body */.  
4ea0: 69 6e 74 20 6f 72 63 6f 6e 66 69 6e 20 20 20 20  int orconfin    
4eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
4ec0: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e  flict algorithm.
4ed0: 20 28 4f 45 5f 41 62 6f 72 74 2c 20 65 74 63 29   (OE_Abort, etc)
4ee0: 20 2a 2f 20 20 0a 29 7b 0a 20 20 54 72 69 67 67   */  .){.  Trigg
4ef0: 65 72 53 74 65 70 20 2a 20 70 54 72 69 67 67 65  erStep * pTrigge
4f00: 72 53 74 65 70 20 3d 20 70 53 74 65 70 4c 69 73  rStep = pStepLis
4f10: 74 3b 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 3b  t;.  int orconf;
4f20: 0a 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67  ..  while( pTrig
4f30: 67 65 72 53 74 65 70 20 29 7b 0a 20 20 20 20 69  gerStep ){.    i
4f40: 6e 74 20 73 61 76 65 4e 54 61 62 20 3d 20 70 50  nt saveNTab = pP
4f50: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 0a 20 20  arse->nTab;. .  
4f60: 20 20 6f 72 63 6f 6e 66 20 3d 20 28 6f 72 63 6f    orconf = (orco
4f70: 6e 66 69 6e 20 3d 3d 20 4f 45 5f 44 65 66 61 75  nfin == OE_Defau
4f80: 6c 74 29 3f 70 54 72 69 67 67 65 72 53 74 65 70  lt)?pTriggerStep
4f90: 2d 3e 6f 72 63 6f 6e 66 3a 6f 72 63 6f 6e 66 69  ->orconf:orconfi
4fa0: 6e 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 74  n;.    pParse->t
4fb0: 72 69 67 53 74 61 63 6b 2d 3e 6f 72 63 6f 6e 66  rigStack->orconf
4fc0: 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 20 20 73   = orconf;.    s
4fd0: 77 69 74 63 68 28 20 70 54 72 69 67 67 65 72 53  witch( pTriggerS
4fe0: 74 65 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  tep->op ){.     
4ff0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
5000: 20 7b 0a 09 53 65 6c 65 63 74 20 2a 20 73 73 20   {..Select * ss 
5010: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75  = sqliteSelectDu
5020: 70 28 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  p(pTriggerStep->
5030: 70 53 65 6c 65 63 74 29 3b 09 09 20 20 0a 09 61  pSelect);..  ..a
5040: 73 73 65 72 74 28 73 73 29 3b 0a 09 61 73 73 65  ssert(ss);..asse
5050: 72 74 28 73 73 2d 3e 70 53 72 63 29 3b 0a 09 73  rt(ss->pSrc);..s
5060: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
5070: 73 65 2c 20 73 73 2c 20 53 52 54 5f 44 69 73 63  se, ss, SRT_Disc
5080: 61 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  ard, 0, 0, 0, 0)
5090: 3b 0a 09 73 71 6c 69 74 65 53 65 6c 65 63 74 44  ;..sqliteSelectD
50a0: 65 6c 65 74 65 28 73 73 29 3b 0a 09 62 72 65 61  elete(ss);..brea
50b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
50c0: 20 63 61 73 65 20 54 4b 5f 55 50 44 41 54 45 3a   case TK_UPDATE:
50d0: 20 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69   {.        SrcLi
50e0: 73 74 20 2a 70 53 72 63 3b 0a 20 20 20 20 20 20  st *pSrc;.      
50f0: 20 20 70 53 72 63 20 3d 20 74 61 72 67 65 74 53    pSrc = targetS
5100: 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  rcList(pParse, p
5110: 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a 20 20  TriggerStep);.  
5120: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5130: 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56  AddOp(pParse->pV
5140: 64 62 65 2c 20 4f 50 5f 4c 69 73 74 50 75 73 68  dbe, OP_ListPush
5150: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
5160: 20 73 71 6c 69 74 65 55 70 64 61 74 65 28 70 50   sqliteUpdate(pP
5170: 61 72 73 65 2c 20 70 53 72 63 2c 0a 09 09 73 71  arse, pSrc,...sq
5180: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
5190: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 45  pTriggerStep->pE
51a0: 78 70 72 4c 69 73 74 29 2c 20 0a 09 09 73 71 6c  xprList), ...sql
51b0: 69 74 65 45 78 70 72 44 75 70 28 70 54 72 69 67  iteExprDup(pTrig
51c0: 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65 29  gerStep->pWhere)
51d0: 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 20 20 20  , orconf);.     
51e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
51f0: 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  Op(pParse->pVdbe
5200: 2c 20 4f 50 5f 4c 69 73 74 50 6f 70 2c 20 30 2c  , OP_ListPop, 0,
5210: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
5220: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5230: 20 20 63 61 73 65 20 54 4b 5f 49 4e 53 45 52 54    case TK_INSERT
5240: 3a 20 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c  : {.        SrcL
5250: 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 20 20 20  ist *pSrc;.     
5260: 20 20 20 70 53 72 63 20 3d 20 74 61 72 67 65 74     pSrc = target
5270: 53 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20  SrcList(pParse, 
5280: 70 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a 20  pTriggerStep);. 
5290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 49 6e 73         sqliteIns
52a0: 65 72 74 28 70 50 61 72 73 65 2c 20 70 53 72 63  ert(pParse, pSrc
52b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
52c0: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 54  teExprListDup(pT
52d0: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70  riggerStep->pExp
52e0: 72 4c 69 73 74 29 2c 20 0a 20 20 20 20 20 20 20  rList), .       
52f0: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
5300: 75 70 28 70 54 72 69 67 67 65 72 53 74 65 70 2d  up(pTriggerStep-
5310: 3e 70 53 65 6c 65 63 74 29 2c 20 0a 20 20 20 20  >pSelect), .    
5320: 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69        sqliteIdLi
5330: 73 74 44 75 70 28 70 54 72 69 67 67 65 72 53 74  stDup(pTriggerSt
5340: 65 70 2d 3e 70 49 64 4c 69 73 74 29 2c 20 6f 72  ep->pIdList), or
5350: 63 6f 6e 66 29 3b 0a 20 20 20 20 20 20 20 20 62  conf);.        b
5360: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5370: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 45 4c 45      case TK_DELE
5380: 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 53 72  TE: {.        Sr
5390: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 20  cList *pSrc;.   
53a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
53b0: 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64  ddOp(pParse->pVd
53c0: 62 65 2c 20 4f 50 5f 4c 69 73 74 50 75 73 68 2c  be, OP_ListPush,
53d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
53e0: 70 53 72 63 20 3d 20 74 61 72 67 65 74 53 72 63  pSrc = targetSrc
53f0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 72  List(pParse, pTr
5400: 69 67 67 65 72 53 74 65 70 29 3b 0a 20 20 20 20  iggerStep);.    
5410: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
5420: 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 70 53 72  From(pParse, pSr
5430: 63 2c 20 73 71 6c 69 74 65 45 78 70 72 44 75 70  c, sqliteExprDup
5440: 28 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70  (pTriggerStep->p
5450: 57 68 65 72 65 29 29 3b 0a 20 20 20 20 20 20 20  Where));.       
5460: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5470: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
5480: 4f 50 5f 4c 69 73 74 50 6f 70 2c 20 30 2c 20 30  OP_ListPop, 0, 0
5490: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
54a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
54b0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
54c0: 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
54d0: 7d 20 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  } .    pParse->n
54e0: 54 61 62 20 3d 20 73 61 76 65 4e 54 61 62 3b 0a  Tab = saveNTab;.
54f0: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
5500: 20 3d 20 70 54 72 69 67 67 65 72 53 74 65 70 2d   = pTriggerStep-
5510: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72  >pNext;.  }..  r
5520: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5530: 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
5540: 20 74 6f 20 63 6f 64 65 20 46 4f 52 20 45 41 43   to code FOR EAC
5550: 48 20 52 4f 57 20 74 72 69 67 67 65 72 73 2e 0a  H ROW triggers..
5560: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 63  **.** When the c
5570: 6f 64 65 20 74 68 61 74 20 74 68 69 73 20 66 75  ode that this fu
5580: 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73  nction generates
5590: 20 69 73 20 65 78 65 63 75 74 65 64 2c 20 74 68   is executed, th
55a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  e following .** 
55b0: 6d 75 73 74 20 62 65 20 74 72 75 65 3a 0a 2a 2a  must be true:.**
55c0: 0a 2a 2a 20 31 2e 20 4e 6f 20 63 75 72 73 6f 72  .** 1. No cursor
55d0: 73 20 6d 61 79 20 62 65 20 6f 70 65 6e 20 69 6e  s may be open in
55e0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
55f0: 73 65 2e 20 20 28 42 75 74 20 6e 65 77 49 64 78  se.  (But newIdx
5600: 20 61 6e 64 20 6f 6c 64 49 64 78 0a 2a 2a 20 20   and oldIdx.**  
5610: 20 20 63 61 6e 20 62 65 20 69 6e 64 69 63 65 73    can be indices
5620: 20 6f 66 20 63 75 72 73 6f 72 73 20 69 6e 20 74   of cursors in t
5630: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
5640: 20 20 53 65 65 20 62 65 6c 6f 77 2e 29 0a 2a 2a    See below.).**
5650: 0a 2a 2a 20 32 2e 20 49 66 20 74 68 65 20 74 72  .** 2. If the tr
5660: 69 67 67 65 72 73 20 62 65 69 6e 67 20 63 6f 64  iggers being cod
5670: 65 64 20 61 72 65 20 4f 4e 20 49 4e 53 45 52 54  ed are ON INSERT
5680: 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20 74 72   or ON UPDATE tr
5690: 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a 2a 20  iggers, then.** 
56a0: 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79 20 76     a temporary v
56b0: 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e 64 65  dbe cursor (inde
56c0: 78 20 6e 65 77 49 64 78 29 20 6d 75 73 74 20 62  x newIdx) must b
56d0: 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69 6e 74  e open and point
56e0: 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61 20 72  ing at.**    a r
56f0: 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  ow containing va
5700: 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62 73 74  lues to be subst
5710: 69 74 75 74 65 64 20 66 6f 72 20 6e 65 77 2e 2a  ituted for new.*
5720: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
5730: 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67 67 65  the.**    trigge
5740: 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a 2a 2a  r program(s)..**
5750: 0a 2a 2a 20 33 2e 20 49 66 20 74 68 65 20 74 72  .** 3. If the tr
5760: 69 67 67 65 72 73 20 62 65 69 6e 67 20 63 6f 64  iggers being cod
5770: 65 64 20 61 72 65 20 4f 4e 20 44 45 4c 45 54 45  ed are ON DELETE
5780: 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20 74 72   or ON UPDATE tr
5790: 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a 2a 20  iggers, then.** 
57a0: 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79 20 76     a temporary v
57b0: 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e 64 65  dbe cursor (inde
57c0: 78 20 6f 6c 64 49 64 78 29 20 6d 75 73 74 20 62  x oldIdx) must b
57d0: 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69 6e 74  e open and point
57e0: 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61 20 72  ing at.**    a r
57f0: 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  ow containing va
5800: 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62 73 74  lues to be subst
5810: 69 74 75 74 65 64 20 66 6f 72 20 6f 6c 64 2e 2a  ituted for old.*
5820: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
5830: 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67 67 65  the.**    trigge
5840: 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a 2a 2a  r program(s)..**
5850: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 43 6f  .*/.int sqliteCo
5860: 64 65 52 6f 77 54 72 69 67 67 65 72 28 0a 20 20  deRowTrigger(.  
5870: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5880: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
5890: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
58a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
58b0: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 50 44  /* One of TK_UPD
58c0: 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20  ATE, TK_INSERT, 
58d0: 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 45  TK_DELETE */.  E
58e0: 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65  xprList *pChange
58f0: 73 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 6c  s,  /* Changes l
5900: 69 73 74 20 66 6f 72 20 61 6e 79 20 55 50 44 41  ist for any UPDA
5910: 54 45 20 4f 46 20 74 72 69 67 67 65 72 73 20 2a  TE OF triggers *
5920: 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20  /.  int tr_tm,  
5930: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
5940: 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b  of TK_BEFORE, TK
5950: 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54 61 62 6c  _AFTER */.  Tabl
5960: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
5970: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f   /* The table to
5980: 20 63 6f 64 65 20 74 72 69 67 67 65 72 73 20 66   code triggers f
5990: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77  rom */.  int new
59a0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx,          /*
59b0: 20 54 68 65 20 69 6e 64 69 63 65 20 6f 66 20 74   The indice of t
59c0: 68 65 20 22 6e 65 77 22 20 72 6f 77 20 74 6f 20  he "new" row to 
59d0: 61 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  access */.  int 
59e0: 6f 6c 64 49 64 78 2c 20 20 20 20 20 20 20 20 20  oldIdx,         
59f0: 20 2f 2a 20 54 68 65 20 69 6e 64 69 63 65 20 6f   /* The indice o
5a00: 66 20 74 68 65 20 22 6f 6c 64 22 20 72 6f 77 20  f the "old" row 
5a10: 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 69  to access */.  i
5a20: 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20 20 20 20  nt orconf,      
5a30: 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49      /* ON CONFLI
5a40: 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 20 20 69  CT policy */.  i
5a50: 6e 74 20 69 67 6e 6f 72 65 4a 75 6d 70 20 20 20  nt ignoreJump   
5a60: 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
5a70: 6f 6e 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f  on to jump to fo
5a80: 72 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29 20  r RAISE(IGNORE) 
5a90: 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 20  */.){.  Trigger 
5aa0: 2a 20 70 54 72 69 67 67 65 72 3b 0a 20 20 54 72  * pTrigger;.  Tr
5ab0: 69 67 67 65 72 53 74 61 63 6b 20 2a 20 70 54 72  iggerStack * pTr
5ac0: 69 67 67 65 72 53 74 61 63 6b 3b 0a 0a 20 20 61  iggerStack;..  a
5ad0: 73 73 65 72 74 28 6f 70 20 3d 3d 20 54 4b 5f 55  ssert(op == TK_U
5ae0: 50 44 41 54 45 20 7c 7c 20 6f 70 20 3d 3d 20 54  PDATE || op == T
5af0: 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 20 3d  K_INSERT || op =
5b00: 3d 20 54 4b 5f 44 45 4c 45 54 45 29 3b 0a 20 20  = TK_DELETE);.  
5b10: 61 73 73 65 72 74 28 74 72 5f 74 6d 20 3d 3d 20  assert(tr_tm == 
5b20: 54 4b 5f 42 45 46 4f 52 45 20 7c 7c 20 74 72 5f  TK_BEFORE || tr_
5b30: 74 6d 20 3d 3d 20 54 4b 5f 41 46 54 45 52 20 29  tm == TK_AFTER )
5b40: 3b 0a 0a 20 20 61 73 73 65 72 74 28 6e 65 77 49  ;..  assert(newI
5b50: 64 78 20 21 3d 20 2d 31 20 7c 7c 20 6f 6c 64 49  dx != -1 || oldI
5b60: 64 78 20 21 3d 20 2d 31 29 3b 0a 0a 20 20 70 54  dx != -1);..  pT
5b70: 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70  rigger = pTab->p
5b80: 54 72 69 67 67 65 72 3b 0a 20 20 77 68 69 6c 65  Trigger;.  while
5b90: 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
5ba0: 20 20 69 6e 74 20 66 69 72 65 5f 74 68 69 73 20    int fire_this 
5bb0: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 64 65 74  = 0;..    /* det
5bc0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 77  ermine whether w
5bd0: 65 20 73 68 6f 75 6c 64 20 63 6f 64 65 20 74 68  e should code th
5be0: 69 73 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20  is trigger */.  
5bf0: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e    if( pTrigger->
5c00: 6f 70 20 3d 3d 20 6f 70 20 26 26 20 70 54 72 69  op == op && pTri
5c10: 67 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 3d 20 74  gger->tr_tm == t
5c20: 72 5f 74 6d 20 26 26 20 0a 20 20 20 20 20 20 20  r_tm && .       
5c30: 20 70 54 72 69 67 67 65 72 2d 3e 66 6f 72 65 61   pTrigger->forea
5c40: 63 68 20 3d 3d 20 54 4b 5f 52 4f 57 20 29 7b 0a  ch == TK_ROW ){.
5c50: 20 20 20 20 20 20 66 69 72 65 5f 74 68 69 73 20        fire_this 
5c60: 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 72 69 67  = 1;.      pTrig
5c70: 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73  gerStack = pPars
5c80: 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20  e->trigStack;.  
5c90: 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
5ca0: 67 65 72 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  gerStack ){.    
5cb0: 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72      if( pTrigger
5cc0: 53 74 61 63 6b 2d 3e 70 54 72 69 67 67 65 72 20  Stack->pTrigger 
5cd0: 3d 3d 20 70 54 72 69 67 67 65 72 20 29 7b 0a 09  == pTrigger ){..
5ce0: 20 20 66 69 72 65 5f 74 68 69 73 20 3d 20 30 3b    fire_this = 0;
5cf0: 0a 09 7d 0a 20 20 20 20 20 20 20 20 70 54 72 69  ..}.        pTri
5d00: 67 67 65 72 53 74 61 63 6b 20 3d 20 70 54 72 69  ggerStack = pTri
5d10: 67 67 65 72 53 74 61 63 6b 2d 3e 70 4e 65 78 74  ggerStack->pNext
5d20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5d30: 69 66 28 20 6f 70 20 3d 3d 20 54 4b 5f 55 50 44  if( op == TK_UPD
5d40: 41 54 45 20 26 26 20 70 54 72 69 67 67 65 72 2d  ATE && pTrigger-
5d50: 3e 70 43 6f 6c 75 6d 6e 73 20 26 26 0a 20 20 20  >pColumns &&.   
5d60: 20 20 20 20 20 20 20 21 63 68 65 63 6b 43 6f 6c         !checkCol
5d70: 75 6d 6e 4f 76 65 72 4c 61 70 28 70 54 72 69 67  umnOverLap(pTrig
5d80: 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70  ger->pColumns, p
5d90: 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20 20  Changes) ){.    
5da0: 20 20 20 20 66 69 72 65 5f 74 68 69 73 20 3d 20      fire_this = 
5db0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
5dc0: 0a 0a 20 20 20 20 69 66 28 20 66 69 72 65 5f 74  ..    if( fire_t
5dd0: 68 69 73 20 26 26 20 28 70 54 72 69 67 67 65 72  his && (pTrigger
5de0: 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 4d 61  Stack = sqliteMa
5df0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69 67  lloc(sizeof(Trig
5e00: 67 65 72 53 74 61 63 6b 29 29 29 21 3d 30 20 29  gerStack)))!=0 )
5e10: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 54  {.      int endT
5e20: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 53 72  rigger;.      Sr
5e30: 63 4c 69 73 74 20 64 75 6d 6d 79 54 61 62 6c 69  cList dummyTabli
5e40: 73 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  st;.      Expr *
5e50: 20 77 68 65 6e 45 78 70 72 3b 0a 20 20 20 20 20   whenExpr;.     
5e60: 20 41 75 74 68 43 6f 6e 74 65 78 74 20 73 43 6f   AuthContext sCo
5e70: 6e 74 65 78 74 3b 0a 0a 20 20 20 20 20 20 64 75  ntext;..      du
5e80: 6d 6d 79 54 61 62 6c 69 73 74 2e 6e 53 72 63 20  mmyTablist.nSrc 
5e90: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 50  = 0;..      /* P
5ea0: 75 73 68 20 61 6e 20 65 6e 74 72 79 20 6f 6e 20  ush an entry on 
5eb0: 74 6f 20 74 68 65 20 74 72 69 67 67 65 72 20 73  to the trigger s
5ec0: 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 70 54  tack */.      pT
5ed0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 72  riggerStack->pTr
5ee0: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
5ef0: 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
5f00: 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 3d 20  Stack->newIdx = 
5f10: 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20 70 54  newIdx;.      pT
5f20: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
5f30: 49 64 78 20 3d 20 6f 6c 64 49 64 78 3b 0a 20 20  Idx = oldIdx;.  
5f40: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 61 63      pTriggerStac
5f50: 6b 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  k->pTab = pTab;.
5f60: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74        pTriggerSt
5f70: 61 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61  ack->pNext = pPa
5f80: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a  rse->trigStack;.
5f90: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74        pTriggerSt
5fa0: 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 20  ack->ignoreJump 
5fb0: 3d 20 69 67 6e 6f 72 65 4a 75 6d 70 3b 0a 20 20  = ignoreJump;.  
5fc0: 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72 69 67      pParse->trig
5fd0: 53 74 61 63 6b 20 3d 20 70 54 72 69 67 67 65 72  Stack = pTrigger
5fe0: 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 73 71 6c  Stack;.      sql
5ff0: 69 74 65 41 75 74 68 43 6f 6e 74 65 78 74 50 75  iteAuthContextPu
6000: 73 68 28 70 50 61 72 73 65 2c 20 26 73 43 6f 6e  sh(pParse, &sCon
6010: 74 65 78 74 2c 20 70 54 72 69 67 67 65 72 2d 3e  text, pTrigger->
6020: 6e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  name);..      /*
6030: 20 63 6f 64 65 20 74 68 65 20 57 48 45 4e 20 63   code the WHEN c
6040: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 65  lause */.      e
6050: 6e 64 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69  ndTrigger = sqli
6060: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
6070: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 29 3b 0a  pParse->pVdbe);.
6080: 20 20 20 20 20 20 77 68 65 6e 45 78 70 72 20 3d        whenExpr =
6090: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
60a0: 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b  Trigger->pWhen);
60b0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
60c0: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
60d0: 70 50 61 72 73 65 2c 20 26 64 75 6d 6d 79 54 61  pParse, &dummyTa
60e0: 62 6c 69 73 74 2c 20 30 2c 20 77 68 65 6e 45 78  blist, 0, whenEx
60f0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pr) ){.        p
6100: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
6110: 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53   = pParse->trigS
6120: 74 61 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  tack->pNext;.   
6130: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
6140: 70 54 72 69 67 67 65 72 53 74 61 63 6b 29 3b 0a  pTriggerStack);.
6150: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
6160: 70 72 44 65 6c 65 74 65 28 77 68 65 6e 45 78 70  prDelete(whenExp
6170: 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
6180: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
6190: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
61a0: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 77 68  False(pParse, wh
61b0: 65 6e 45 78 70 72 2c 20 65 6e 64 54 72 69 67 67  enExpr, endTrigg
61c0: 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  er, 1);.      sq
61d0: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 77  liteExprDelete(w
61e0: 68 65 6e 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  henExpr);..     
61f0: 20 63 6f 64 65 54 72 69 67 67 65 72 50 72 6f 67   codeTriggerProg
6200: 72 61 6d 28 70 50 61 72 73 65 2c 20 70 54 72 69  ram(pParse, pTri
6210: 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69 73 74 2c  gger->step_list,
6220: 20 6f 72 63 6f 6e 66 29 3b 20 0a 0a 20 20 20 20   orconf); ..    
6230: 20 20 2f 2a 20 50 6f 70 20 74 68 65 20 65 6e 74    /* Pop the ent
6240: 72 79 20 6f 66 66 20 74 68 65 20 74 72 69 67 67  ry off the trigg
6250: 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20  er stack */.    
6260: 20 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74    pParse->trigSt
6270: 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72  ack = pParse->tr
6280: 69 67 53 74 61 63 6b 2d 3e 70 4e 65 78 74 3b 0a  igStack->pNext;.
6290: 20 20 20 20 20 20 73 71 6c 69 74 65 41 75 74 68        sqliteAuth
62a0: 43 6f 6e 74 65 78 74 50 6f 70 28 26 73 43 6f 6e  ContextPop(&sCon
62b0: 74 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  text);.      sql
62c0: 69 74 65 46 72 65 65 28 70 54 72 69 67 67 65 72  iteFree(pTrigger
62d0: 53 74 61 63 6b 29 3b 0a 0a 20 20 20 20 20 20 73  Stack);..      s
62e0: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
62f0: 4c 61 62 65 6c 28 70 50 61 72 73 65 2d 3e 70 56  Label(pParse->pV
6300: 64 62 65 2c 20 65 6e 64 54 72 69 67 67 65 72 29  dbe, endTrigger)
6310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72 69  ;.    }.    pTri
6320: 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
6330: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72  >pNext;.  }..  r
6340: 65 74 75 72 6e 20 30 3b 0a 7d 0a                 eturn 0;.}.