/ Hex Artifact Content
Login

Artifact 491d5d3b40d737365a1ade7d4039277991208dc3:


0000: 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 70 79 72 69  /*.** All copyri
0010: 67 68 74 20 6f 6e 20 74 68 69 73 20 77 6f 72 6b  ght on this work
0020: 20 69 73 20 64 69 73 63 6c 61 69 6d 65 64 20 62   is disclaimed b
0030: 79 20 74 68 65 20 61 75 74 68 6f 72 2e 0a 2a 2f  y the author..*/
0040: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0050: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54  eInt.h"../*.** T
0060: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79  his is called by
0070: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65 6e   the parser when
0080: 20 69 74 20 73 65 65 73 20 61 20 43 52 45 41 54   it sees a CREAT
0090: 45 20 54 52 49 47 47 45 52 20 73 74 61 74 65 6d  E TRIGGER statem
00a0: 65 6e 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ent.*/.void sqli
00b0: 74 65 43 72 65 61 74 65 54 72 69 67 67 65 72 28  teCreateTrigger(
00c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
00d0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
00e0: 72 73 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  rse context of t
00f0: 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45  he CREATE TRIGGE
0100: 52 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  R statement */. 
0110: 20 54 6f 6b 65 6e 20 2a 6e 6d 2c 20 20 20 20 20   Token *nm,     
0120: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65       /* The name
0130: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
0140: 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20  */.  int tr_tm, 
0150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
0160: 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b  of TK_BEFORE, TK
0170: 5f 41 46 54 45 52 20 2a 2f 0a 20 20 69 6e 74 20  _AFTER */.  int 
0180: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
0190: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e 53  /* One of TK_INS
01a0: 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20  ERT, TK_UPDATE, 
01b0: 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 49  TK_DELETE */.  I
01c0: 64 4c 69 73 74 20 2a 63 6f 6c 73 2c 20 20 20 20  dList *cols,    
01d0: 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73     /* column lis
01e0: 74 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  t if this is an 
01f0: 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67 65  UPDATE OF trigge
0200: 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 74 62  r */.  Token *tb
0210: 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  l,         /* Th
0220: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0230: 62 6c 65 2f 76 69 65 77 20 74 68 65 20 74 72 69  ble/view the tri
0240: 67 67 65 72 20 61 70 70 6c 69 65 73 20 74 6f 20  gger applies to 
0250: 2a 2f 0a 20 20 69 6e 74 20 66 6f 72 65 61 63 68  */.  int foreach
0260: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ,        /* One 
0270: 6f 66 20 54 4b 5f 52 4f 57 20 6f 72 20 54 4b 5f  of TK_ROW or TK_
0280: 53 54 41 54 45 4d 45 4e 54 20 2a 2f 0a 20 20 45  STATEMENT */.  E
0290: 78 70 72 20 2a 70 57 68 65 6e 2c 20 20 20 20 20  xpr *pWhen,     
02a0: 20 20 20 2f 2a 20 57 48 45 4e 20 63 6c 61 75 73     /* WHEN claus
02b0: 65 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74  e */.  TriggerSt
02c0: 65 70 20 2a 73 74 65 70 73 2c 20 2f 2a 20 54 68  ep *steps, /* Th
02d0: 65 20 74 72 69 67 67 65 72 65 64 20 70 72 6f 67  e triggered prog
02e0: 72 61 6d 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ram */.  char co
02f0: 6e 73 74 20 2a 63 63 2c 20 20 20 20 20 2f 2a 20  nst *cc,     /* 
0300: 54 68 65 20 73 74 72 69 6e 67 20 64 61 74 61 20  The string data 
0310: 74 6f 20 6d 61 6b 65 20 70 65 72 73 69 73 74 65  to make persiste
0320: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 0a  nt */.  int len.
0330: 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 6e 74  ){.  Trigger *nt
0340: 3b 0a 20 20 54 61 62 6c 65 20 20 20 2a 74 61 62  ;.  Table   *tab
0350: 3b 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 0a  ;.  int offset;.
0360: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 73    TriggerStep *s
0370: 73 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  s;..  /* Check t
0380: 68 61 74 3a 20 0a 20 20 2a 2a 20 31 2e 20 74 68  hat: .  ** 1. th
0390: 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 64  e trigger name d
03a0: 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
03b0: 65 78 69 73 74 2e 0a 20 20 2a 2a 20 32 2e 20 74  exist..  ** 2. t
03c0: 68 65 20 74 61 62 6c 65 20 28 6f 72 20 76 69 65  he table (or vie
03d0: 77 29 20 64 6f 65 73 20 65 78 69 73 74 2e 0a 20  w) does exist.. 
03e0: 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 63 68 61 72   */.  {.    char
03f0: 20 2a 74 6d 70 5f 73 74 72 20 3d 20 73 71 6c 69   *tmp_str = sqli
0400: 74 65 53 74 72 4e 44 75 70 28 6e 6d 2d 3e 7a 2c  teStrNDup(nm->z,
0410: 20 6e 6d 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28   nm->n);.    if(
0420: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
0430: 26 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 74 72  &(pParse->db->tr
0440: 69 67 48 61 73 68 29 2c 20 74 6d 70 5f 73 74 72  igHash), tmp_str
0450: 2c 20 6e 6d 2d 3e 6e 20 2b 20 31 29 20 29 7b 0a  , nm->n + 1) ){.
0460: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
0470: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
0480: 7a 45 72 72 4d 73 67 2c 20 22 74 72 69 67 67 65  zErrMsg, "trigge
0490: 72 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20  r ", -1,.       
04a0: 20 20 20 6e 6d 2d 3e 7a 2c 20 6e 6d 2d 3e 6e 2c     nm->z, nm->n,
04b0: 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74   " already exist
04c0: 73 22 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  s", -1, 0);.    
04d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 6d 70    sqliteFree(tmp
04e0: 5f 73 74 72 29 3b 0a 20 20 20 20 20 20 70 50 61  _str);.      pPa
04f0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
0500: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
0510: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
0520: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 6d     sqliteFree(tm
0530: 70 5f 73 74 72 29 3b 0a 20 20 7d 0a 20 20 7b 0a  p_str);.  }.  {.
0540: 20 20 20 20 63 68 61 72 20 2a 74 6d 70 5f 73 74      char *tmp_st
0550: 72 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  r = sqliteStrNDu
0560: 70 28 74 62 6c 2d 3e 7a 2c 20 74 62 6c 2d 3e 6e  p(tbl->z, tbl->n
0570: 29 3b 0a 20 20 20 20 74 61 62 20 3d 20 73 71 6c  );.    tab = sql
0580: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61  iteFindTable(pPa
0590: 72 73 65 2d 3e 64 62 2c 20 74 6d 70 5f 73 74 72  rse->db, tmp_str
05a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
05b0: 65 28 74 6d 70 5f 73 74 72 29 3b 0a 20 20 20 20  e(tmp_str);.    
05c0: 69 66 28 20 21 74 61 62 20 29 7b 0a 20 20 20 20  if( !tab ){.    
05d0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
05e0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
05f0: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
0600: 62 6c 65 3a 20 22 2c 20 2d 31 2c 0a 20 20 20 20  ble: ", -1,.    
0610: 20 20 20 20 20 20 74 62 6c 2d 3e 7a 2c 20 74 62        tbl->z, tb
0620: 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  l->n, 0);.      
0630: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
0640: 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67        goto trigg
0650: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  er_cleanup;.    
0660: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c  }.  }..  /* Buil
0670: 64 20 74 68 65 20 54 72 69 67 67 65 72 20 6f 62  d the Trigger ob
0680: 6a 65 63 74 20 2a 2f 0a 20 20 6e 74 20 3d 20 28  ject */.  nt = (
0690: 54 72 69 67 67 65 72 2a 29 73 71 6c 69 74 65 4d  Trigger*)sqliteM
06a0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69  alloc(sizeof(Tri
06b0: 67 67 65 72 29 29 3b 0a 20 20 6e 74 2d 3e 6e 61  gger));.  nt->na
06c0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
06d0: 75 70 28 6e 6d 2d 3e 7a 2c 20 6e 6d 2d 3e 6e 29  up(nm->z, nm->n)
06e0: 3b 0a 20 20 6e 74 2d 3e 74 61 62 6c 65 20 3d 20  ;.  nt->table = 
06f0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 74 62  sqliteStrNDup(tb
0700: 6c 2d 3e 7a 2c 20 74 62 6c 2d 3e 6e 29 3b 0a 20  l->z, tbl->n);. 
0710: 20 6e 74 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20   nt->op = op;.  
0720: 6e 74 2d 3e 74 72 5f 74 6d 20 3d 20 74 72 5f 74  nt->tr_tm = tr_t
0730: 6d 3b 0a 20 20 6e 74 2d 3e 70 57 68 65 6e 20 3d  m;.  nt->pWhen =
0740: 20 70 57 68 65 6e 3b 0a 20 20 6e 74 2d 3e 70 43   pWhen;.  nt->pC
0750: 6f 6c 75 6d 6e 73 20 3d 20 63 6f 6c 73 3b 0a 20  olumns = cols;. 
0760: 20 6e 74 2d 3e 66 6f 72 65 61 63 68 20 3d 20 66   nt->foreach = f
0770: 6f 72 65 61 63 68 3b 0a 20 20 6e 74 2d 3e 73 74  oreach;.  nt->st
0780: 65 70 5f 6c 69 73 74 20 3d 20 73 74 65 70 73 3b  ep_list = steps;
0790: 0a 20 20 6e 74 2d 3e 69 73 43 6f 6d 6d 69 74 20  .  nt->isCommit 
07a0: 3d 20 30 3b 0a 0a 20 20 6e 74 2d 3e 73 74 72 69  = 0;..  nt->stri
07b0: 6e 67 73 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ngs = sqliteStrN
07c0: 44 75 70 28 63 63 2c 20 6c 65 6e 29 3b 0a 20 20  Dup(cc, len);.  
07d0: 6f 66 66 73 65 74 20 3d 20 28 69 6e 74 29 28 6e  offset = (int)(n
07e0: 74 2d 3e 73 74 72 69 6e 67 73 20 2d 20 63 63 29  t->strings - cc)
07f0: 3b 0a 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4d  ;..  sqliteExprM
0800: 6f 76 65 53 74 72 69 6e 67 73 28 6e 74 2d 3e 70  oveStrings(nt->p
0810: 57 68 65 6e 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  When, offset);..
0820: 20 20 73 73 20 3d 20 6e 74 2d 3e 73 74 65 70 5f    ss = nt->step_
0830: 6c 69 73 74 3b 0a 20 20 77 68 69 6c 65 20 28 73  list;.  while (s
0840: 73 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  s) {.    sqliteS
0850: 65 6c 65 63 74 4d 6f 76 65 53 74 72 69 6e 67 73  electMoveStrings
0860: 28 73 73 2d 3e 70 53 65 6c 65 63 74 2c 20 6f 66  (ss->pSelect, of
0870: 66 73 65 74 29 3b 0a 20 20 20 20 69 66 20 28 73  fset);.    if (s
0880: 73 2d 3e 74 61 72 67 65 74 2e 7a 29 20 73 73 2d  s->target.z) ss-
0890: 3e 74 61 72 67 65 74 2e 7a 20 2b 3d 20 6f 66 66  >target.z += off
08a0: 73 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  set;.    sqliteE
08b0: 78 70 72 4d 6f 76 65 53 74 72 69 6e 67 73 28 73  xprMoveStrings(s
08c0: 73 2d 3e 70 57 68 65 72 65 2c 20 6f 66 66 73 65  s->pWhere, offse
08d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  t);.    sqliteEx
08e0: 70 72 4c 69 73 74 4d 6f 76 65 53 74 72 69 6e 67  prListMoveString
08f0: 73 28 73 73 2d 3e 70 45 78 70 72 4c 69 73 74 2c  s(ss->pExprList,
0900: 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 73   offset);..    s
0910: 73 20 3d 20 73 73 2d 3e 70 4e 65 78 74 3b 0a 20  s = ss->pNext;. 
0920: 20 7d 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61   }..  /* if we a
0930: 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  re not initializ
0940: 69 6e 67 2c 20 61 6e 64 20 74 68 69 73 20 74 72  ing, and this tr
0950: 69 67 67 65 72 20 69 73 20 6e 6f 74 20 6f 6e 20  igger is not on 
0960: 61 20 54 45 4d 50 20 74 61 62 6c 65 2c 20 0a 20  a TEMP table, . 
0970: 20 2a 2a 20 62 75 69 6c 64 20 74 68 65 20 73 71   ** build the sq
0980: 6c 69 74 65 5f 6d 61 73 74 65 72 20 65 6e 74 72  lite_master entr
0990: 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  y.  */.  if( !pP
09a0: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26  arse->initFlag &
09b0: 26 20 21 74 61 62 2d 3e 69 73 54 65 6d 70 20 29  & !tab->isTemp )
09c0: 7b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61  {..    /* Make a
09d0: 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73  n entry in the s
09e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
09f0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
0a00: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
0a10: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ion(pParse);..  
0a20: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
0a30: 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  p(pParse->pVdbe,
0a40: 20 20 20 20 20 20 20 20 4f 50 5f 4f 70 65 6e 57          OP_OpenW
0a50: 72 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20  rite, 0, 2);.   
0a60: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
0a70: 65 50 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  eP3(pParse->pVdb
0a80: 65 2c 20 2d 31 2c 20 4d 41 53 54 45 52 5f 4e 41  e, -1, MASTER_NA
0a90: 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20 50 33  ME,           P3
0aa0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
0ab0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 70 50  liteVdbeAddOp(pP
0ac0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 20 20 20  arse->pVdbe,    
0ad0: 20 20 20 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c      OP_NewRecno,
0ae0: 20 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c    0, 0);.    sql
0af0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 70 50 61  iteVdbeAddOp(pPa
0b00: 72 73 65 2d 3e 70 56 64 62 65 2c 20 20 20 20 20  rse->pVdbe,     
0b10: 20 20 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20     OP_String,   
0b20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
0b30: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 70  teVdbeChangeP3(p
0b40: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 2d 31  Parse->pVdbe, -1
0b50: 2c 20 22 74 72 69 67 67 65 72 22 2c 20 20 20 20  , "trigger",    
0b60: 20 20 20 20 20 20 20 20 20 50 33 5f 53 54 41 54           P3_STAT
0b70: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  IC);.    sqliteV
0b80: 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d  dbeAddOp(pParse-
0b90: 3e 70 56 64 62 65 2c 20 20 20 20 20 20 20 20 4f  >pVdbe,        O
0ba0: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 30 2c 20  P_String,    0, 
0bb0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
0bc0: 62 65 43 68 61 6e 67 65 50 33 28 70 50 61 72 73  beChangeP3(pPars
0bd0: 65 2d 3e 70 56 64 62 65 2c 20 2d 31 2c 20 6e 74  e->pVdbe, -1, nt
0be0: 2d 3e 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 30  ->name,        0
0bf0: 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 56 64  ); .    sqliteVd
0c00: 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e  beAddOp(pParse->
0c10: 70 56 64 62 65 2c 20 20 20 20 20 20 20 20 4f 50  pVdbe,        OP
0c20: 5f 53 74 72 69 6e 67 2c 20 20 20 20 30 2c 20 30  _String,    0, 0
0c30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
0c40: 65 43 68 61 6e 67 65 50 33 28 70 50 61 72 73 65  eChangeP3(pParse
0c50: 2d 3e 70 56 64 62 65 2c 20 2d 31 2c 20 6e 74 2d  ->pVdbe, -1, nt-
0c60: 3e 74 61 62 6c 65 2c 20 20 20 20 20 20 20 20 30  >table,        0
0c70: 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 56 64  ); .    sqliteVd
0c80: 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e  beAddOp(pParse->
0c90: 70 56 64 62 65 2c 20 20 20 20 20 20 20 20 4f 50  pVdbe,        OP
0ca0: 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 30 2c 20  _Integer,    0, 
0cb0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
0cc0: 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e  beAddOp(pParse->
0cd0: 70 56 64 62 65 2c 20 20 20 20 20 20 20 20 4f 50  pVdbe,        OP
0ce0: 5f 53 74 72 69 6e 67 2c 20 20 20 20 30 2c 20 30  _String,    0, 0
0cf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
0d00: 65 43 68 61 6e 67 65 50 33 28 70 50 61 72 73 65  eChangeP3(pParse
0d10: 2d 3e 70 56 64 62 65 2c 20 2d 31 2c 20 6e 74 2d  ->pVdbe, -1, nt-
0d20: 3e 73 74 72 69 6e 67 73 2c 20 20 20 20 20 30 29  >strings,     0)
0d30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
0d40: 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56  AddOp(pParse->pV
0d50: 64 62 65 2c 20 20 20 20 20 20 20 20 4f 50 5f 4d  dbe,        OP_M
0d60: 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29  akeRecord, 5, 0)
0d70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
0d80: 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56  AddOp(pParse->pV
0d90: 64 62 65 2c 20 20 20 20 20 20 20 20 4f 50 5f 50  dbe,        OP_P
0da0: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 31 29 3b  utIntKey, 0, 1);
0db0: 0a 0a 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20  ..    /* Change 
0dc0: 74 68 65 20 63 6f 6f 6b 69 65 2c 20 73 69 6e 63  the cookie, sinc
0dd0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
0de0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 73  changed */.    s
0df0: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
0e00: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  e(pParse->db);. 
0e10: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
0e20: 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  Op(pParse->pVdbe
0e30: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 50  , OP_Integer, pP
0e40: 61 72 73 65 2d 3e 64 62 2d 3e 6e 65 78 74 5f 63  arse->db->next_c
0e50: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 73  ookie, 0);.    s
0e60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 70  qliteVdbeAddOp(p
0e70: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
0e80: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30  _SetCookie, 0, 0
0e90: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 56 64  );..    sqliteVd
0ea0: 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e  beAddOp(pParse->
0eb0: 70 56 64 62 65 2c 20 20 20 20 20 20 20 20 4f 50  pVdbe,        OP
0ec0: 5f 43 6c 6f 73 65 2c 20 20 20 20 20 30 2c 20 30  _Close,     0, 0
0ed0: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 45 6e  );..    sqliteEn
0ee0: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
0ef0: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
0f00: 69 66 20 28 21 70 50 61 72 73 65 2d 3e 65 78 70  if (!pParse->exp
0f10: 6c 61 69 6e 29 20 7b 0a 20 20 20 20 2f 2a 20 53  lain) {.    /* S
0f20: 74 69 63 6b 20 69 74 20 69 6e 20 74 68 65 20 68  tick it in the h
0f30: 61 73 68 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ash-table */.   
0f40: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
0f50: 74 28 26 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  t(&(pParse->db->
0f60: 74 72 69 67 48 61 73 68 29 2c 20 6e 74 2d 3e 6e  trigHash), nt->n
0f70: 61 6d 65 2c 20 6e 6d 2d 3e 6e 20 2b 20 31 2c 20  ame, nm->n + 1, 
0f80: 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 74 74  nt);..    /* Att
0f90: 61 63 68 20 69 74 20 74 6f 20 74 68 65 20 74 61  ach it to the ta
0fa0: 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ble object */.  
0fb0: 20 20 6e 74 2d 3e 70 4e 65 78 74 20 3d 20 74 61    nt->pNext = ta
0fc0: 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  b->pTrigger;.   
0fd0: 20 74 61 62 2d 3e 70 54 72 69 67 67 65 72 20 3d   tab->pTrigger =
0fe0: 20 6e 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   nt;.    return;
0ff0: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
1000: 73 71 6c 69 74 65 46 72 65 65 28 6e 74 2d 3e 73  sqliteFree(nt->s
1010: 74 72 69 6e 67 73 29 3b 0a 20 20 20 20 73 71 6c  trings);.    sql
1020: 69 74 65 46 72 65 65 28 6e 74 2d 3e 6e 61 6d 65  iteFree(nt->name
1030: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
1040: 65 28 6e 74 2d 3e 74 61 62 6c 65 29 3b 0a 20 20  e(nt->table);.  
1050: 20 20 73 71 6c 69 74 65 46 72 65 65 28 6e 74 29    sqliteFree(nt)
1060: 3b 0a 20 20 7d 0a 0a 74 72 69 67 67 65 72 5f 63  ;.  }..trigger_c
1070: 6c 65 61 6e 75 70 3a 0a 0a 20 20 73 71 6c 69 74  leanup:..  sqlit
1080: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 63 6f  eIdListDelete(co
1090: 6c 73 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  ls);.  sqliteExp
10a0: 72 44 65 6c 65 74 65 28 70 57 68 65 6e 29 3b 0a  rDelete(pWhen);.
10b0: 20 20 7b 0a 20 20 20 20 54 72 69 67 67 65 72 53    {.    TriggerS
10c0: 74 65 70 20 2a 20 70 70 3b 0a 20 20 20 20 54 72  tep * pp;.    Tr
10d0: 69 67 67 65 72 53 74 65 70 20 2a 20 6e 6e 3b 0a  iggerStep * nn;.
10e0: 0a 20 20 20 20 70 70 20 3d 20 73 74 65 70 73 3b  .    pp = steps;
10f0: 0a 20 20 20 20 77 68 69 6c 65 20 28 70 70 29 20  .    while (pp) 
1100: 7b 0a 20 20 20 20 20 20 6e 6e 20 3d 20 70 70 2d  {.      nn = pp-
1110: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
1120: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
1130: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
1140: 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74    sqliteExprList
1150: 44 65 6c 65 74 65 28 70 70 2d 3e 70 45 78 70 72  Delete(pp->pExpr
1160: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  List);.      sql
1170: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
1180: 70 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  pp->pSelect);.  
1190: 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74      sqliteIdList
11a0: 44 65 6c 65 74 65 28 70 70 2d 3e 70 49 64 4c 69  Delete(pp->pIdLi
11b0: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
11c0: 65 46 72 65 65 28 70 70 29 3b 0a 20 20 20 20 20  eFree(pp);.     
11d0: 20 70 70 20 3d 20 6e 6e 3b 0a 20 20 20 20 7d 0a   pp = nn;.    }.
11e0: 20 20 7d 0a 7d 0a 0a 20 20 54 72 69 67 67 65 72    }.}..  Trigger
11f0: 53 74 65 70 20 2a 20 0a 73 71 6c 69 74 65 54 72  Step * .sqliteTr
1200: 69 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28  iggerSelectStep(
1210: 53 65 6c 65 63 74 20 2a 20 73 29 0a 7b 0a 20 20  Select * s).{.  
1220: 54 72 69 67 67 65 72 53 74 65 70 20 2a 20 74 74  TriggerStep * tt
1230: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1240: 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74  sizeof(TriggerSt
1250: 65 70 29 29 3b 0a 0a 20 20 74 74 2d 3e 6f 70 20  ep));..  tt->op 
1260: 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 74  = TK_SELECT;.  t
1270: 74 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 3b 0a  t->pSelect = s;.
1280: 20 20 74 74 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f    tt->orconf = O
1290: 45 5f 44 65 66 61 75 6c 74 3b 0a 0a 20 20 72 65  E_Default;..  re
12a0: 74 75 72 6e 20 74 74 3b 0a 7d 0a 0a 54 72 69 67  turn tt;.}..Trig
12b0: 67 65 72 53 74 65 70 20 2a 20 0a 73 71 6c 69 74  gerStep * .sqlit
12c0: 65 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74  eTriggerInsertSt
12d0: 65 70 28 54 6f 6b 65 6e 20 2a 20 74 62 6c 2c 20  ep(Token * tbl, 
12e0: 49 64 4c 69 73 74 20 2a 20 63 6f 6c 2c 20 45 78  IdList * col, Ex
12f0: 70 72 4c 69 73 74 20 2a 20 76 61 6c 2c 20 53 65  prList * val, Se
1300: 6c 65 63 74 20 2a 20 73 2c 20 69 6e 74 20 6f 72  lect * s, int or
1310: 63 6f 6e 66 29 0a 7b 0a 20 20 54 72 69 67 67 65  conf).{.  Trigge
1320: 72 53 74 65 70 20 2a 20 74 74 20 3d 20 73 71 6c  rStep * tt = sql
1330: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
1340: 28 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a  (TriggerStep));.
1350: 0a 20 20 61 73 73 65 72 74 28 76 61 6c 20 3d 3d  .  assert(val ==
1360: 20 30 20 7c 7c 20 73 20 3d 3d 20 30 29 3b 0a 20   0 || s == 0);. 
1370: 20 61 73 73 65 72 74 28 76 61 6c 20 21 3d 20 30   assert(val != 0
1380: 20 7c 7c 20 73 20 21 3d 20 30 29 3b 0a 0a 20 20   || s != 0);..  
1390: 74 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 53 45  tt->op = TK_INSE
13a0: 52 54 3b 0a 20 20 74 74 2d 3e 70 53 65 6c 65 63  RT;.  tt->pSelec
13b0: 74 20 3d 20 73 3b 0a 20 20 74 74 2d 3e 74 61 72  t = s;.  tt->tar
13c0: 67 65 74 20 20 3d 20 2a 74 62 6c 3b 0a 20 20 74  get  = *tbl;.  t
13d0: 74 2d 3e 70 49 64 4c 69 73 74 20 3d 20 63 6f 6c  t->pIdList = col
13e0: 3b 0a 20 20 74 74 2d 3e 70 45 78 70 72 4c 69 73  ;.  tt->pExprLis
13f0: 74 20 3d 20 76 61 6c 3b 0a 20 20 74 74 2d 3e 6f  t = val;.  tt->o
1400: 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a  rconf = orconf;.
1410: 0a 20 20 72 65 74 75 72 6e 20 74 74 3b 0a 7d 0a  .  return tt;.}.
1420: 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 20 0a  .TriggerStep * .
1430: 73 71 6c 69 74 65 54 72 69 67 67 65 72 55 70 64  sqliteTriggerUpd
1440: 61 74 65 53 74 65 70 28 54 6f 6b 65 6e 20 2a 20  ateStep(Token * 
1450: 74 62 6c 2c 20 45 78 70 72 4c 69 73 74 20 2a 20  tbl, ExprList * 
1460: 76 61 6c 2c 20 45 78 70 72 20 2a 20 77 2c 20 69  val, Expr * w, i
1470: 6e 74 20 6f 72 63 6f 6e 66 29 0a 7b 0a 20 20 54  nt orconf).{.  T
1480: 72 69 67 67 65 72 53 74 65 70 20 2a 20 74 74 20  riggerStep * tt 
1490: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  = sqliteMalloc(s
14a0: 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 65  izeof(TriggerSte
14b0: 70 29 29 3b 0a 0a 20 20 74 74 2d 3e 6f 70 20 3d  p));..  tt->op =
14c0: 20 54 4b 5f 55 50 44 41 54 45 3b 0a 20 20 74 74   TK_UPDATE;.  tt
14d0: 2d 3e 74 61 72 67 65 74 20 20 3d 20 2a 74 62 6c  ->target  = *tbl
14e0: 3b 0a 20 20 74 74 2d 3e 70 45 78 70 72 4c 69 73  ;.  tt->pExprLis
14f0: 74 20 3d 20 76 61 6c 3b 0a 20 20 74 74 2d 3e 70  t = val;.  tt->p
1500: 57 68 65 72 65 20 3d 20 77 3b 0a 20 20 74 74 2d  Where = w;.  tt-
1510: 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66  >orconf = orconf
1520: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 74 74 3b 0a  ;..  return tt;.
1530: 7d 0a 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a  }..TriggerStep *
1540: 20 0a 73 71 6c 69 74 65 54 72 69 67 67 65 72 44   .sqliteTriggerD
1550: 65 6c 65 74 65 53 74 65 70 28 54 6f 6b 65 6e 20  eleteStep(Token 
1560: 2a 20 74 62 6c 2c 20 45 78 70 72 20 2a 20 77 29  * tbl, Expr * w)
1570: 0a 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  .{.  TriggerStep
1580: 20 2a 20 74 74 20 3d 20 73 71 6c 69 74 65 4d 61   * tt = sqliteMa
1590: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69 67  lloc(sizeof(Trig
15a0: 67 65 72 53 74 65 70 29 29 3b 0a 0a 20 20 74 74  gerStep));..  tt
15b0: 2d 3e 6f 70 20 3d 20 54 4b 5f 44 45 4c 45 54 45  ->op = TK_DELETE
15c0: 3b 0a 20 20 74 74 2d 3e 74 61 72 67 65 74 20 20  ;.  tt->target  
15d0: 3d 20 2a 74 62 6c 3b 0a 20 20 74 74 2d 3e 70 57  = *tbl;.  tt->pW
15e0: 68 65 72 65 20 3d 20 77 3b 0a 20 20 74 74 2d 3e  here = w;.  tt->
15f0: 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44 65 66 61  orconf = OE_Defa
1600: 75 6c 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 74  ult;..  return t
1610: 74 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68 69 73 20 64  t;.}.../* This d
1620: 6f 65 73 20 61 20 72 65 63 75 72 73 69 76 65 20  oes a recursive 
1630: 64 65 6c 65 74 65 20 6f 66 20 74 68 65 20 74 72  delete of the tr
1640: 69 67 67 65 72 20 73 74 72 75 63 74 75 72 65 20  igger structure 
1650: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 65  */.void sqliteDe
1660: 6c 65 74 65 54 72 69 67 67 65 72 28 54 72 69 67  leteTrigger(Trig
1670: 67 65 72 20 2a 20 74 74 29 0a 7b 0a 20 20 54 72  ger * tt).{.  Tr
1680: 69 67 67 65 72 53 74 65 70 20 2a 20 74 73 2c 20  iggerStep * ts, 
1690: 2a 20 74 63 3b 0a 20 20 74 73 20 3d 20 74 74 2d  * tc;.  ts = tt-
16a0: 3e 73 74 65 70 5f 6c 69 73 74 3b 0a 0a 20 20 77  >step_list;..  w
16b0: 68 69 6c 65 20 28 74 73 29 20 7b 0a 20 20 20 20  hile (ts) {.    
16c0: 74 63 20 3d 20 74 73 3b 0a 20 20 20 20 74 73 20  tc = ts;.    ts 
16d0: 3d 20 74 73 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20  = ts->pNext;..  
16e0: 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
16f0: 74 65 28 74 63 2d 3e 70 57 68 65 72 65 29 3b 0a  te(tc->pWhere);.
1700: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69      sqliteExprLi
1710: 73 74 44 65 6c 65 74 65 28 74 63 2d 3e 70 45 78  stDelete(tc->pEx
1720: 70 72 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  prList);.    sql
1730: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
1740: 74 63 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  tc->pSelect);.  
1750: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
1760: 6c 65 74 65 28 74 63 2d 3e 70 49 64 4c 69 73 74  lete(tc->pIdList
1770: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 46 72  );..    sqliteFr
1780: 65 65 28 74 63 29 3b 0a 20 20 7d 0a 0a 20 20 73  ee(tc);.  }..  s
1790: 71 6c 69 74 65 46 72 65 65 28 74 74 2d 3e 6e 61  qliteFree(tt->na
17a0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
17b0: 65 28 74 74 2d 3e 74 61 62 6c 65 29 3b 0a 20 20  e(tt->table);.  
17c0: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
17d0: 28 74 74 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 73  (tt->pWhen);.  s
17e0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
17f0: 65 28 74 74 2d 3e 70 43 6f 6c 75 6d 6e 73 29 3b  e(tt->pColumns);
1800: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 74  .  sqliteFree(tt
1810: 2d 3e 73 74 72 69 6e 67 73 29 3b 0a 20 20 73 71  ->strings);.  sq
1820: 6c 69 74 65 46 72 65 65 28 74 74 29 3b 0a 7d 0a  liteFree(tt);.}.
1830: 0a 2f 2a 0a 20 2a 20 22 6e 65 73 74 65 64 22 20  ./*. * "nested" 
1840: 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73 20  is true if this 
1850: 69 73 20 62 65 67 69 6e 20 63 61 6c 6c 65 64 20  is begin called 
1860: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  as the result of
1870: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 0a 20 2a   a DROP TABLE. *
1880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f  /.void sqliteDro
1890: 70 54 72 69 67 67 65 72 28 50 61 72 73 65 20 2a  pTrigger(Parse *
18a0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 20  pParse, Token * 
18b0: 74 72 69 67 6e 61 6d 65 2c 20 69 6e 74 20 6e 65  trigname, int ne
18c0: 73 74 65 64 29 0a 7b 0a 20 20 63 68 61 72 20 2a  sted).{.  char *
18d0: 20 74 6d 70 5f 6e 61 6d 65 3b 0a 20 20 54 72 69   tmp_name;.  Tri
18e0: 67 67 65 72 20 2a 20 74 72 69 67 3b 0a 20 20 54  gger * trig;.  T
18f0: 61 62 6c 65 20 20 20 2a 20 74 62 6c 3b 0a 0a 20  able   * tbl;.. 
1900: 20 74 6d 70 5f 6e 61 6d 65 20 3d 20 73 71 6c 69   tmp_name = sqli
1910: 74 65 53 74 72 4e 44 75 70 28 74 72 69 67 6e 61  teStrNDup(trigna
1920: 6d 65 2d 3e 7a 2c 20 74 72 69 67 6e 61 6d 65 2d  me->z, trigname-
1930: 3e 6e 29 3b 0a 0a 20 20 2f 2a 20 65 6e 73 75 72  >n);..  /* ensur
1940: 65 20 74 68 61 74 20 74 68 65 20 74 72 69 67 67  e that the trigg
1950: 65 72 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  er being dropped
1960: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 74 72 69   exists */.  tri
1970: 67 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69  g = sqliteHashFi
1980: 6e 64 28 26 28 70 50 61 72 73 65 2d 3e 64 62 2d  nd(&(pParse->db-
1990: 3e 74 72 69 67 48 61 73 68 29 2c 20 74 6d 70 5f  >trigHash), tmp_
19a0: 6e 61 6d 65 2c 20 74 72 69 67 6e 61 6d 65 2d 3e  name, trigname->
19b0: 6e 20 2b 20 31 29 3b 20 0a 20 20 69 66 20 28 21  n + 1); .  if (!
19c0: 74 72 69 67 29 20 7b 0a 20 20 20 20 73 71 6c 69  trig) {.    sqli
19d0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
19e0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
19f0: 6e 6f 20 73 75 63 68 20 74 72 69 67 67 65 72 3a  no such trigger:
1a00: 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20   ", -1,.        
1a10: 74 6d 70 5f 6e 61 6d 65 2c 20 2d 31 2c 20 30 29  tmp_name, -1, 0)
1a20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
1a30: 28 74 6d 70 5f 6e 61 6d 65 29 3b 0a 20 20 20 20  (tmp_name);.    
1a40: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
1a50: 2a 0a 20 20 20 2a 20 49 66 20 74 68 69 73 20 69  *.   * If this i
1a60: 73 20 6e 6f 74 20 61 6e 20 22 65 78 70 6c 61 69  s not an "explai
1a70: 6e 22 2c 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f  n", do the follo
1a80: 77 69 6e 67 3a 0a 20 20 20 2a 20 31 2e 20 52 65  wing:.   * 1. Re
1a90: 6d 6f 76 65 20 74 68 65 20 74 72 69 67 67 65 72  move the trigger
1aa0: 20 66 72 6f 6d 20 69 74 73 20 61 73 73 6f 63 69   from its associ
1ab0: 61 74 65 64 20 74 61 62 6c 65 20 73 74 72 75 63  ated table struc
1ac0: 74 75 72 65 0a 20 20 20 2a 20 32 2e 20 4d 6f 76  ture.   * 2. Mov
1ad0: 65 20 74 68 65 20 74 72 69 67 67 65 72 20 66 72  e the trigger fr
1ae0: 6f 6d 20 74 68 65 20 74 72 69 67 48 61 73 68 20  om the trigHash 
1af0: 68 61 73 68 20 74 6f 20 74 72 69 67 44 72 6f 70  hash to trigDrop
1b00: 0a 20 20 20 2a 2f 0a 20 20 69 66 20 28 21 70 50  .   */.  if (!pP
1b10: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 20 7b  arse->explain) {
1b20: 0a 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20  .    /* 1 */.   
1b30: 20 74 62 6c 20 3d 20 73 71 6c 69 74 65 46 69 6e   tbl = sqliteFin
1b40: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
1b50: 62 2c 20 74 72 69 67 2d 3e 74 61 62 6c 65 29 3b  b, trig->table);
1b60: 0a 20 20 20 20 61 73 73 65 72 74 28 74 62 6c 29  .    assert(tbl)
1b70: 3b 0a 20 20 20 20 69 66 20 28 74 62 6c 2d 3e 70  ;.    if (tbl->p
1b80: 54 72 69 67 67 65 72 20 3d 3d 20 74 72 69 67 29  Trigger == trig)
1b90: 20 0a 20 20 20 20 20 20 74 62 6c 2d 3e 70 54 72   .      tbl->pTr
1ba0: 69 67 67 65 72 20 3d 20 74 72 69 67 2d 3e 70 4e  igger = trig->pN
1bb0: 65 78 74 3b 0a 20 20 20 20 65 6c 73 65 20 7b 0a  ext;.    else {.
1bc0: 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 20        Trigger * 
1bd0: 63 63 20 3d 20 74 62 6c 2d 3e 70 54 72 69 67 67  cc = tbl->pTrigg
1be0: 65 72 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 20  er;.      while 
1bf0: 28 63 63 29 20 7b 0a 20 20 20 20 20 20 20 20 69  (cc) {.        i
1c00: 66 20 28 63 63 2d 3e 70 4e 65 78 74 20 3d 3d 20  f (cc->pNext == 
1c10: 74 72 69 67 29 20 7b 0a 20 20 20 20 20 20 20 20  trig) {.        
1c20: 20 20 63 63 2d 3e 70 4e 65 78 74 20 3d 20 63 63    cc->pNext = cc
1c30: 2d 3e 70 4e 65 78 74 2d 3e 70 4e 65 78 74 3b 0a  ->pNext->pNext;.
1c40: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c60: 20 20 20 63 63 20 3d 20 63 63 2d 3e 70 4e 65 78     cc = cc->pNex
1c70: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1c80: 20 61 73 73 65 72 74 28 63 63 29 3b 0a 20 20 20   assert(cc);.   
1c90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 32 20 2a 2f 0a   }..    /* 2 */.
1ca0: 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e      sqliteHashIn
1cb0: 73 65 72 74 28 26 28 70 50 61 72 73 65 2d 3e 64  sert(&(pParse->d
1cc0: 62 2d 3e 74 72 69 67 48 61 73 68 29 2c 20 74 6d  b->trigHash), tm
1cd0: 70 5f 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  p_name, .       
1ce0: 20 74 72 69 67 6e 61 6d 65 2d 3e 6e 20 2b 20 31   trigname->n + 1
1cf0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 71 6c  , NULL);.    sql
1d00: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 28  iteHashInsert(&(
1d10: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 74 72 69 67  pParse->db->trig
1d20: 44 72 6f 70 29 2c 20 74 72 69 67 2d 3e 6e 61 6d  Drop), trig->nam
1d30: 65 2c 20 0a 20 20 20 20 20 20 20 20 74 72 69 67  e, .        trig
1d40: 6e 61 6d 65 2d 3e 6e 20 2b 20 31 2c 20 74 72 69  name->n + 1, tri
1d50: 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e  g);.  }..  /* Un
1d60: 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20 74  less this is a t
1d70: 72 69 67 67 65 72 20 6f 6e 20 61 20 54 45 4d 50  rigger on a TEMP
1d80: 20 54 41 42 4c 45 2c 20 67 65 6e 65 72 61 74 65   TABLE, generate
1d90: 20 63 6f 64 65 20 74 6f 20 64 65 73 74 72 6f 79   code to destroy
1da0: 20 74 68 65 0a 20 20 20 2a 20 64 61 74 61 62 61   the.   * databa
1db0: 73 65 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  se record of the
1dc0: 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 69 66   trigger */.  if
1dd0: 20 28 21 74 62 6c 2d 3e 69 73 54 65 6d 70 29 20   (!tbl->isTemp) 
1de0: 7b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a  {.    int base;.
1df0: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
1e00: 70 20 64 72 6f 70 54 72 69 67 67 65 72 5b 5d 20  p dropTrigger[] 
1e10: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f  = {.      { OP_O
1e20: 70 65 6e 57 72 69 74 65 2c 20 20 30 2c 20 32 2c  penWrite,  0, 2,
1e30: 20 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f 4e          MASTER_N
1e40: 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  AME},.      { OP
1e50: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
1e60: 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(9),  0},.  
1e70: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
1e80: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
1e90: 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20    0}, /* 2 */.  
1ea0: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72      { OP_MemStor
1eb0: 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20  e,   1, 1,      
1ec0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
1ed0: 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20  _MemLoad,    1, 
1ee0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
1ef0: 20 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   4 */.      { OP
1f00: 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20  _Column,     0, 
1f10: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  1,        0},.  
1f20: 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20      { OP_Ne,    
1f30: 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c       0, ADDR(8),
1f40: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
1f50: 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20  _Delete,     0, 
1f60: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
1f70: 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20      { OP_Next,  
1f80: 20 20 20 20 20 30 2c 20 41 44 44 52 28 34 29 2c       0, ADDR(4),
1f90: 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20    0}, /* 8 */.  
1fa0: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
1fb0: 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ,    0, 0,      
1fc0: 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20    0}, /* 9 */.  
1fd0: 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b      { OP_SetCook
1fe0: 69 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ie,  0, 0,      
1ff0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
2000: 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20 30 2c 20  _Close,      0, 
2010: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
2020: 20 20 7d 3b 0a 0a 20 20 20 20 69 66 28 20 21 6e    };..    if( !n
2030: 65 73 74 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ested ){.      s
2040: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
2050: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
2060: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 61 73 65  ;.    }.    base
2070: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
2080: 4f 70 4c 69 73 74 28 70 50 61 72 73 65 2d 3e 70  OpList(pParse->p
2090: 56 64 62 65 2c 20 0a 20 20 20 20 20 20 20 20 41  Vdbe, .        A
20a0: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 72 69  rraySize(dropTri
20b0: 67 67 65 72 29 2c 20 64 72 6f 70 54 72 69 67 67  gger), dropTrigg
20c0: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  er);.    sqliteV
20d0: 64 62 65 43 68 61 6e 67 65 50 33 28 70 50 61 72  dbeChangeP3(pPar
20e0: 73 65 2d 3e 70 56 64 62 65 2c 20 62 61 73 65 2b  se->pVdbe, base+
20f0: 32 2c 20 74 6d 70 5f 6e 61 6d 65 2c 20 30 29 3b  2, tmp_name, 0);
2100: 0a 20 20 20 20 69 66 28 20 21 6e 65 73 74 65 64  .    if( !nested
2110: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2120: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
2130: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a  rse->db);.    }.
2140: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
2150: 61 6e 67 65 50 31 28 70 50 61 72 73 65 2d 3e 70  angeP1(pParse->p
2160: 56 64 62 65 2c 20 62 61 73 65 2b 39 2c 20 70 50  Vdbe, base+9, pP
2170: 61 72 73 65 2d 3e 64 62 2d 3e 6e 65 78 74 5f 63  arse->db->next_c
2180: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 69 66 28 20  ookie);.    if( 
2190: 21 6e 65 73 74 65 64 20 29 7b 0a 20 20 20 20 20  !nested ){.     
21a0: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
21b0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
21c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
21d0: 71 6c 69 74 65 46 72 65 65 28 74 6d 70 5f 6e 61  qliteFree(tmp_na
21e0: 6d 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  me);.}..static i
21f0: 6e 74 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76  nt checkColumnOv
2200: 65 72 4c 61 70 28 49 64 4c 69 73 74 20 2a 20 69  erLap(IdList * i
2210: 69 2c 20 45 78 70 72 4c 69 73 74 20 2a 20 65 65  i, ExprList * ee
2220: 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 65 3b 0a  ).{.  int i, e;.
2230: 20 20 69 66 20 28 21 69 69 29 20 72 65 74 75 72    if (!ii) retur
2240: 6e 20 31 3b 0a 20 20 69 66 20 28 21 65 65 29 20  n 1;.  if (!ee) 
2250: 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 66 6f 72  return 1;..  for
2260: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 69 69 2d   (i = 0; i < ii-
2270: 3e 6e 49 64 3b 20 69 2b 2b 29 20 0a 20 20 20 20  >nId; i++) .    
2280: 66 6f 72 20 28 65 20 3d 20 30 3b 20 65 20 3c 20  for (e = 0; e < 
2290: 65 65 2d 3e 6e 45 78 70 72 3b 20 65 2b 2b 29 20  ee->nExpr; e++) 
22a0: 0a 20 20 20 20 20 20 69 66 20 28 21 73 71 6c 69  .      if (!sqli
22b0: 74 65 53 74 72 49 43 6d 70 28 69 69 2d 3e 61 5b  teStrICmp(ii->a[
22c0: 69 5d 2e 7a 4e 61 6d 65 2c 20 65 65 2d 3e 61 5b  i].zName, ee->a[
22d0: 65 5d 2e 7a 4e 61 6d 65 29 29 0a 20 20 20 20 20  e].zName)).     
22e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20     return 1;..  
22f0: 72 65 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a  return 0; .}../*
2300: 20 41 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62   A global variab
2310: 6c 65 20 74 68 61 74 20 69 73 20 54 52 55 45 20  le that is TRUE 
2320: 69 66 20 77 65 20 73 68 6f 75 6c 64 20 61 6c 77  if we should alw
2330: 61 79 73 20 73 65 74 20 75 70 20 74 65 6d 70 20  ays set up temp 
2340: 74 61 62 6c 65 73 20 66 6f 72 0a 20 2a 20 66 6f  tables for. * fo
2350: 72 20 74 72 69 67 67 65 72 73 2c 20 65 76 65 6e  r triggers, even
2360: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
2370: 20 74 72 69 67 67 65 72 73 20 74 6f 20 63 6f 64   triggers to cod
2380: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
2390: 74 6f 20 74 65 73 74 20 0a 20 2a 20 68 6f 77 20  to test . * how 
23a0: 6d 75 63 68 20 6f 76 65 72 68 65 61 64 20 74 68  much overhead th
23b0: 65 20 74 72 69 67 67 65 72 73 20 61 6c 67 6f 72  e triggers algor
23c0: 69 74 68 6d 20 69 73 20 63 61 75 73 69 6e 67 2e  ithm is causing.
23d0: 0a 20 2a 0a 20 2a 20 54 68 69 73 20 66 6c 61 67  . *. * This flag
23e0: 20 63 61 6e 20 62 65 20 73 65 74 20 6f 72 20 63   can be set or c
23f0: 6c 65 61 72 65 64 20 75 73 69 6e 67 20 74 68 65  leared using the
2400: 20 22 74 72 69 67 67 65 72 5f 6f 76 65 72 68 65   "trigger_overhe
2410: 61 64 5f 74 65 73 74 22 20 70 72 61 67 6d 61 2e  ad_test" pragma.
2420: 0a 20 2a 20 54 68 65 20 70 72 61 67 6d 61 20 69  . * The pragma i
2430: 73 20 6e 6f 74 20 64 6f 63 75 6d 65 6e 74 65 64  s not documented
2440: 20 73 69 6e 63 65 20 69 74 20 69 73 20 6e 6f 74   since it is not
2450: 20 72 65 61 6c 6c 79 20 70 61 72 74 20 6f 66 20   really part of 
2460: 74 68 65 20 69 6e 74 65 72 66 61 63 65 0a 20 2a  the interface. *
2470: 20 74 6f 20 53 51 4c 69 74 65 2c 20 6a 75 73 74   to SQLite, just
2480: 20 74 68 65 20 74 65 73 74 20 70 72 6f 63 65 64   the test proced
2490: 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 61 6c 77 61  ure..*/.int alwa
24a0: 79 73 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f  ys_code_trigger_
24b0: 73 65 74 75 70 20 3d 20 30 3b 0a 0a 2f 2a 0a 20  setup = 0;../*. 
24c0: 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65 20 69  * Returns true i
24d0: 66 20 61 20 74 72 69 67 67 65 72 20 6d 61 74 63  f a trigger matc
24e0: 68 69 6e 67 20 6f 70 2c 20 74 72 5f 74 6d 20 61  hing op, tr_tm a
24f0: 6e 64 20 66 6f 72 65 61 63 68 20 74 68 61 74 20  nd foreach that 
2500: 69 73 20 4e 4f 54 20 61 6c 72 65 61 64 79 0a 20  is NOT already. 
2510: 2a 20 6f 6e 20 74 68 65 20 50 61 72 73 65 20 6f  * on the Parse o
2520: 62 6a 65 63 74 73 20 74 72 69 67 67 65 72 2d 73  bjects trigger-s
2530: 74 61 63 6b 20 28 74 6f 20 70 72 65 76 65 6e 74  tack (to prevent
2540: 20 72 65 63 75 72 73 69 76 65 20 74 72 69 67 67   recursive trigg
2550: 65 72 20 66 69 72 69 6e 67 29 20 69 73 0a 20 2a  er firing) is. *
2560: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 6c 69   found in the li
2570: 73 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  st specified as 
2580: 70 54 72 69 67 67 65 72 2e 0a 20 2a 2f 0a 69 6e  pTrigger.. */.in
2590: 74 20 73 71 6c 69 74 65 54 72 69 67 67 65 72 73  t sqliteTriggers
25a0: 45 78 69 73 74 28 0a 20 20 20 20 50 61 72 73 65  Exist(.    Parse
25b0: 20 2a 20 70 50 61 72 73 65 2c 20 0a 20 20 20 20   * pParse, .    
25c0: 54 72 69 67 67 65 72 20 2a 20 70 54 72 69 67 67  Trigger * pTrigg
25d0: 65 72 2c 0a 20 20 20 20 69 6e 74 20 6f 70 2c 20  er,.    int op, 
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 2f 2a 20 6f 6e 65 20 6f 66 20 54 4b 5f 44 45 4c  /* one of TK_DEL
2600: 45 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20  ETE, TK_INSERT, 
2610: 54 4b 5f 55 50 44 41 54 45 20 2a 2f 0a 20 20 20  TK_UPDATE */.   
2620: 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20 20   int tr_tm,     
2630: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 65 20           /* one 
2640: 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b  of TK_BEFORE, TK
2650: 5f 41 46 54 45 52 20 2a 2f 0a 20 20 20 20 69 6e  _AFTER */.    in
2660: 74 20 66 6f 72 65 61 63 68 2c 20 20 20 20 20 20  t foreach,      
2670: 20 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66 20        /* one of 
2680: 54 4b 5f 52 4f 57 20 6f 72 20 54 4b 5f 53 54 41  TK_ROW or TK_STA
2690: 54 45 4d 45 4e 54 20 2a 2f 0a 20 20 20 20 45 78  TEMENT */.    Ex
26a0: 70 72 4c 69 73 74 20 2a 20 70 43 68 61 6e 67 65  prList * pChange
26b0: 73 29 0a 7b 0a 20 20 54 72 69 67 67 65 72 20 2a  s).{.  Trigger *
26c0: 20 74 74 3b 0a 0a 20 20 69 66 20 28 61 6c 77 61   tt;..  if (alwa
26d0: 79 73 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f  ys_code_trigger_
26e0: 73 65 74 75 70 29 20 72 65 74 75 72 6e 20 31 3b  setup) return 1;
26f0: 0a 0a 20 20 74 74 20 3d 20 70 54 72 69 67 67 65  ..  tt = pTrigge
2700: 72 3b 0a 20 20 77 68 69 6c 65 20 28 74 74 29 20  r;.  while (tt) 
2710: 7b 0a 20 20 20 20 69 66 20 28 74 74 2d 3e 6f 70  {.    if (tt->op
2720: 20 3d 3d 20 6f 70 20 26 26 20 74 74 2d 3e 74 72   == op && tt->tr
2730: 5f 74 6d 20 3d 3d 20 74 72 5f 74 6d 20 26 26 20  _tm == tr_tm && 
2740: 74 74 2d 3e 66 6f 72 65 61 63 68 20 3d 3d 20 66  tt->foreach == f
2750: 6f 72 65 61 63 68 20 26 26 0a 20 20 20 20 20 20  oreach &&.      
2760: 20 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65    checkColumnOve
2770: 72 4c 61 70 28 74 74 2d 3e 70 43 6f 6c 75 6d 6e  rLap(tt->pColumn
2780: 73 2c 20 70 43 68 61 6e 67 65 73 29 29 20 7b 0a  s, pChanges)) {.
2790: 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74 61        TriggerSta
27a0: 63 6b 20 2a 20 73 73 3b 0a 20 20 20 20 20 20 73  ck * ss;.      s
27b0: 73 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67  s = pParse->trig
27c0: 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 77 68 69  Stack;.      whi
27d0: 6c 65 20 28 73 73 20 26 26 20 73 73 2d 3e 70 54  le (ss && ss->pT
27e0: 72 69 67 67 65 72 20 21 3d 20 70 54 72 69 67 67  rigger != pTrigg
27f0: 65 72 29 20 73 73 20 3d 20 73 73 2d 3e 70 4e 65  er) ss = ss->pNe
2800: 78 74 3b 0a 20 20 20 20 20 20 69 66 20 28 21 73  xt;.      if (!s
2810: 73 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20  s) return 1;.   
2820: 20 7d 0a 20 20 20 20 74 74 20 3d 20 74 74 2d 3e   }.    tt = tt->
2830: 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNext;.  }..  re
2840: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
2850: 63 20 69 6e 74 20 63 6f 64 65 54 72 69 67 67 65  c int codeTrigge
2860: 72 50 72 6f 67 72 61 6d 28 0a 20 20 20 20 20 20  rProgram(.      
2870: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2880: 0a 20 20 20 20 20 20 20 20 54 72 69 67 67 65 72  .        Trigger
2890: 53 74 65 70 20 2a 20 70 72 6f 67 72 61 6d 2c 0a  Step * program,.
28a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 45 72          int onEr
28b0: 72 6f 72 29 0a 7b 0a 20 20 20 20 54 72 69 67 67  ror).{.    Trigg
28c0: 65 72 53 74 65 70 20 2a 20 73 74 65 70 20 3d 20  erStep * step = 
28d0: 70 72 6f 67 72 61 6d 3b 0a 20 20 20 20 69 6e 74  program;.    int
28e0: 20 6f 72 63 6f 6e 66 3b 0a 0a 20 20 20 20 77 68   orconf;..    wh
28f0: 69 6c 65 20 28 73 74 65 70 29 20 7b 0a 20 20 20  ile (step) {.   
2900: 20 20 20 20 20 69 6e 74 20 73 61 76 65 4e 54 61       int saveNTa
2910: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
2920: 3b 0a 20 20 20 20 20 20 20 20 6f 72 63 6f 6e 66  ;.        orconf
2930: 20 3d 20 28 6f 6e 45 72 72 6f 72 20 3d 3d 20 4f   = (onError == O
2940: 45 5f 44 65 66 61 75 6c 74 29 3f 73 74 65 70 2d  E_Default)?step-
2950: 3e 6f 72 63 6f 6e 66 3a 6f 6e 45 72 72 6f 72 3b  >orconf:onError;
2960: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
2970: 3e 74 72 69 67 53 74 61 63 6b 2d 3e 6f 72 63 6f  >trigStack->orco
2980: 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 20  nf = orconf;.   
2990: 20 20 20 20 20 73 77 69 74 63 68 28 73 74 65 70       switch(step
29a0: 2d 3e 6f 70 29 20 7b 0a 20 20 20 20 20 20 20 20  ->op) {.        
29b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
29c0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  CT: {.          
29d0: 20 20 20 20 20 20 69 6e 74 20 74 6d 70 5f 74 62        int tmp_tb
29e0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  l = pParse->nTab
29f0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2a00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2a10: 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62  dOp(pParse->pVdb
2a20: 65 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  e, OP_OpenTemp, 
2a30: 74 6d 70 5f 74 62 6c 2c 20 30 29 3b 0a 20 20 20  tmp_tbl, 0);.   
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2a50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 70 50 61  iteVdbeAddOp(pPa
2a60: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4b  rse->pVdbe, OP_K
2a70: 65 79 41 73 44 61 74 61 2c 20 74 6d 70 5f 74 62  eyAsData, tmp_tb
2a80: 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 1);.         
2a90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c         sqliteSel
2aa0: 65 63 74 28 70 50 61 72 73 65 2c 20 73 74 65 70  ect(pParse, step
2ab0: 2d 3e 70 53 65 6c 65 63 74 2c 20 0a 20 20 20 20  ->pSelect, .    
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74      SRT_Union, t
2ae0: 6d 70 5f 74 62 6c 2c 20 30 2c 20 30 2c 20 30 29  mp_tbl, 0, 0, 0)
2af0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b00: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
2b10: 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  p(pParse->pVdbe,
2b20: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 6d 70 5f 74   OP_Close, tmp_t
2b30: 62 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  bl, 0);.        
2b40: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
2b50: 6e 54 61 62 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nTab--;.        
2b60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b90: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
2ba0: 5f 55 50 44 41 54 45 3a 20 7b 0a 20 20 20 20 20  _UPDATE: {.     
2bb0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2bc0: 65 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73  eVdbeAddOp(pPars
2bd0: 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 50 75 73  e->pVdbe, OP_Pus
2be0: 68 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20  hList, 0, 0);.  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2c00: 6c 69 74 65 55 70 64 61 74 65 28 70 50 61 72 73  liteUpdate(pPars
2c10: 65 2c 20 26 73 74 65 70 2d 3e 74 61 72 67 65 74  e, &step->target
2c20: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2c30: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2c40: 65 45 78 70 72 4c 69 73 74 44 75 70 28 73 74 65  eExprListDup(ste
2c50: 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 2c 20 0a  p->pExprList), .
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
2c80: 70 72 44 75 70 28 73 74 65 70 2d 3e 70 57 68 65  prDup(step->pWhe
2c90: 72 65 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20  re), orconf);.  
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2cb0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 70 50  liteVdbeAddOp(pP
2cc0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
2cd0: 50 6f 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a  PopList, 0, 0);.
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2d20: 20 63 61 73 65 20 54 4b 5f 49 4e 53 45 52 54 3a   case TK_INSERT:
2d30: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2d40: 20 20 20 73 71 6c 69 74 65 49 6e 73 65 72 74 28     sqliteInsert(
2d50: 70 50 61 72 73 65 2c 20 26 73 74 65 70 2d 3e 74  pParse, &step->t
2d60: 61 72 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20  arget, .        
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75  sqliteExprListDu
2d90: 70 28 73 74 65 70 2d 3e 70 45 78 70 72 4c 69 73  p(step->pExprLis
2da0: 74 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  t), .           
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2dc0: 69 74 65 53 65 6c 65 63 74 44 75 70 28 73 74 65  iteSelectDup(ste
2dd0: 70 2d 3e 70 53 65 6c 65 63 74 29 2c 20 0a 20 20  p->pSelect), .  
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df0: 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69        sqliteIdLi
2e00: 73 74 44 75 70 28 73 74 65 70 2d 3e 70 49 64 4c  stDup(step->pIdL
2e10: 69 73 74 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20  ist), orconf);. 
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2e30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2e60: 63 61 73 65 20 54 4b 5f 44 45 4c 45 54 45 3a 20  case TK_DELETE: 
2e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e80: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
2e90: 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  p(pParse->pVdbe,
2ea0: 20 4f 50 5f 50 75 73 68 4c 69 73 74 2c 20 30 2c   OP_PushList, 0,
2eb0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2ec0: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
2ed0: 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 26 73  eFrom(pParse, &s
2ee0: 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 0a 20 20  tep->target, .  
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
2f10: 44 75 70 28 73 74 65 70 2d 3e 70 57 68 65 72 65  Dup(step->pWhere
2f20: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2f30: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2f50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 70 50 61  iteVdbeAddOp(pPa
2f60: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 50  rse->pVdbe, OP_P
2f70: 6f 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20  opList, 0, 0);. 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2f90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2fc0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
2ff0: 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
3000: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
3010: 3d 20 73 61 76 65 4e 54 61 62 3b 0a 20 20 20 20  = saveNTab;.    
3020: 20 20 20 20 73 74 65 70 20 3d 20 73 74 65 70 2d      step = step-
3030: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  >pNext;.    }.. 
3040: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a     return 0;.}..
3050: 69 6e 74 20 73 71 6c 69 74 65 43 6f 64 65 52 6f  int sqliteCodeRo
3060: 77 54 72 69 67 67 65 72 28 0a 20 20 20 20 20 20  wTrigger(.      
3070: 20 20 50 61 72 73 65 20 2a 20 70 50 61 72 73 65    Parse * pParse
3080: 2c 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74  ,  /* Parse cont
3090: 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ext */.        i
30a0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
30b0: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 50 44  /* One of TK_UPD
30c0: 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20  ATE, TK_INSERT, 
30d0: 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20  TK_DELETE */.   
30e0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 20       ExprList * 
30f0: 63 68 61 6e 67 65 73 2c 20 2f 2a 20 43 68 61 6e  changes, /* Chan
3100: 67 65 73 20 6c 69 73 74 20 66 6f 72 20 61 6e 79  ges list for any
3110: 20 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67   UPDATE OF trigg
3120: 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ers */.        i
3130: 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20  nt tr_tm,       
3140: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 42 45 46  /* One of TK_BEF
3150: 4f 52 45 2c 20 54 4b 5f 41 46 54 45 52 20 2a 2f  ORE, TK_AFTER */
3160: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
3170: 20 74 62 6c 2c 20 20 20 20 20 2f 2a 20 54 68 65   tbl,     /* The
3180: 20 74 61 62 6c 65 20 74 6f 20 63 6f 64 65 20 74   table to code t
3190: 72 69 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f 0a  riggers from */.
31a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 65 77 54          int newT
31b0: 61 62 6c 65 2c 20 20 20 20 2f 2a 20 54 68 65 20  able,    /* The 
31c0: 69 6e 64 69 63 65 20 6f 66 20 74 68 65 20 22 6e  indice of the "n
31d0: 65 77 22 20 72 6f 77 20 74 6f 20 61 63 63 65 73  ew" row to acces
31e0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  s */.        int
31f0: 20 6f 6c 64 54 61 62 6c 65 2c 20 20 20 20 2f 2a   oldTable,    /*
3200: 20 54 68 65 20 69 6e 64 69 63 65 20 6f 66 20 74   The indice of t
3210: 68 65 20 22 6f 6c 64 22 20 72 6f 77 20 74 6f 20  he "old" row to 
3220: 61 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  access */.      
3230: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 20 20    int onError)  
3240: 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     /* ON CONFLIC
3250: 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 7b 0a 20 20  T policy */.{.  
3260: 54 72 69 67 67 65 72 20 2a 20 70 54 72 69 67 67  Trigger * pTrigg
3270: 65 72 3b 0a 20 20 54 72 69 67 67 65 72 53 74 61  er;.  TriggerSta
3280: 63 6b 20 2a 20 70 54 72 69 67 67 65 72 53 74 61  ck * pTriggerSta
3290: 63 6b 3b 0a 0a 0a 20 20 61 73 73 65 72 74 28 6f  ck;...  assert(o
32a0: 70 20 3d 3d 20 54 4b 5f 55 50 44 41 54 45 20 7c  p == TK_UPDATE |
32b0: 7c 20 6f 70 20 3d 3d 20 54 4b 5f 49 4e 53 45 52  | op == TK_INSER
32c0: 54 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 44 45  T || op == TK_DE
32d0: 4c 45 54 45 29 3b 0a 20 20 61 73 73 65 72 74 28  LETE);.  assert(
32e0: 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 42 45 46 4f  tr_tm == TK_BEFO
32f0: 52 45 20 7c 7c 20 74 72 5f 74 6d 20 3d 3d 20 54  RE || tr_tm == T
3300: 4b 5f 41 46 54 45 52 29 3b 0a 0a 20 20 61 73 73  K_AFTER);..  ass
3310: 65 72 74 28 6e 65 77 54 61 62 6c 65 20 21 3d 20  ert(newTable != 
3320: 2d 31 20 7c 7c 20 6f 6c 64 54 61 62 6c 65 20 21  -1 || oldTable !
3330: 3d 20 2d 31 29 3b 0a 0a 20 20 70 54 72 69 67 67  = -1);..  pTrigg
3340: 65 72 20 3d 20 74 62 6c 2d 3e 70 54 72 69 67 67  er = tbl->pTrigg
3350: 65 72 3b 0a 20 20 77 68 69 6c 65 20 28 70 54 72  er;.  while (pTr
3360: 69 67 67 65 72 29 20 7b 0a 20 20 20 20 69 6e 74  igger) {.    int
3370: 20 66 69 72 65 5f 74 68 69 73 20 3d 20 30 3b 0a   fire_this = 0;.
3380: 0a 20 20 20 20 2f 2a 20 64 65 74 65 72 6d 69 6e  .    /* determin
3390: 65 20 77 68 65 74 68 65 72 20 77 65 20 73 68 6f  e whether we sho
33a0: 75 6c 64 20 63 6f 64 65 20 74 68 69 73 20 74 72  uld code this tr
33b0: 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 20  igger */.    if 
33c0: 28 70 54 72 69 67 67 65 72 2d 3e 6f 70 20 3d 3d  (pTrigger->op ==
33d0: 20 6f 70 20 26 26 20 70 54 72 69 67 67 65 72 2d   op && pTrigger-
33e0: 3e 74 72 5f 74 6d 20 3d 3d 20 74 72 5f 74 6d 20  >tr_tm == tr_tm 
33f0: 26 26 20 0a 20 20 20 20 20 20 20 20 70 54 72 69  && .        pTri
3400: 67 67 65 72 2d 3e 66 6f 72 65 61 63 68 20 3d 3d  gger->foreach ==
3410: 20 54 4b 5f 52 4f 57 29 20 7b 0a 20 20 20 20 20   TK_ROW) {.     
3420: 20 66 69 72 65 5f 74 68 69 73 20 3d 20 31 3b 0a   fire_this = 1;.
3430: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74        pTriggerSt
3440: 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72  ack = pParse->tr
3450: 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 77  igStack;.      w
3460: 68 69 6c 65 20 28 70 54 72 69 67 67 65 72 53 74  hile (pTriggerSt
3470: 61 63 6b 29 20 7b 0a 20 20 20 20 20 20 20 20 69  ack) {.        i
3480: 66 20 28 70 54 72 69 67 67 65 72 53 74 61 63 6b  f (pTriggerStack
3490: 2d 3e 70 54 72 69 67 67 65 72 20 3d 3d 20 70 54  ->pTrigger == pT
34a0: 72 69 67 67 65 72 29 20 66 69 72 65 5f 74 68 69  rigger) fire_thi
34b0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  s = 0;.        p
34c0: 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70  TriggerStack = p
34d0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 4e  TriggerStack->pN
34e0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
34f0: 20 20 20 69 66 20 28 6f 70 20 3d 3d 20 54 4b 5f     if (op == TK_
3500: 55 50 44 41 54 45 20 26 26 20 70 54 72 69 67 67  UPDATE && pTrigg
3510: 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 20 26 26 0a  er->pColumns &&.
3520: 20 20 20 20 20 20 20 20 20 20 21 63 68 65 63 6b            !check
3530: 43 6f 6c 75 6d 6e 4f 76 65 72 4c 61 70 28 70 54  ColumnOverLap(pT
3540: 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73  rigger->pColumns
3550: 2c 20 63 68 61 6e 67 65 73 29 29 0a 20 20 20 20  , changes)).    
3560: 20 20 20 20 66 69 72 65 5f 74 68 69 73 20 3d 20      fire_this = 
3570: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  0;.    }..    if
3580: 20 28 66 69 72 65 5f 74 68 69 73 29 20 7b 0a 20   (fire_this) {. 
3590: 20 20 20 20 20 69 6e 74 20 65 6e 64 54 72 69 67       int endTrig
35a0: 67 65 72 3b 0a 20 20 20 20 20 20 49 64 4c 69 73  ger;.      IdLis
35b0: 74 20 64 75 6d 6d 79 54 61 62 6c 69 73 74 3b 0a  t dummyTablist;.
35c0: 20 20 20 20 20 20 45 78 70 72 20 2a 20 77 68 65        Expr * whe
35d0: 6e 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 64 75  nExpr;..      du
35e0: 6d 6d 79 54 61 62 6c 69 73 74 2e 6e 49 64 20 3d  mmyTablist.nId =
35f0: 20 30 3b 0a 20 20 20 20 20 20 64 75 6d 6d 79 54   0;.      dummyT
3600: 61 62 6c 69 73 74 2e 61 20 3d 20 30 3b 0a 0a 20  ablist.a = 0;.. 
3610: 20 20 20 20 20 2f 2a 20 50 75 73 68 20 61 6e 20       /* Push an 
3620: 65 6e 74 72 79 20 6f 6e 20 74 6f 20 74 68 65 20  entry on to the 
3630: 74 72 69 67 67 65 72 20 73 74 61 63 6b 20 2a 2f  trigger stack */
3640: 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 53  .      pTriggerS
3650: 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c  tack = sqliteMal
3660: 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69 67 67  loc(sizeof(Trigg
3670: 65 72 53 74 61 63 6b 29 29 3b 0a 20 20 20 20 20  erStack));.     
3680: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
3690: 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
36a0: 67 65 72 3b 0a 20 20 20 20 20 20 70 54 72 69 67  ger;.      pTrig
36b0: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
36c0: 20 3d 20 6e 65 77 54 61 62 6c 65 3b 0a 20 20 20   = newTable;.   
36d0: 20 20 20 70 54 72 69 67 67 65 72 53 74 61 63 6b     pTriggerStack
36e0: 2d 3e 6f 6c 64 49 64 78 20 3d 20 6f 6c 64 54 61  ->oldIdx = oldTa
36f0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 72 69 67  ble;.      pTrig
3700: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 3d  gerStack->pTab =
3710: 20 74 62 6c 3b 0a 20 20 20 20 20 20 70 54 72 69   tbl;.      pTri
3720: 67 67 65 72 53 74 61 63 6b 2d 3e 70 4e 65 78 74  ggerStack->pNext
3730: 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53   = pParse->trigS
3740: 74 61 63 6b 3b 0a 20 20 20 20 20 20 70 50 61 72  tack;.      pPar
3750: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20  se->trigStack = 
3760: 70 54 72 69 67 67 65 72 53 74 61 63 6b 3b 0a 0a  pTriggerStack;..
3770: 20 20 20 20 20 20 2f 2a 20 63 6f 64 65 20 74 68        /* code th
3780: 65 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  e WHEN clause */
3790: 0a 20 20 20 20 20 20 65 6e 64 54 72 69 67 67 65  .      endTrigge
37a0: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  r = sqliteVdbeMa
37b0: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 2d 3e  keLabel(pParse->
37c0: 70 56 64 62 65 29 3b 0a 20 20 20 20 20 20 77 68  pVdbe);.      wh
37d0: 65 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45  enExpr = sqliteE
37e0: 78 70 72 44 75 70 28 70 54 72 69 67 67 65 72 2d  xprDup(pTrigger-
37f0: 3e 70 57 68 65 6e 29 3b 0a 20 20 20 20 20 20 69  >pWhen);.      i
3800: 66 20 28 73 71 6c 69 74 65 45 78 70 72 52 65 73  f (sqliteExprRes
3810: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
3820: 30 2c 20 26 64 75 6d 6d 79 54 61 62 6c 69 73 74  0, &dummyTablist
3830: 2c 20 30 2c 20 77 68 65 6e 45 78 70 72 29 29 20  , 0, whenExpr)) 
3840: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  {.        pParse
3850: 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 70 50  ->trigStack = pP
3860: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d  arse->trigStack-
3870: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
3880: 73 71 6c 69 74 65 46 72 65 65 28 70 54 72 69 67  sqliteFree(pTrig
3890: 67 65 72 53 74 61 63 6b 29 3b 0a 20 20 20 20 20  gerStack);.     
38a0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
38b0: 65 74 65 28 77 68 65 6e 45 78 70 72 29 3b 0a 20  ete(whenExpr);. 
38c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
38d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
38e0: 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65  qliteExprIfFalse
38f0: 28 70 50 61 72 73 65 2c 20 77 68 65 6e 45 78 70  (pParse, whenExp
3900: 72 2c 20 65 6e 64 54 72 69 67 67 65 72 29 3b 0a  r, endTrigger);.
3910: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
3920: 44 65 6c 65 74 65 28 77 68 65 6e 45 78 70 72 29  Delete(whenExpr)
3930: 3b 0a 0a 20 20 20 20 20 20 63 6f 64 65 54 72 69  ;..      codeTri
3940: 67 67 65 72 50 72 6f 67 72 61 6d 28 70 50 61 72  ggerProgram(pPar
3950: 73 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 73 74  se, pTrigger->st
3960: 65 70 5f 6c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  ep_list, onError
3970: 29 3b 20 0a 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ); ..      /* Po
3980: 70 20 74 68 65 20 65 6e 74 72 79 20 6f 66 66 20  p the entry off 
3990: 74 68 65 20 74 72 69 67 67 65 72 20 73 74 61 63  the trigger stac
39a0: 6b 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73  k */.      pPars
39b0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 70  e->trigStack = p
39c0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
39d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
39e0: 71 6c 69 74 65 46 72 65 65 28 70 54 72 69 67 67  qliteFree(pTrigg
39f0: 65 72 53 74 61 63 6b 29 3b 0a 0a 20 20 20 20 20  erStack);..     
3a00: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
3a10: 76 65 4c 61 62 65 6c 28 70 50 61 72 73 65 2d 3e  veLabel(pParse->
3a20: 70 56 64 62 65 2c 20 65 6e 64 54 72 69 67 67 65  pVdbe, endTrigge
3a30: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  r);.    }.    pT
3a40: 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
3a50: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20  r->pNext;.  }.. 
3a60: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3a70: 0a 20 2a 20 48 61 6e 64 6c 65 20 55 50 44 41 54  . * Handle UPDAT
3a80: 45 20 61 6e 64 20 44 45 4c 45 54 45 20 74 72 69  E and DELETE tri
3a90: 67 67 65 72 73 20 6f 6e 20 76 69 65 77 73 0a 20  ggers on views. 
3aa0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 69  */.void sqliteVi
3ab0: 65 77 54 72 69 67 67 65 72 73 28 50 61 72 73 65  ewTriggers(Parse
3ac0: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
3ad0: 2a 70 54 61 62 2c 20 0a 20 20 20 20 45 78 70 72  *pTab, .    Expr
3ae0: 20 2a 20 70 57 68 65 72 65 2c 20 69 6e 74 20 6f   * pWhere, int o
3af0: 6e 45 72 72 6f 72 2c 20 45 78 70 72 4c 69 73 74  nError, ExprList
3b00: 20 2a 20 70 43 68 61 6e 67 65 73 29 0a 7b 0a 20   * pChanges).{. 
3b10: 20 69 6e 74 20 6f 6c 64 49 64 78 20 3d 20 2d 31   int oldIdx = -1
3b20: 3b 0a 20 20 69 6e 74 20 6e 65 77 49 64 78 20 3d  ;.  int newIdx =
3b30: 20 2d 31 3b 0a 20 20 69 6e 74 20 2a 61 58 52 65   -1;.  int *aXRe
3b40: 66 20 3d 20 30 3b 20 20 20 0a 20 20 56 64 62 65  f = 0;   .  Vdbe
3b50: 20 2a 76 3b 0a 20 20 69 6e 74 20 65 6e 64 4f 66   *v;.  int endOf
3b60: 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 73 74 61 72  Loop;.  int star
3b70: 74 4f 66 4c 6f 6f 70 3b 0a 20 20 53 65 6c 65 63  tOfLoop;.  Selec
3b80: 74 20 74 68 65 53 65 6c 65 63 74 3b 0a 20 20 54  t theSelect;.  T
3b90: 6f 6b 65 6e 20 74 62 6c 4e 61 6d 65 54 6f 6b 65  oken tblNameToke
3ba0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 70 54 61  n;..  assert(pTa
3bb0: 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 0a 20 20  b->pSelect);..  
3bc0: 74 62 6c 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 3d  tblNameToken.z =
3bd0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
3be0: 74 62 6c 4e 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d  tblNameToken.n =
3bf0: 20 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a 4e   strlen(pTab->zN
3c00: 61 6d 65 29 3b 0a 0a 20 20 74 68 65 53 65 6c 65  ame);..  theSele
3c10: 63 74 2e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  ct.isDistinct = 
3c20: 30 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 70  0;.  theSelect.p
3c30: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  EList = sqliteEx
3c40: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
3c50: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4c  sqliteExpr(TK_AL
3c60: 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b  L, 0, 0, 0), 0);
3c70: 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 70 53 72  .  theSelect.pSr
3c80: 63 20 20 20 3d 20 73 71 6c 69 74 65 49 64 4c 69  c   = sqliteIdLi
3c90: 73 74 41 70 70 65 6e 64 28 30 2c 20 26 74 62 6c  stAppend(0, &tbl
3ca0: 4e 61 6d 65 54 6f 6b 65 6e 29 3b 0a 20 20 74 68  NameToken);.  th
3cb0: 65 53 65 6c 65 63 74 2e 70 57 68 65 72 65 20 3d  eSelect.pWhere =
3cc0: 20 70 57 68 65 72 65 3b 20 20 20 20 70 57 68 65   pWhere;    pWhe
3cd0: 72 65 20 3d 20 30 3b 0a 20 20 74 68 65 53 65 6c  re = 0;.  theSel
3ce0: 65 63 74 2e 70 47 72 6f 75 70 42 79 20 3d 20 30  ect.pGroupBy = 0
3cf0: 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 70 48  ;.  theSelect.pH
3d00: 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 74 68 65  aving = 0;.  the
3d10: 53 65 6c 65 63 74 2e 70 4f 72 64 65 72 42 79 20  Select.pOrderBy 
3d20: 3d 20 30 3b 0a 20 20 74 68 65 53 65 6c 65 63 74  = 0;.  theSelect
3d30: 2e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  .op = TK_SELECT;
3d40: 20 2f 2a 20 3f 3f 20 2a 2f 0a 20 20 74 68 65 53   /* ?? */.  theS
3d50: 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 3d 20 30  elect.pPrior = 0
3d60: 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 6e 4c  ;.  theSelect.nL
3d70: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 74 68 65  imit = -1;.  the
3d80: 53 65 6c 65 63 74 2e 6e 4f 66 66 73 65 74 20 3d  Select.nOffset =
3d90: 20 2d 31 3b 0a 20 20 74 68 65 53 65 6c 65 63 74   -1;.  theSelect
3da0: 2e 7a 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  .zSelect = 0;.  
3db0: 74 68 65 53 65 6c 65 63 74 2e 62 61 73 65 20 3d  theSelect.base =
3dc0: 20 30 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74   0;..  v = sqlit
3dd0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
3de0: 3b 0a 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20  ;.  assert(v);. 
3df0: 20 73 71 6c 69 74 65 42 65 67 69 6e 4d 75 6c 74   sqliteBeginMult
3e00: 69 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  iWriteOperation(
3e10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 41  pParse);..  /* A
3e20: 6c 6c 6f 63 61 74 65 20 74 65 6d 70 20 74 61 62  llocate temp tab
3e30: 6c 65 73 20 2a 2f 0a 20 20 6f 6c 64 49 64 78 20  les */.  oldIdx 
3e40: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
3e50: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
3e60: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
3e70: 6d 70 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b 0a  mp, oldIdx, 0);.
3e80: 20 20 69 66 20 28 70 43 68 61 6e 67 65 73 29 20    if (pChanges) 
3e90: 7b 0a 20 20 20 20 6e 65 77 49 64 78 20 3d 20 70  {.    newIdx = p
3ea0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
3eb0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3ec0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
3ed0: 70 2c 20 6e 65 77 49 64 78 2c 20 30 29 3b 0a 20  p, newIdx, 0);. 
3ee0: 20 7d 0a 0a 20 20 2f 2a 20 53 6e 61 70 73 68 6f   }..  /* Snapsho
3ef0: 74 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  t the view */.  
3f00: 69 66 20 28 73 71 6c 69 74 65 53 65 6c 65 63 74  if (sqliteSelect
3f10: 28 70 50 61 72 73 65 2c 20 26 74 68 65 53 65 6c  (pParse, &theSel
3f20: 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  ect, SRT_Table, 
3f30: 6f 6c 64 49 64 78 2c 20 30 2c 20 30 2c 20 30 29  oldIdx, 0, 0, 0)
3f40: 29 20 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69  ) {.    goto tri
3f50: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
3f60: 7d 0a 0a 20 20 2f 2a 20 6c 6f 6f 70 20 74 68 72  }..  /* loop thr
3f70: 75 20 74 68 65 20 76 69 65 77 20 73 6e 61 70 73  u the view snaps
3f80: 68 6f 74 2c 20 65 78 65 63 75 74 69 6e 67 20 74  hot, executing t
3f90: 72 69 67 67 65 72 73 20 66 6f 72 20 65 61 63 68  riggers for each
3fa0: 20 72 6f 77 20 2a 2f 0a 20 20 65 6e 64 4f 66 4c   row */.  endOfL
3fb0: 6f 6f 70 20 3d 20 73 71 6c 69 74 65 56 64 62 65  oop = sqliteVdbe
3fc0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
3fd0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3fe0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 6f 6c  v, OP_Rewind, ol
3ff0: 64 49 64 78 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29  dIdx, endOfLoop)
4000: 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  ;..  /* Loop thr
4010: 75 20 74 68 65 20 76 69 65 77 20 73 6e 61 70 73  u the view snaps
4020: 68 6f 74 2c 20 65 78 65 63 75 74 69 6e 67 20 74  hot, executing t
4030: 72 69 67 67 65 72 73 20 66 6f 72 20 65 61 63 68  riggers for each
4040: 20 72 6f 77 20 2a 2f 0a 20 20 73 74 61 72 74 4f   row */.  startO
4050: 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 56 64  fLoop = sqliteVd
4060: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4070: 3b 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 74 68  ;..  /* Build th
4080: 65 20 75 70 64 61 74 65 64 20 72 6f 77 20 69 66  e updated row if
4090: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
40a0: 66 20 28 70 43 68 61 6e 67 65 73 29 20 7b 0a 20  f (pChanges) {. 
40b0: 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a     int ii, jj;..
40c0: 20 20 20 20 61 58 52 65 66 20 3d 20 73 71 6c 69      aXRef = sqli
40d0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
40e0: 28 69 6e 74 29 20 2a 20 70 54 61 62 2d 3e 6e 43  (int) * pTab->nC
40f0: 6f 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 61 58  ol );.    if( aX
4100: 52 65 66 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72  Ref==0 ) goto tr
4110: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
4120: 20 20 20 66 6f 72 20 28 69 69 20 3d 20 30 3b 20     for (ii = 0; 
4130: 69 69 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ii < pTab->nCol;
4140: 20 69 69 2b 2b 29 0a 20 20 20 20 20 20 61 58 52   ii++).      aXR
4150: 65 66 5b 69 69 5d 20 3d 20 2d 31 3b 0a 0a 20 20  ef[ii] = -1;..  
4160: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
4170: 43 68 61 6e 67 65 73 2d 3e 6e 45 78 70 72 3b 20  Changes->nExpr; 
4180: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  ii++){.      int
4190: 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 73   jj;.      if( s
41a0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
41b0: 49 64 73 28 70 50 61 72 73 65 2c 20 6f 6c 64 49  Ids(pParse, oldI
41c0: 64 78 2c 20 74 68 65 53 65 6c 65 63 74 2e 70 53  dx, theSelect.pS
41d0: 72 63 20 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  rc , 0, .       
41e0: 20 20 20 20 20 70 43 68 61 6e 67 65 73 2d 3e 61       pChanges->a
41f0: 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 0a 20 20  [ii].pExpr) ).  
4200: 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67        goto trigg
4210: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 20  er_cleanup;..   
4220: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
4230: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
4240: 43 68 61 6e 67 65 73 2d 3e 61 5b 69 69 5d 2e 70  Changes->a[ii].p
4250: 45 78 70 72 2c 20 30 2c 20 30 29 20 29 0a 20 20  Expr, 0, 0) ).  
4260: 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67        goto trigg
4270: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 20  er_cleanup;..   
4280: 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
4290: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 6a 2b 2b  pTab->nCol; jj++
42a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
42b0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 54 61  qliteStrICmp(pTa
42c0: 62 2d 3e 61 43 6f 6c 5b 6a 6a 5d 2e 7a 4e 61 6d  b->aCol[jj].zNam
42d0: 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69  e, pChanges->a[i
42e0: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
42f0: 20 20 20 20 20 20 20 20 20 20 61 58 52 65 66 5b            aXRef[
4300: 6a 6a 5d 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  jj] = ii;.      
4310: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4320: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4330: 20 20 20 69 66 28 20 6a 6a 3e 3d 70 54 61 62 2d     if( jj>=pTab-
4340: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
4350: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
4360: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
4370: 67 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75  g, "no such colu
4380: 6d 6e 3a 20 22 2c 20 0a 20 20 20 20 20 20 20 20  mn: ", .        
4390: 20 20 20 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b      pChanges->a[
43a0: 69 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ii].zName, 0);. 
43b0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
43c0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67  Err++;.        g
43d0: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
43e0: 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nup;.      }.   
43f0: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 56 64   }..    sqliteVd
4400: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
4410: 74 65 67 65 72 2c 20 31 33 2c 20 30 29 3b 0a 0a  teger, 13, 0);..
4420: 20 20 20 20 66 6f 72 20 28 69 69 20 3d 20 30 3b      for (ii = 0;
4430: 20 69 69 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c   ii < pTab->nCol
4440: 3b 20 69 69 2b 2b 29 0a 20 20 20 20 20 20 69 66  ; ii++).      if
4450: 28 20 61 58 52 65 66 5b 69 69 5d 20 3c 20 30 20  ( aXRef[ii] < 0 
4460: 29 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ) .        sqlit
4470: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4480: 5f 43 6f 6c 75 6d 6e 2c 20 6f 6c 64 49 64 78 2c  _Column, oldIdx,
4490: 20 69 69 29 3b 0a 20 20 20 20 20 20 65 6c 73 65   ii);.      else
44a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45  .        sqliteE
44b0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
44c0: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 61 58 52 65  pChanges->a[aXRe
44d0: 66 5b 69 69 5d 5d 2e 70 45 78 70 72 29 3b 0a 0a  f[ii]].pExpr);..
44e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
44f0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
4500: 63 6f 72 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  cord, pTab->nCol
4510: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4520: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4530: 50 75 74 49 6e 74 4b 65 79 2c 20 6e 65 77 49 64  PutIntKey, newId
4540: 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
4550: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4560: 5f 52 65 77 69 6e 64 2c 20 6e 65 77 49 64 78 2c  _Rewind, newIdx,
4570: 20 30 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65   0);..    sqlite
4580: 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70  CodeRowTrigger(p
4590: 50 61 72 73 65 2c 20 54 4b 5f 55 50 44 41 54 45  Parse, TK_UPDATE
45a0: 2c 20 70 43 68 61 6e 67 65 73 2c 20 54 4b 5f 42  , pChanges, TK_B
45b0: 45 46 4f 52 45 2c 20 0a 20 20 20 20 20 20 20 20  EFORE, .        
45c0: 70 54 61 62 2c 20 6e 65 77 49 64 78 2c 20 6f 6c  pTab, newIdx, ol
45d0: 64 49 64 78 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a  dIdx, onError);.
45e0: 20 20 20 20 73 71 6c 69 74 65 43 6f 64 65 52 6f      sqliteCodeRo
45f0: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
4600: 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 43 68 61   TK_UPDATE, pCha
4610: 6e 67 65 73 2c 20 54 4b 5f 41 46 54 45 52 2c 20  nges, TK_AFTER, 
4620: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c 20 6e  .        pTab, n
4630: 65 77 49 64 78 2c 20 6f 6c 64 49 64 78 2c 20 6f  ewIdx, oldIdx, o
4640: 6e 45 72 72 6f 72 29 3b 0a 20 20 7d 20 65 6c 73  nError);.  } els
4650: 65 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f  e {.    sqliteCo
4660: 64 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61  deRowTrigger(pPa
4670: 72 73 65 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20  rse, TK_DELETE, 
4680: 30 2c 20 54 4b 5f 42 45 46 4f 52 45 2c 20 70 54  0, TK_BEFORE, pT
4690: 61 62 2c 20 2d 31 2c 20 6f 6c 64 49 64 78 2c 20  ab, -1, oldIdx, 
46a0: 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
46b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 64  );.    sqliteCod
46c0: 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72  eRowTrigger(pPar
46d0: 73 65 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30  se, TK_DELETE, 0
46e0: 2c 20 54 4b 5f 41 46 54 45 52 2c 20 70 54 61 62  , TK_AFTER, pTab
46f0: 2c 20 2d 31 2c 20 6f 6c 64 49 64 78 2c 20 0a 20  , -1, oldIdx, . 
4700: 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 29 3b         onError);
4710: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 56 64  .  }..  sqliteVd
4720: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
4730: 78 74 2c 20 6f 6c 64 49 64 78 2c 20 73 74 61 72  xt, oldIdx, star
4740: 74 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20 73 71 6c  tOfLoop);..  sql
4750: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
4760: 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f 70  bel(v, endOfLoop
4770: 29 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64 57 72  );.  sqliteEndWr
4780: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
4790: 72 73 65 29 3b 0a 0a 74 72 69 67 67 65 72 5f 63  rse);..trigger_c
47a0: 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
47b0: 46 72 65 65 28 61 58 52 65 66 29 3b 0a 20 20 73  Free(aXRef);.  s
47c0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
47d0: 65 74 65 28 70 43 68 61 6e 67 65 73 29 3b 0a 20  ete(pChanges);. 
47e0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
47f0: 65 28 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c  e(pWhere);.  sql
4800: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
4810: 65 28 74 68 65 53 65 6c 65 63 74 2e 70 45 4c 69  e(theSelect.pELi
4820: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 49 64 4c  st);.  sqliteIdL
4830: 69 73 74 44 65 6c 65 74 65 28 74 68 65 53 65 6c  istDelete(theSel
4840: 65 63 74 2e 70 53 72 63 29 3b 0a 20 20 73 71 6c  ect.pSrc);.  sql
4850: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 74 68  iteExprDelete(th
4860: 65 53 65 6c 65 63 74 2e 70 57 68 65 72 65 29 3b  eSelect.pWhere);
4870: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.