/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact b8df3e8f0952979bbbcbd0cb05b7d564924a3282:


0000: 2f 2a 0a 20 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 20 2a  y the author.. *
0040: 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22  . */..#include "
0050: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 2f 2a 0a  sqliteInt.h"./*.
0060: 20 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65   * This is calle
0070: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
0080: 77 68 65 6e 20 69 74 20 73 65 65 73 20 61 20 43  when it sees a C
0090: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 73 74  REATE TRIGGER st
00a0: 61 74 65 6d 65 6e 74 0a 20 2a 2f 0a 76 6f 69 64  atement. */.void
00b0: 20 0a 73 71 6c 69 74 65 43 72 65 61 74 65 54 72   .sqliteCreateTr
00c0: 69 67 67 65 72 28 0a 20 20 20 20 50 61 72 73 65  igger(.    Parse
00d0: 20 2a 20 70 50 61 72 73 65 2c 20 2f 2a 20 54 68   * pParse, /* Th
00e0: 65 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74 20  e parse context 
00f0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 52  of the CREATE TR
0100: 49 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74 20  IGGER statement 
0110: 2a 2f 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 20 6e  */.    Token * n
0120: 6d 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61  m,     /* The na
0130: 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  me of the trigge
0140: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 72 5f  r */.    int tr_
0150: 74 6d 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  tm,      /* 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 20 20 69 6e  _AFTER */.    in
0180: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 2f 2a  t op,         /*
0190: 20 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e 53 45 52   One of TK_INSER
01a0: 54 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b  T, TK_UPDATE, TK
01b0: 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20 20 49  _DELETE */.    I
01c0: 64 4c 69 73 74 20 2a 20 63 6f 6c 73 2c 20 20 2f  dList * cols,  /
01d0: 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 69 66  * column list if
01e0: 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41   this is an UPDA
01f0: 54 45 20 4f 46 20 74 72 69 67 67 65 72 20 2a 2f  TE OF trigger */
0200: 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 20 74 62 6c  .    Token * tbl
0210: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ,    /* The name
0220: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2f 76 69   of the table/vi
0230: 65 77 20 74 68 65 20 74 72 69 67 67 65 72 20 61  ew the trigger a
0240: 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 20  pplies to */.   
0250: 20 69 6e 74 20 66 6f 72 65 61 63 68 2c 20 20 20   int foreach,   
0260: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 52 4f   /* One of TK_RO
0270: 57 20 6f 72 20 54 4b 5f 53 54 41 54 45 4d 45 4e  W or TK_STATEMEN
0280: 54 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 20  T */.    Expr * 
0290: 70 57 68 65 6e 2c 20 20 20 2f 2a 20 57 48 45 4e  pWhen,   /* WHEN
02a0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 54   clause */.    T
02b0: 72 69 67 67 65 72 53 74 65 70 20 2a 20 73 74 65  riggerStep * ste
02c0: 70 73 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ps,      /* The 
02d0: 74 72 69 67 67 65 72 65 64 20 70 72 6f 67 72 61  triggered progra
02e0: 6d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  m */.    char co
02f0: 6e 73 74 20 2a 20 63 63 2c 20 69 6e 74 20 6c 65  nst * cc, int le
0300: 6e 29 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67  n) /* The string
0310: 20 64 61 74 61 20 74 6f 20 6d 61 6b 65 20 70 65   data to make pe
0320: 72 73 69 73 74 65 6e 74 20 2a 2f 0a 7b 0a 20 20  rsistent */.{.  
0330: 54 72 69 67 67 65 72 20 2a 20 6e 74 3b 0a 20 20  Trigger * nt;.  
0340: 54 61 62 6c 65 20 20 20 2a 20 74 61 62 3b 0a 20  Table   * tab;. 
0350: 20 69 6e 74 20 6f 66 66 73 65 74 3b 0a 20 20 54   int offset;.  T
0360: 72 69 67 67 65 72 53 74 65 70 20 2a 20 73 73 3b  riggerStep * ss;
0370: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
0380: 74 3a 20 0a 20 20 20 20 20 31 2e 20 74 68 65 20  t: .     1. the 
0390: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 64 6f 65  trigger name doe
03a0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
03b0: 69 73 74 2e 0a 20 20 20 20 20 32 2e 20 74 68 65  ist..     2. the
03c0: 20 74 61 62 6c 65 20 28 6f 72 20 76 69 65 77 29   table (or view)
03d0: 20 64 6f 65 73 20 65 78 69 73 74 2e 0a 20 20 20   does exist..   
03e0: 2a 2f 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20  */.  {.    char 
03f0: 2a 20 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 20   nm->n);.    if 
0420: 28 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 29 20 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 09 20 20 6e 6d 2d 3e  r ", -1,..  nm->
04a0: 7a 2c 20 6e 6d 2d 3e 6e 2c 20 22 20 61 6c 72 65  z, nm->n, " alre
04b0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 2d 31 2c  ady exists", -1,
04c0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
04d0: 65 46 72 65 65 28 74 6d 70 5f 73 74 72 29 3b 0a  eFree(tmp_str);.
04e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
04f0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rr++;.      goto
0500: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
0510: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
0520: 74 65 46 72 65 65 28 74 6d 70 5f 73 74 72 29 3b  teFree(tmp_str);
0530: 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20 63 68 61  .  }.  {.    cha
0540: 72 20 2a 20 74 6d 70 5f 73 74 72 20 3d 20 73 71  r * tmp_str = sq
0550: 6c 69 74 65 53 74 72 4e 44 75 70 28 74 62 6c 2d  liteStrNDup(tbl-
0560: 3e 7a 2c 20 74 62 6c 2d 3e 6e 29 3b 0a 20 20 20  >z, tbl->n);.   
0570: 20 74 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e   tab = sqliteFin
0580: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
0590: 62 2c 20 74 6d 70 5f 73 74 72 29 3b 0a 20 20 20  b, tmp_str);.   
05a0: 20 73 71 6c 69 74 65 46 72 65 65 28 74 6d 70 5f   sqliteFree(tmp_
05b0: 73 74 72 29 3b 0a 20 20 20 20 69 66 20 28 21 74  str);.    if (!t
05c0: 61 62 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab) {.      sqli
05d0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
05e0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
05f0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
0600: 2c 20 2d 31 2c 0a 09 20 20 74 62 6c 2d 3e 7a 2c  , -1,..  tbl->z,
0610: 20 74 62 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20   tbl->n, 0);.   
0620: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
0630: 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72  +;.      goto tr
0640: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
0650: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
0660: 75 69 6c 64 20 74 68 65 20 54 72 69 67 67 65 72  uild the Trigger
0670: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 6e 74 20   object */.  nt 
0680: 3d 20 28 54 72 69 67 67 65 72 20 2a 29 73 71 6c  = (Trigger *)sql
0690: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
06a0: 28 54 72 69 67 67 65 72 29 29 3b 0a 0a 20 20 6e  (Trigger));..  n
06b0: 74 2d 3e 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t->name = sqlite
06c0: 53 74 72 4e 44 75 70 28 6e 6d 2d 3e 7a 2c 20 6e  StrNDup(nm->z, n
06d0: 6d 2d 3e 6e 29 3b 0a 20 20 6e 74 2d 3e 74 61 62  m->n);.  nt->tab
06e0: 6c 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  le = sqliteStrND
06f0: 75 70 28 74 62 6c 2d 3e 7a 2c 20 74 62 6c 2d 3e  up(tbl->z, tbl->
0700: 6e 29 3b 0a 20 20 6e 74 2d 3e 6f 70 20 3d 20 6f  n);.  nt->op = o
0710: 70 3b 0a 20 20 6e 74 2d 3e 74 72 5f 74 6d 20 3d  p;.  nt->tr_tm =
0720: 20 74 72 5f 74 6d 3b 0a 20 20 6e 74 2d 3e 70 57   tr_tm;.  nt->pW
0730: 68 65 6e 20 3d 20 70 57 68 65 6e 3b 0a 20 20 6e  hen = pWhen;.  n
0740: 74 2d 3e 70 43 6f 6c 75 6d 6e 73 20 3d 20 63 6f  t->pColumns = co
0750: 6c 73 3b 0a 20 20 6e 74 2d 3e 66 6f 72 65 61 63  ls;.  nt->foreac
0760: 68 20 3d 20 66 6f 72 65 61 63 68 3b 0a 20 20 6e  h = foreach;.  n
0770: 74 2d 3e 73 74 65 70 5f 6c 69 73 74 20 3d 20 73  t->step_list = s
0780: 74 65 70 73 3b 0a 20 20 6e 74 2d 3e 69 73 43 6f  teps;.  nt->isCo
0790: 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 6e 74 2d  mmit = 0;..  nt-
07a0: 3e 73 74 72 69 6e 67 73 20 3d 20 73 71 6c 69 74  >strings = sqlit
07b0: 65 53 74 72 4e 44 75 70 28 63 63 2c 20 6c 65 6e  eStrNDup(cc, len
07c0: 29 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 69  );.  offset = (i
07d0: 6e 74 29 28 6e 74 2d 3e 73 74 72 69 6e 67 73 20  nt)(nt->strings 
07e0: 2d 20 63 63 29 3b 0a 0a 20 20 73 71 6c 69 74 65  - cc);..  sqlite
07f0: 45 78 70 72 4d 6f 76 65 53 74 72 69 6e 67 73 28  ExprMoveStrings(
0800: 6e 74 2d 3e 70 57 68 65 6e 2c 20 6f 66 66 73 65  nt->pWhen, offse
0810: 74 29 3b 0a 0a 20 20 73 73 20 3d 20 6e 74 2d 3e  t);..  ss = nt->
0820: 73 74 65 70 5f 6c 69 73 74 3b 0a 20 20 77 68 69  step_list;.  whi
0830: 6c 65 20 28 73 73 29 20 7b 0a 20 20 20 20 73 71  le (ss) {.    sq
0840: 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74  liteSelectMoveSt
0850: 72 69 6e 67 73 28 73 73 2d 3e 70 53 65 6c 65 63  rings(ss->pSelec
0860: 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
0870: 69 66 20 28 73 73 2d 3e 74 61 72 67 65 74 2e 7a  if (ss->target.z
0880: 29 20 73 73 2d 3e 74 61 72 67 65 74 2e 7a 20 2b  ) ss->target.z +
0890: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 73 71  = offset;.    sq
08a0: 6c 69 74 65 45 78 70 72 4d 6f 76 65 53 74 72 69  liteExprMoveStri
08b0: 6e 67 73 28 73 73 2d 3e 70 57 68 65 72 65 2c 20  ngs(ss->pWhere, 
08c0: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  offset);.    sql
08d0: 69 74 65 45 78 70 72 4c 69 73 74 4d 6f 76 65 53  iteExprListMoveS
08e0: 74 72 69 6e 67 73 28 73 73 2d 3e 70 45 78 70 72  trings(ss->pExpr
08f0: 4c 69 73 74 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  List, offset);..
0900: 20 20 20 20 73 73 20 3d 20 73 73 2d 3e 70 4e 65      ss = ss->pNe
0910: 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 69 66  xt;.  }..  /* if
0920: 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74   we are not init
0930: 69 61 6c 69 7a 69 6e 67 2c 20 61 6e 64 20 74 68  ializing, and th
0940: 69 73 20 74 72 69 67 67 65 72 20 69 73 20 6e 6f  is trigger is no
0950: 74 20 6f 6e 20 61 20 54 45 4d 50 20 74 61 62 6c  t on a TEMP tabl
0960: 65 2c 20 0a 20 20 20 20 20 62 75 69 6c 64 20 74  e, .     build t
0970: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
0980: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 66 20 28   entry */.  if (
0990: 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61  !pParse->initFla
09a0: 67 20 26 26 20 21 74 61 62 2d 3e 69 73 54 65 6d  g && !tab->isTem
09b0: 70 29 20 7b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  p) {..    /* Mak
09c0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
09d0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
09e0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c  table */.    sql
09f0: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
0a00: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
0a10: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
0a20: 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64  ddOp(pParse->pVd
0a30: 62 65 2c 20 20 20 20 20 20 20 20 4f 50 5f 4f 70  be,        OP_Op
0a40: 65 6e 57 72 69 74 65 2c 20 30 2c 20 32 29 3b 0a  enWrite, 0, 2);.
0a50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
0a60: 61 6e 67 65 50 33 28 70 50 61 72 73 65 2d 3e 70  angeP3(pParse->p
0a70: 56 64 62 65 2c 20 2d 31 2c 20 4d 41 53 54 45 52  Vdbe, -1, MASTER
0a80: 5f 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 20  _NAME,          
0a90: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
0aa0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
0ab0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
0ac0: 20 20 20 20 20 20 20 4f 50 5f 4e 65 77 52 65 63         OP_NewRec
0ad0: 6e 6f 2c 20 20 30 2c 20 30 29 3b 0a 20 20 20 20  no,  0, 0);.    
0ae0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
0af0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 20  pParse->pVdbe,  
0b00: 20 20 20 20 20 20 4f 50 5f 53 74 72 69 6e 67 2c        OP_String,
0b10: 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 20 20 73      0, 0);.    s
0b20: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
0b30: 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  3(pParse->pVdbe,
0b40: 20 2d 31 2c 20 22 74 72 69 67 67 65 72 22 2c 20   -1, "trigger", 
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 50 33 5f 53              P3_S
0b60: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
0b70: 74 65 56 64 62 65 41 64 64 4f 70 28 70 50 61 72  teVdbeAddOp(pPar
0b80: 73 65 2d 3e 70 56 64 62 65 2c 20 20 20 20 20 20  se->pVdbe,      
0b90: 20 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20    OP_String,    
0ba0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
0bb0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 70 50  eVdbeChangeP3(pP
0bc0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 2d 31 2c  arse->pVdbe, -1,
0bd0: 20 6e 74 2d 3e 6e 61 6d 65 2c 20 20 20 20 20 20   nt->name,      
0be0: 20 20 30 29 3b 20 0a 20 20 20 20 73 71 6c 69 74    0); .    sqlit
0bf0: 65 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73  eVdbeAddOp(pPars
0c00: 65 2d 3e 70 56 64 62 65 2c 20 20 20 20 20 20 20  e->pVdbe,       
0c10: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 30   OP_String,    0
0c20: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
0c30: 56 64 62 65 43 68 61 6e 67 65 50 33 28 70 50 61  VdbeChangeP3(pPa
0c40: 72 73 65 2d 3e 70 56 64 62 65 2c 20 2d 31 2c 20  rse->pVdbe, -1, 
0c50: 6e 74 2d 3e 74 61 62 6c 65 2c 20 20 20 20 20 20  nt->table,      
0c60: 20 20 30 29 3b 20 0a 20 20 20 20 73 71 6c 69 74    0); .    sqlit
0c70: 65 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73  eVdbeAddOp(pPars
0c80: 65 2d 3e 70 56 64 62 65 2c 20 20 20 20 20 20 20  e->pVdbe,       
0c90: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
0ca0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
0cb0: 65 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73  eVdbeAddOp(pPars
0cc0: 65 2d 3e 70 56 64 62 65 2c 20 20 20 20 20 20 20  e->pVdbe,       
0cd0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 30   OP_String,    0
0ce0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
0cf0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 70 50 61  VdbeChangeP3(pPa
0d00: 72 73 65 2d 3e 70 56 64 62 65 2c 20 2d 31 2c 20  rse->pVdbe, -1, 
0d10: 6e 74 2d 3e 73 74 72 69 6e 67 73 2c 20 20 20 20  nt->strings,    
0d20: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
0d30: 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d  dbeAddOp(pParse-
0d40: 3e 70 56 64 62 65 2c 20 20 20 20 20 20 20 20 4f  >pVdbe,        O
0d50: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
0d60: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
0d70: 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d  dbeAddOp(pParse-
0d80: 3e 70 56 64 62 65 2c 20 20 20 20 20 20 20 20 4f  >pVdbe,        O
0d90: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
0da0: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 61 6e  1);..    /* Chan
0db0: 67 65 20 74 68 65 20 63 6f 6f 6b 69 65 2c 20 73  ge the cookie, s
0dc0: 69 6e 63 65 20 74 68 65 20 73 63 68 65 6d 61 20  ince the schema 
0dd0: 69 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  is changed */.  
0de0: 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70    changeCookie(p
0df0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
0e00: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
0e10: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
0e20: 50 5f 49 6e 74 65 67 65 72 2c 20 70 50 61 72 73  P_Integer, pPars
0e30: 65 2d 3e 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b  e->db->next_cook
0e40: 69 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ie, 0);.    sqli
0e50: 74 65 56 64 62 65 41 64 64 4f 70 28 70 50 61 72  teVdbeAddOp(pPar
0e60: 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 65  se->pVdbe, OP_Se
0e70: 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30 29 3b 0a  tCookie, 0, 0);.
0e80: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
0e90: 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64  ddOp(pParse->pVd
0ea0: 62 65 2c 20 20 20 20 20 20 20 20 4f 50 5f 43 6c  be,        OP_Cl
0eb0: 6f 73 65 2c 20 20 20 20 20 30 2c 20 30 29 3b 0a  ose,     0, 0);.
0ec0: 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72  .    sqliteEndWr
0ed0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
0ee0: 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 20  rse);.  }..  if 
0ef0: 28 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  (!pParse->explai
0f00: 6e 29 20 7b 0a 20 20 20 20 2f 2a 20 53 74 69 63  n) {.    /* Stic
0f10: 6b 20 69 74 20 69 6e 20 74 68 65 20 68 61 73 68  k it in the hash
0f20: 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71  -table */.    sq
0f30: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
0f40: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 74 72 69  (pParse->db->tri
0f50: 67 48 61 73 68 29 2c 20 6e 74 2d 3e 6e 61 6d 65  gHash), nt->name
0f60: 2c 20 6e 6d 2d 3e 6e 20 2b 20 31 2c 20 6e 74 29  , nm->n + 1, nt)
0f70: 3b 0a 0a 20 20 20 20 2f 2a 20 41 74 74 61 63 68  ;..    /* Attach
0f80: 20 69 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65   it to the table
0f90: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6e   object */.    n
0fa0: 74 2d 3e 70 4e 65 78 74 20 3d 20 74 61 62 2d 3e  t->pNext = tab->
0fb0: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 74 61  pTrigger;.    ta
0fc0: 62 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 6e 74  b->pTrigger = nt
0fd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
0fe0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 71 6c  } else {.    sql
0ff0: 69 74 65 46 72 65 65 28 6e 74 2d 3e 73 74 72 69  iteFree(nt->stri
1000: 6e 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ngs);.    sqlite
1010: 46 72 65 65 28 6e 74 2d 3e 6e 61 6d 65 29 3b 0a  Free(nt->name);.
1020: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 6e      sqliteFree(n
1030: 74 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 20 20 73  t->table);.    s
1040: 71 6c 69 74 65 46 72 65 65 28 6e 74 29 3b 0a 20  qliteFree(nt);. 
1050: 20 7d 0a 0a 74 72 69 67 67 65 72 5f 63 6c 65 61   }..trigger_clea
1060: 6e 75 70 3a 0a 0a 20 20 73 71 6c 69 74 65 49 64  nup:..  sqliteId
1070: 4c 69 73 74 44 65 6c 65 74 65 28 63 6f 6c 73 29  ListDelete(cols)
1080: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 44 65  ;.  sqliteExprDe
1090: 6c 65 74 65 28 70 57 68 65 6e 29 3b 0a 20 20 7b  lete(pWhen);.  {
10a0: 0a 20 20 20 20 54 72 69 67 67 65 72 53 74 65 70  .    TriggerStep
10b0: 20 2a 20 70 70 3b 0a 20 20 20 20 54 72 69 67 67   * pp;.    Trigg
10c0: 65 72 53 74 65 70 20 2a 20 6e 6e 3b 0a 0a 20 20  erStep * nn;..  
10d0: 20 20 70 70 20 3d 20 73 74 65 70 73 3b 0a 20 20    pp = steps;.  
10e0: 20 20 77 68 69 6c 65 20 28 70 70 29 20 7b 0a 20    while (pp) {. 
10f0: 20 20 20 20 20 6e 6e 20 3d 20 70 70 2d 3e 70 4e       nn = pp->pN
1100: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
1110: 65 45 78 70 72 44 65 6c 65 74 65 28 70 70 2d 3e  eExprDelete(pp->
1120: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73  pWhere);.      s
1130: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
1140: 65 74 65 28 70 70 2d 3e 70 45 78 70 72 4c 69 73  ete(pp->pExprLis
1150: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1160: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 70 2d  SelectDelete(pp-
1170: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
1180: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
1190: 65 74 65 28 70 70 2d 3e 70 49 64 4c 69 73 74 29  ete(pp->pIdList)
11a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
11b0: 65 65 28 70 70 29 3b 0a 20 20 20 20 20 20 70 70  ee(pp);.      pp
11c0: 20 3d 20 6e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d   = nn;.    }.  }
11d0: 0a 7d 0a 0a 20 20 54 72 69 67 67 65 72 53 74 65  .}..  TriggerSte
11e0: 70 20 2a 20 0a 73 71 6c 69 74 65 54 72 69 67 67  p * .sqliteTrigg
11f0: 65 72 53 65 6c 65 63 74 53 74 65 70 28 53 65 6c  erSelectStep(Sel
1200: 65 63 74 20 2a 20 73 29 0a 7b 0a 20 20 54 72 69  ect * s).{.  Tri
1210: 67 67 65 72 53 74 65 70 20 2a 20 74 74 20 3d 20  ggerStep * tt = 
1220: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
1230: 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29  eof(TriggerStep)
1240: 29 3b 0a 0a 20 20 74 74 2d 3e 6f 70 20 3d 20 54  );..  tt->op = T
1250: 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 74 74 2d 3e  K_SELECT;.  tt->
1260: 70 53 65 6c 65 63 74 20 3d 20 73 3b 0a 20 20 74  pSelect = s;.  t
1270: 74 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44  t->orconf = OE_D
1280: 65 66 61 75 6c 74 3b 0a 0a 20 20 72 65 74 75 72  efault;..  retur
1290: 6e 20 74 74 3b 0a 7d 0a 0a 54 72 69 67 67 65 72  n tt;.}..Trigger
12a0: 53 74 65 70 20 2a 20 0a 73 71 6c 69 74 65 54 72  Step * .sqliteTr
12b0: 69 67 67 65 72 49 6e 73 65 72 74 53 74 65 70 28  iggerInsertStep(
12c0: 54 6f 6b 65 6e 20 2a 20 74 62 6c 2c 20 49 64 4c  Token * tbl, IdL
12d0: 69 73 74 20 2a 20 63 6f 6c 2c 20 45 78 70 72 4c  ist * col, ExprL
12e0: 69 73 74 20 2a 20 76 61 6c 2c 20 53 65 6c 65 63  ist * val, Selec
12f0: 74 20 2a 20 73 2c 20 69 6e 74 20 6f 72 63 6f 6e  t * s, int orcon
1300: 66 29 0a 7b 0a 20 20 54 72 69 67 67 65 72 53 74  f).{.  TriggerSt
1310: 65 70 20 2a 20 74 74 20 3d 20 73 71 6c 69 74 65  ep * tt = sqlite
1320: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72  Malloc(sizeof(Tr
1330: 69 67 67 65 72 53 74 65 70 29 29 3b 0a 0a 20 20  iggerStep));..  
1340: 61 73 73 65 72 74 28 76 61 6c 20 3d 3d 20 30 20  assert(val == 0 
1350: 7c 7c 20 73 20 3d 3d 20 30 29 3b 0a 20 20 61 73  || s == 0);.  as
1360: 73 65 72 74 28 76 61 6c 20 21 3d 20 30 20 7c 7c  sert(val != 0 ||
1370: 20 73 20 21 3d 20 30 29 3b 0a 0a 20 20 74 74 2d   s != 0);..  tt-
1380: 3e 6f 70 20 3d 20 54 4b 5f 49 4e 53 45 52 54 3b  >op = TK_INSERT;
1390: 0a 20 20 74 74 2d 3e 70 53 65 6c 65 63 74 20 3d  .  tt->pSelect =
13a0: 20 73 3b 0a 20 20 74 74 2d 3e 74 61 72 67 65 74   s;.  tt->target
13b0: 20 20 3d 20 2a 74 62 6c 3b 0a 20 20 74 74 2d 3e    = *tbl;.  tt->
13c0: 70 49 64 4c 69 73 74 20 3d 20 63 6f 6c 3b 0a 20  pIdList = col;. 
13d0: 20 74 74 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d   tt->pExprList =
13e0: 20 76 61 6c 3b 0a 20 20 74 74 2d 3e 6f 72 63 6f   val;.  tt->orco
13f0: 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 0a 20 20  nf = orconf;..  
1400: 72 65 74 75 72 6e 20 74 74 3b 0a 7d 0a 0a 54 72  return tt;.}..Tr
1410: 69 67 67 65 72 53 74 65 70 20 2a 20 0a 73 71 6c  iggerStep * .sql
1420: 69 74 65 54 72 69 67 67 65 72 55 70 64 61 74 65  iteTriggerUpdate
1430: 53 74 65 70 28 54 6f 6b 65 6e 20 2a 20 74 62 6c  Step(Token * tbl
1440: 2c 20 45 78 70 72 4c 69 73 74 20 2a 20 76 61 6c  , ExprList * val
1450: 2c 20 45 78 70 72 20 2a 20 77 2c 20 69 6e 74 20  , Expr * w, int 
1460: 6f 72 63 6f 6e 66 29 0a 7b 0a 20 20 54 72 69 67  orconf).{.  Trig
1470: 67 65 72 53 74 65 70 20 2a 20 74 74 20 3d 20 73  gerStep * tt = s
1480: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65  qliteMalloc(size
1490: 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29 29  of(TriggerStep))
14a0: 3b 0a 0a 20 20 74 74 2d 3e 6f 70 20 3d 20 54 4b  ;..  tt->op = TK
14b0: 5f 55 50 44 41 54 45 3b 0a 20 20 74 74 2d 3e 74  _UPDATE;.  tt->t
14c0: 61 72 67 65 74 20 20 3d 20 2a 74 62 6c 3b 0a 20  arget  = *tbl;. 
14d0: 20 74 74 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d   tt->pExprList =
14e0: 20 76 61 6c 3b 0a 20 20 74 74 2d 3e 70 57 68 65   val;.  tt->pWhe
14f0: 72 65 20 3d 20 77 3b 0a 20 20 74 74 2d 3e 6f 72  re = w;.  tt->or
1500: 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 0a  conf = orconf;..
1510: 20 20 72 65 74 75 72 6e 20 74 74 3b 0a 7d 0a 0a    return tt;.}..
1520: 54 72 69 67 67 65 72 53 74 65 70 20 2a 20 0a 73  TriggerStep * .s
1530: 71 6c 69 74 65 54 72 69 67 67 65 72 44 65 6c 65  qliteTriggerDele
1540: 74 65 53 74 65 70 28 54 6f 6b 65 6e 20 2a 20 74  teStep(Token * t
1550: 62 6c 2c 20 45 78 70 72 20 2a 20 77 29 0a 7b 0a  bl, Expr * w).{.
1560: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 20    TriggerStep * 
1570: 74 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  tt = sqliteMallo
1580: 63 28 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72  c(sizeof(Trigger
1590: 53 74 65 70 29 29 3b 0a 0a 20 20 74 74 2d 3e 6f  Step));..  tt->o
15a0: 70 20 3d 20 54 4b 5f 44 45 4c 45 54 45 3b 0a 20  p = TK_DELETE;. 
15b0: 20 74 74 2d 3e 74 61 72 67 65 74 20 20 3d 20 2a   tt->target  = *
15c0: 74 62 6c 3b 0a 20 20 74 74 2d 3e 70 57 68 65 72  tbl;.  tt->pWher
15d0: 65 20 3d 20 77 3b 0a 20 20 74 74 2d 3e 6f 72 63  e = w;.  tt->orc
15e0: 6f 6e 66 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74  onf = OE_Default
15f0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 74 74 3b 0a  ;..  return tt;.
1600: 7d 0a 0a 0a 2f 2a 20 54 68 69 73 20 64 6f 65 73  }.../* This does
1610: 20 61 20 72 65 63 75 72 73 69 76 65 20 64 65 6c   a recursive del
1620: 65 74 65 20 6f 66 20 74 68 65 20 74 72 69 67 67  ete of the trigg
1630: 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
1640: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74  void sqliteDelet
1650: 65 54 72 69 67 67 65 72 28 54 72 69 67 67 65 72  eTrigger(Trigger
1660: 20 2a 20 74 74 29 0a 7b 0a 20 20 54 72 69 67 67   * tt).{.  Trigg
1670: 65 72 53 74 65 70 20 2a 20 74 73 2c 20 2a 20 74  erStep * ts, * t
1680: 63 3b 0a 20 20 74 73 20 3d 20 74 74 2d 3e 73 74  c;.  ts = tt->st
1690: 65 70 5f 6c 69 73 74 3b 0a 0a 20 20 77 68 69 6c  ep_list;..  whil
16a0: 65 20 28 74 73 29 20 7b 0a 20 20 20 20 74 63 20  e (ts) {.    tc 
16b0: 3d 20 74 73 3b 0a 20 20 20 20 74 73 20 3d 20 74  = ts;.    ts = t
16c0: 73 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 73  s->pNext;..    s
16d0: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
16e0: 74 63 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  tc->pWhere);.   
16f0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
1700: 65 6c 65 74 65 28 74 63 2d 3e 70 45 78 70 72 4c  elete(tc->pExprL
1710: 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
1720: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 74 63 2d  SelectDelete(tc-
1730: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
1740: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
1750: 65 28 74 63 2d 3e 70 49 64 4c 69 73 74 29 3b 0a  e(tc->pIdList);.
1760: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
1770: 74 63 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  tc);.  }..  sqli
1780: 74 65 46 72 65 65 28 74 74 2d 3e 6e 61 6d 65 29  teFree(tt->name)
1790: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 74  ;.  sqliteFree(t
17a0: 74 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 73 71 6c  t->table);.  sql
17b0: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 74 74  iteExprDelete(tt
17c0: 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 73 71 6c 69  ->pWhen);.  sqli
17d0: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 74  teIdListDelete(t
17e0: 74 2d 3e 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20  t->pColumns);.  
17f0: 73 71 6c 69 74 65 46 72 65 65 28 74 74 2d 3e 73  sqliteFree(tt->s
1800: 74 72 69 6e 67 73 29 3b 0a 20 20 73 71 6c 69 74  trings);.  sqlit
1810: 65 46 72 65 65 28 74 74 29 3b 0a 7d 0a 0a 2f 2a  eFree(tt);.}../*
1820: 0a 20 2a 20 22 6e 65 73 74 65 64 22 20 69 73 20  . * "nested" is 
1830: 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  true if this is 
1840: 62 65 67 69 6e 20 63 61 6c 6c 65 64 20 61 73 20  begin called as 
1850: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20  the result of a 
1860: 44 52 4f 50 20 54 41 42 4c 45 0a 20 2a 2f 0a 76  DROP TABLE. */.v
1870: 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 72  oid sqliteDropTr
1880: 69 67 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  igger(Parse *pPa
1890: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 20 74 72 69  rse, Token * tri
18a0: 67 6e 61 6d 65 2c 20 69 6e 74 20 6e 65 73 74 65  gname, int neste
18b0: 64 29 0a 7b 0a 20 20 63 68 61 72 20 2a 20 74 6d  d).{.  char * tm
18c0: 70 5f 6e 61 6d 65 3b 0a 20 20 54 72 69 67 67 65  p_name;.  Trigge
18d0: 72 20 2a 20 74 72 69 67 3b 0a 20 20 54 61 62 6c  r * trig;.  Tabl
18e0: 65 20 20 20 2a 20 74 62 6c 3b 0a 0a 20 20 74 6d  e   * tbl;..  tm
18f0: 70 5f 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  p_name = sqliteS
1900: 74 72 4e 44 75 70 28 74 72 69 67 6e 61 6d 65 2d  trNDup(trigname-
1910: 3e 7a 2c 20 74 72 69 67 6e 61 6d 65 2d 3e 6e 29  >z, trigname->n)
1920: 3b 0a 0a 20 20 2f 2a 20 65 6e 73 75 72 65 20 74  ;..  /* ensure t
1930: 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72 20  hat the trigger 
1940: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 65 78  being dropped ex
1950: 69 73 74 73 20 2a 2f 0a 20 20 74 72 69 67 20 3d  ists */.  trig =
1960: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
1970: 26 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 74 72  &(pParse->db->tr
1980: 69 67 48 61 73 68 29 2c 20 74 6d 70 5f 6e 61 6d  igHash), tmp_nam
1990: 65 2c 20 74 72 69 67 6e 61 6d 65 2d 3e 6e 20 2b  e, trigname->n +
19a0: 20 31 29 3b 20 0a 20 20 69 66 20 28 21 74 72 69   1); .  if (!tri
19b0: 67 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  g) {.    sqliteS
19c0: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
19d0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
19e0: 73 75 63 68 20 74 72 69 67 67 65 72 3a 20 22 2c  such trigger: ",
19f0: 20 2d 31 2c 0a 09 74 6d 70 5f 6e 61 6d 65 2c 20   -1,..tmp_name, 
1a00: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  -1, 0);.    sqli
1a10: 74 65 46 72 65 65 28 74 6d 70 5f 6e 61 6d 65 29  teFree(tmp_name)
1a20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1a30: 7d 0a 0a 20 20 2f 2a 0a 20 20 20 2a 20 49 66 20  }..  /*.   * If 
1a40: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20 22  this is not an "
1a50: 65 78 70 6c 61 69 6e 22 2c 20 64 6f 20 74 68 65  explain", do the
1a60: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 2a   following:.   *
1a70: 20 31 2e 20 52 65 6d 6f 76 65 20 74 68 65 20 74   1. Remove the t
1a80: 72 69 67 67 65 72 20 66 72 6f 6d 20 69 74 73 20  rigger from its 
1a90: 61 73 73 6f 63 69 61 74 65 64 20 74 61 62 6c 65  associated table
1aa0: 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 2a 20   structure.   * 
1ab0: 32 2e 20 4d 6f 76 65 20 74 68 65 20 74 72 69 67  2. Move the trig
1ac0: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 74 72 69  ger from the tri
1ad0: 67 48 61 73 68 20 68 61 73 68 20 74 6f 20 74 72  gHash hash to tr
1ae0: 69 67 44 72 6f 70 0a 20 20 20 2a 2f 0a 20 20 69  igDrop.   */.  i
1af0: 66 20 28 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f (!pParse->expl
1b00: 61 69 6e 29 20 7b 0a 20 20 20 20 2f 2a 20 31 20  ain) {.    /* 1 
1b10: 2a 2f 0a 20 20 20 20 74 62 6c 20 3d 20 73 71 6c  */.    tbl = sql
1b20: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61  iteFindTable(pPa
1b30: 72 73 65 2d 3e 64 62 2c 20 74 72 69 67 2d 3e 74  rse->db, trig->t
1b40: 61 62 6c 65 29 3b 0a 20 20 20 20 61 73 73 65 72  able);.    asser
1b50: 74 28 74 62 6c 29 3b 0a 20 20 20 20 69 66 20 28  t(tbl);.    if (
1b60: 74 62 6c 2d 3e 70 54 72 69 67 67 65 72 20 3d 3d  tbl->pTrigger ==
1b70: 20 74 72 69 67 29 20 0a 20 20 20 20 20 20 74 62   trig) .      tb
1b80: 6c 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 74 72  l->pTrigger = tr
1b90: 69 67 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 65  ig->pNext;.    e
1ba0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 54 72 69 67  lse {.      Trig
1bb0: 67 65 72 20 2a 20 63 63 20 3d 20 74 62 6c 2d 3e  ger * cc = tbl->
1bc0: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20  pTrigger;.      
1bd0: 77 68 69 6c 65 20 28 63 63 29 20 7b 0a 09 69 66  while (cc) {..if
1be0: 20 28 63 63 2d 3e 70 4e 65 78 74 20 3d 3d 20 74   (cc->pNext == t
1bf0: 72 69 67 29 20 7b 0a 09 20 20 63 63 2d 3e 70 4e  rig) {..  cc->pN
1c00: 65 78 74 20 3d 20 63 63 2d 3e 70 4e 65 78 74 2d  ext = cc->pNext-
1c10: 3e 70 4e 65 78 74 3b 0a 09 20 20 62 72 65 61 6b  >pNext;..  break
1c20: 3b 0a 09 7d 0a 09 63 63 20 3d 20 63 63 2d 3e 70  ;..}..cc = cc->p
1c30: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1c40: 20 20 20 20 61 73 73 65 72 74 28 63 63 29 3b 0a      assert(cc);.
1c50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 32 20      }..    /* 2 
1c60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  */.    sqliteHas
1c70: 68 49 6e 73 65 72 74 28 26 28 70 50 61 72 73 65  hInsert(&(pParse
1c80: 2d 3e 64 62 2d 3e 74 72 69 67 48 61 73 68 29 2c  ->db->trigHash),
1c90: 20 74 6d 70 5f 6e 61 6d 65 2c 20 0a 09 74 72 69   tmp_name, ..tri
1ca0: 67 6e 61 6d 65 2d 3e 6e 20 2b 20 31 2c 20 4e 55  gname->n + 1, NU
1cb0: 4c 4c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48  LL);.    sqliteH
1cc0: 61 73 68 49 6e 73 65 72 74 28 26 28 70 50 61 72  ashInsert(&(pPar
1cd0: 73 65 2d 3e 64 62 2d 3e 74 72 69 67 44 72 6f 70  se->db->trigDrop
1ce0: 29 2c 20 74 72 69 67 2d 3e 6e 61 6d 65 2c 20 0a  ), trig->name, .
1cf0: 09 74 72 69 67 6e 61 6d 65 2d 3e 6e 20 2b 20 31  .trigname->n + 1
1d00: 2c 20 74 72 69 67 29 3b 0a 20 20 7d 0a 0a 20 20  , trig);.  }..  
1d10: 2f 2a 20 55 6e 6c 65 73 73 20 74 68 69 73 20 69  /* Unless this i
1d20: 73 20 61 20 74 72 69 67 67 65 72 20 6f 6e 20 61  s a trigger on a
1d30: 20 54 45 4d 50 20 54 41 42 4c 45 2c 20 67 65 6e   TEMP TABLE, gen
1d40: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 65  erate code to de
1d50: 73 74 72 6f 79 20 74 68 65 0a 20 20 20 2a 20 64  stroy the.   * d
1d60: 61 74 61 62 61 73 65 20 72 65 63 6f 72 64 20 6f  atabase record o
1d70: 66 20 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f  f the trigger */
1d80: 0a 20 20 69 66 20 28 21 74 62 6c 2d 3e 69 73 54  .  if (!tbl->isT
1d90: 65 6d 70 29 20 7b 0a 20 20 20 20 69 6e 74 20 62  emp) {.    int b
1da0: 61 73 65 3b 0a 20 20 20 20 73 74 61 74 69 63 20  ase;.    static 
1db0: 56 64 62 65 4f 70 20 64 72 6f 70 54 72 69 67 67  VdbeOp dropTrigg
1dc0: 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  er[] = {.      {
1dd0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 20   OP_OpenWrite,  
1de0: 30 2c 20 32 2c 20 20 20 20 20 20 20 20 4d 41 53  0, 2,        MAS
1df0: 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20  TER_NAME},.     
1e00: 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
1e10: 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 20 30    0, ADDR(9),  0
1e20: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  },.      { OP_St
1e30: 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20  ring,     0, 0, 
1e40: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20         0}, /* 2 
1e50: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  */.      { OP_Me
1e60: 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20  mStore,   1, 1, 
1e70: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
1e80: 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20   { OP_MemLoad,  
1e90: 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
1ea0: 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20  }, /* 4 */.     
1eb0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
1ec0: 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20 30    0, 1,        0
1ed0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
1ee0: 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44  ,         0, ADD
1ef0: 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20  R(8),  0},.     
1f00: 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
1f10: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
1f20: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
1f30: 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
1f40: 52 28 34 29 2c 20 20 30 7d 2c 20 2f 2a 20 38 20  R(4),  0}, /* 8 
1f50: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e  */.      { OP_In
1f60: 74 65 67 65 72 2c 20 20 20 20 30 2c 20 30 2c 20  teger,    0, 0, 
1f70: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39 20         0}, /* 9 
1f80: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65  */.      { OP_Se
1f90: 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 30 2c 20  tCookie,  0, 0, 
1fa0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
1fb0: 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20   { OP_Close,    
1fc0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
1fd0: 7d 2c 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 69  },.    };..    i
1fe0: 66 20 28 21 6e 65 73 74 65 64 29 20 0a 20 20 20  f (!nested) .   
1ff0: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
2000: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
2010: 72 73 65 29 3b 0a 0a 20 20 20 20 62 61 73 65 20  rse);..    base 
2020: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
2030: 70 4c 69 73 74 28 70 50 61 72 73 65 2d 3e 70 56  pList(pParse->pV
2040: 64 62 65 2c 20 0a 09 41 72 72 61 79 53 69 7a 65  dbe, ..ArraySize
2050: 28 64 72 6f 70 54 72 69 67 67 65 72 29 2c 20 64  (dropTrigger), d
2060: 72 6f 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  ropTrigger);.   
2070: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
2080: 65 50 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  eP3(pParse->pVdb
2090: 65 2c 20 62 61 73 65 2b 32 2c 20 74 6d 70 5f 6e  e, base+2, tmp_n
20a0: 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66  ame, 0);..    if
20b0: 20 28 21 6e 65 73 74 65 64 29 0a 20 20 20 20 20   (!nested).     
20c0: 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50   changeCookie(pP
20d0: 61 72 73 65 2d 3e 64 62 29 3b 0a 0a 20 20 20 20  arse->db);..    
20e0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
20f0: 50 31 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P1(pParse->pVdbe
2100: 2c 20 62 61 73 65 2b 39 2c 20 70 50 61 72 73 65  , base+9, pParse
2110: 2d 3e 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  ->db->next_cooki
2120: 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 6e 65  e);..    if (!ne
2130: 73 74 65 64 29 0a 20 20 20 20 20 20 73 71 6c 69  sted).      sqli
2140: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
2150: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
2160: 0a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 74  ..  sqliteFree(t
2170: 6d 70 5f 6e 61 6d 65 29 3b 0a 7d 0a 0a 73 74 61  mp_name);.}..sta
2180: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 43 6f 6c  tic int checkCol
2190: 75 6d 6e 4f 76 65 72 4c 61 70 28 49 64 4c 69 73  umnOverLap(IdLis
21a0: 74 20 2a 20 69 69 2c 20 45 78 70 72 4c 69 73 74  t * ii, ExprList
21b0: 20 2a 20 65 65 29 0a 7b 0a 20 20 69 6e 74 20 69   * ee).{.  int i
21c0: 2c 20 65 3b 0a 20 20 69 66 20 28 21 69 69 29 20  , e;.  if (!ii) 
21d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 20 28  return 1;.  if (
21e0: 21 65 65 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  !ee) return 1;..
21f0: 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20    for (i = 0; i 
2200: 3c 20 69 69 2d 3e 6e 49 64 3b 20 69 2b 2b 29 20  < ii->nId; i++) 
2210: 0a 20 20 20 20 66 6f 72 20 28 65 20 3d 20 30 3b  .    for (e = 0;
2220: 20 65 20 3c 20 65 65 2d 3e 6e 45 78 70 72 3b 20   e < ee->nExpr; 
2230: 65 2b 2b 29 20 0a 20 20 20 20 20 20 69 66 20 28  e++) .      if (
2240: 21 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 69  !sqliteStrICmp(i
2250: 69 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 65  i->a[i].zName, e
2260: 65 2d 3e 61 5b 65 5d 2e 7a 4e 61 6d 65 29 29 0a  e->a[e].zName)).
2270: 09 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 72 65  .return 1;..  re
2280: 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a 20 41  turn 0; .}../* A
2290: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
22a0: 20 74 68 61 74 20 69 73 20 54 52 55 45 20 69 66   that is TRUE if
22b0: 20 77 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   we should alway
22c0: 73 20 73 65 74 20 75 70 20 74 65 6d 70 20 74 61  s set up temp ta
22d0: 62 6c 65 73 20 66 6f 72 0a 20 2a 20 66 6f 72 20  bles for. * for 
22e0: 74 72 69 67 67 65 72 73 2c 20 65 76 65 6e 20 69  triggers, even i
22f0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74  f there are no t
2300: 72 69 67 67 65 72 73 20 74 6f 20 63 6f 64 65 2e  riggers to code.
2310: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
2320: 20 74 65 73 74 20 0a 20 2a 20 68 6f 77 20 6d 75   test . * how mu
2330: 63 68 20 6f 76 65 72 68 65 61 64 20 74 68 65 20  ch overhead the 
2340: 74 72 69 67 67 65 72 73 20 61 6c 67 6f 72 69 74  triggers algorit
2350: 68 6d 20 69 73 20 63 61 75 73 69 6e 67 2e 0a 20  hm is causing.. 
2360: 2a 0a 20 2a 20 54 68 69 73 20 66 6c 61 67 20 63  *. * This flag c
2370: 61 6e 20 62 65 20 73 65 74 20 6f 72 20 63 6c 65  an be set or cle
2380: 61 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 22  ared using the "
2390: 74 72 69 67 67 65 72 5f 6f 76 65 72 68 65 61 64  trigger_overhead
23a0: 5f 74 65 73 74 22 20 70 72 61 67 6d 61 2e 0a 20  _test" pragma.. 
23b0: 2a 20 54 68 65 20 70 72 61 67 6d 61 20 69 73 20  * The pragma is 
23c0: 6e 6f 74 20 64 6f 63 75 6d 65 6e 74 65 64 20 73  not documented s
23d0: 69 6e 63 65 20 69 74 20 69 73 20 6e 6f 74 20 72  ince it is not r
23e0: 65 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68  eally part of th
23f0: 65 20 69 6e 74 65 72 66 61 63 65 0a 20 2a 20 74  e interface. * t
2400: 6f 20 53 51 4c 69 74 65 2c 20 6a 75 73 74 20 74  o SQLite, just t
2410: 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  he test procedur
2420: 65 2e 0a 2a 2f 0a 69 6e 74 20 61 6c 77 61 79 73  e..*/.int always
2430: 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65  _code_trigger_se
2440: 74 75 70 20 3d 20 30 3b 0a 0a 2f 2a 0a 20 2a 20  tup = 0;../*. * 
2450: 52 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  Returns true if 
2460: 61 20 74 72 69 67 67 65 72 20 6d 61 74 63 68 69  a trigger matchi
2470: 6e 67 20 6f 70 2c 20 74 72 5f 74 6d 20 61 6e 64  ng op, tr_tm and
2480: 20 66 6f 72 65 61 63 68 20 74 68 61 74 20 69 73   foreach that is
2490: 20 4e 4f 54 20 61 6c 72 65 61 64 79 0a 20 2a 20   NOT already. * 
24a0: 6f 6e 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  on the Parse obj
24b0: 65 63 74 73 20 74 72 69 67 67 65 72 2d 73 74 61  ects trigger-sta
24c0: 63 6b 20 28 74 6f 20 70 72 65 76 65 6e 74 20 72  ck (to prevent r
24d0: 65 63 75 72 73 69 76 65 20 74 72 69 67 67 65 72  ecursive trigger
24e0: 20 66 69 72 69 6e 67 29 20 69 73 0a 20 2a 20 66   firing) is. * f
24f0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 6c 69 73 74  ound in the list
2500: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 54   specified as pT
2510: 72 69 67 67 65 72 2e 0a 20 2a 2f 0a 69 6e 74 20  rigger.. */.int 
2520: 73 71 6c 69 74 65 54 72 69 67 67 65 72 73 45 78  sqliteTriggersEx
2530: 69 73 74 28 0a 20 20 20 20 50 61 72 73 65 20 2a  ist(.    Parse *
2540: 20 70 50 61 72 73 65 2c 20 0a 20 20 20 20 54 72   pParse, .    Tr
2550: 69 67 67 65 72 20 2a 20 70 54 72 69 67 67 65 72  igger * pTrigger
2560: 2c 0a 20 20 20 20 69 6e 74 20 6f 70 2c 20 20 20  ,.    int op,   
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2580: 20 6f 6e 65 20 6f 66 20 54 4b 5f 44 45 4c 45 54   one of TK_DELET
2590: 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b  E, TK_INSERT, TK
25a0: 5f 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20 69  _UPDATE */.    i
25b0: 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20  nt tr_tm,       
25c0: 20 20 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66         /* one of
25d0: 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b 5f 41   TK_BEFORE, TK_A
25e0: 46 54 45 52 20 2a 2f 0a 20 20 20 20 69 6e 74 20  FTER */.    int 
25f0: 66 6f 72 65 61 63 68 2c 20 20 20 20 20 20 20 20  foreach,        
2600: 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66 20 54 4b      /* one of TK
2610: 5f 52 4f 57 20 6f 72 20 54 4b 5f 53 54 41 54 45  _ROW or TK_STATE
2620: 4d 45 4e 54 20 2a 2f 0a 20 20 20 20 45 78 70 72  MENT */.    Expr
2630: 4c 69 73 74 20 2a 20 70 43 68 61 6e 67 65 73 29  List * pChanges)
2640: 0a 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 20 74  .{.  Trigger * t
2650: 74 3b 0a 0a 20 20 69 66 20 28 61 6c 77 61 79 73  t;..  if (always
2660: 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65  _code_trigger_se
2670: 74 75 70 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  tup) return 1;..
2680: 20 20 74 74 20 3d 20 70 54 72 69 67 67 65 72 3b    tt = pTrigger;
2690: 0a 20 20 77 68 69 6c 65 20 28 74 74 29 20 7b 0a  .  while (tt) {.
26a0: 20 20 20 20 69 66 20 28 74 74 2d 3e 6f 70 20 3d      if (tt->op =
26b0: 3d 20 6f 70 20 26 26 20 74 74 2d 3e 74 72 5f 74  = op && tt->tr_t
26c0: 6d 20 3d 3d 20 74 72 5f 74 6d 20 26 26 20 74 74  m == tr_tm && tt
26d0: 2d 3e 66 6f 72 65 61 63 68 20 3d 3d 20 66 6f 72  ->foreach == for
26e0: 65 61 63 68 20 26 26 0a 09 63 68 65 63 6b 43 6f  each &&..checkCo
26f0: 6c 75 6d 6e 4f 76 65 72 4c 61 70 28 74 74 2d 3e  lumnOverLap(tt->
2700: 70 43 6f 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67  pColumns, pChang
2710: 65 73 29 29 20 7b 0a 20 20 20 20 20 20 54 72 69  es)) {.      Tri
2720: 67 67 65 72 53 74 61 63 6b 20 2a 20 73 73 3b 0a  ggerStack * ss;.
2730: 20 20 20 20 20 20 73 73 20 3d 20 70 50 61 72 73        ss = pPars
2740: 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20  e->trigStack;.  
2750: 20 20 20 20 77 68 69 6c 65 20 28 73 73 20 26 26      while (ss &&
2760: 20 73 73 2d 3e 70 54 72 69 67 67 65 72 20 21 3d   ss->pTrigger !=
2770: 20 70 54 72 69 67 67 65 72 29 20 73 73 20 3d 20   pTrigger) ss = 
2780: 73 73 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ss->pNext;.     
2790: 20 69 66 20 28 21 73 73 29 20 72 65 74 75 72 6e   if (!ss) return
27a0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 74   1;.    }.    tt
27b0: 20 3d 20 74 74 2d 3e 70 4e 65 78 74 3b 0a 20 20   = tt->pNext;.  
27c0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
27d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  ..static int cod
27e0: 65 54 72 69 67 67 65 72 50 72 6f 67 72 61 6d 28  eTriggerProgram(
27f0: 0a 09 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  ..Parse *pParse,
2800: 0a 09 54 72 69 67 67 65 72 53 74 65 70 20 2a 20  ..TriggerStep * 
2810: 70 72 6f 67 72 61 6d 2c 0a 09 69 6e 74 20 6f 6e  program,..int on
2820: 45 72 72 6f 72 29 0a 7b 0a 20 20 20 20 54 72 69  Error).{.    Tri
2830: 67 67 65 72 53 74 65 70 20 2a 20 73 74 65 70 20  ggerStep * step 
2840: 3d 20 70 72 6f 67 72 61 6d 3b 0a 20 20 20 20 69  = program;.    i
2850: 6e 74 20 6f 72 63 6f 6e 66 3b 0a 0a 20 20 20 20  nt orconf;..    
2860: 77 68 69 6c 65 20 28 73 74 65 70 29 20 7b 0a 09  while (step) {..
2870: 69 6e 74 20 73 61 76 65 4e 54 61 62 20 3d 20 70  int saveNTab = p
2880: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 09 6f 72  Parse->nTab;..or
2890: 63 6f 6e 66 20 3d 20 28 6f 6e 45 72 72 6f 72 20  conf = (onError 
28a0: 3d 3d 20 4f 45 5f 44 65 66 61 75 6c 74 29 3f 73  == OE_Default)?s
28b0: 74 65 70 2d 3e 6f 72 63 6f 6e 66 3a 6f 6e 45 72  tep->orconf:onEr
28c0: 72 6f 72 3b 0a 09 70 50 61 72 73 65 2d 3e 74 72  ror;..pParse->tr
28d0: 69 67 53 74 61 63 6b 2d 3e 6f 72 63 6f 6e 66 20  igStack->orconf 
28e0: 3d 20 6f 72 63 6f 6e 66 3b 0a 09 73 77 69 74 63  = orconf;..switc
28f0: 68 28 73 74 65 70 2d 3e 6f 70 29 20 7b 0a 09 20  h(step->op) {.. 
2900: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
2910: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T: {.           
2920: 20 20 20 20 20 69 6e 74 20 74 6d 70 5f 74 62 6c       int tmp_tbl
2930: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2940: 2b 3b 0a 09 09 73 71 6c 69 74 65 56 64 62 65 41  +;...sqliteVdbeA
2950: 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64  ddOp(pParse->pVd
2960: 62 65 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  be, OP_OpenTemp,
2970: 20 74 6d 70 5f 74 62 6c 2c 20 30 29 3b 0a 09 09   tmp_tbl, 0);...
2980: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2990: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
29a0: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 6d 70  P_KeyAsData, tmp
29b0: 5f 74 62 6c 2c 20 31 29 3b 0a 09 09 73 71 6c 69  _tbl, 1);...sqli
29c0: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
29d0: 20 73 74 65 70 2d 3e 70 53 65 6c 65 63 74 2c 20   step->pSelect, 
29e0: 0a 09 09 09 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  ....SRT_Union, t
29f0: 6d 70 5f 74 62 6c 2c 20 30 2c 20 30 2c 20 30 29  mp_tbl, 0, 0, 0)
2a00: 3b 0a 09 09 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 43 6c 6f 73 65 2c 20 74 6d 70  e, OP_Close, tmp
2a30: 5f 74 62 6c 2c 20 30 29 3b 0a 09 09 70 50 61 72  _tbl, 0);...pPar
2a40: 73 65 2d 3e 6e 54 61 62 2d 2d 3b 0a 09 09 62 72  se->nTab--;...br
2a50: 65 61 6b 3b 0a 09 09 09 20 20 20 20 7d 0a 09 20  eak;....    }.. 
2a60: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 44 41 54     case TK_UPDAT
2a70: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E: {.           
2a80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
2a90: 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64  ddOp(pParse->pVd
2aa0: 62 65 2c 20 4f 50 5f 50 75 73 68 4c 69 73 74 2c  be, OP_PushList,
2ab0: 20 30 2c 20 30 29 3b 0a 09 09 73 71 6c 69 74 65   0, 0);...sqlite
2ac0: 55 70 64 61 74 65 28 70 50 61 72 73 65 2c 20 26  Update(pParse, &
2ad0: 73 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 0a 09  step->target, ..
2ae0: 09 09 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  ..sqliteExprList
2af0: 44 75 70 28 73 74 65 70 2d 3e 70 45 78 70 72 4c  Dup(step->pExprL
2b00: 69 73 74 29 2c 20 0a 09 09 09 73 71 6c 69 74 65  ist), ....sqlite
2b10: 45 78 70 72 44 75 70 28 73 74 65 70 2d 3e 70 57  ExprDup(step->pW
2b20: 68 65 72 65 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a  here), orconf);.
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2b50: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
2b60: 50 5f 50 6f 70 4c 69 73 74 2c 20 30 2c 20 30 29  P_PopList, 0, 0)
2b70: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 09 09 20 20  ;...break;....  
2b80: 20 20 7d 0a 09 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
2b90: 5f 49 4e 53 45 52 54 3a 20 7b 0a 20 20 20 20 20  _INSERT: {.     
2ba0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2bb0: 65 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20  eInsert(pParse, 
2bc0: 26 73 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 0a  &step->target, .
2bd0: 09 09 09 73 71 6c 69 74 65 45 78 70 72 4c 69 73  ...sqliteExprLis
2be0: 74 44 75 70 28 73 74 65 70 2d 3e 70 45 78 70 72  tDup(step->pExpr
2bf0: 4c 69 73 74 29 2c 20 0a 09 09 09 73 71 6c 69 74  List), ....sqlit
2c00: 65 53 65 6c 65 63 74 44 75 70 28 73 74 65 70 2d  eSelectDup(step-
2c10: 3e 70 53 65 6c 65 63 74 29 2c 20 0a 09 09 09 73  >pSelect), ....s
2c20: 71 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28 73  qliteIdListDup(s
2c30: 74 65 70 2d 3e 70 49 64 4c 69 73 74 29 2c 20 6f  tep->pIdList), o
2c40: 72 63 6f 6e 66 29 3b 0a 09 09 62 72 65 61 6b 3b  rconf);...break;
2c50: 0a 09 09 09 20 20 20 20 7d 0a 09 20 20 20 20 63  ....    }..    c
2c60: 61 73 65 20 54 4b 5f 44 45 4c 45 54 45 3a 20 7b  ase TK_DELETE: {
2c70: 0a 09 09 73 71 6c 69 74 65 56 64 62 65 41 64 64  ...sqliteVdbeAdd
2c80: 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  Op(pParse->pVdbe
2c90: 2c 20 4f 50 5f 50 75 73 68 4c 69 73 74 2c 20 30  , OP_PushList, 0
2ca0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
2cc0: 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 26  teFrom(pParse, &
2cd0: 73 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 0a 09  step->target, ..
2ce0: 09 09 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  ..sqliteExprDup(
2cf0: 73 74 65 70 2d 3e 70 57 68 65 72 65 29 0a 09 09  step->pWhere)...
2d00: 09 29 3b 0a 09 09 73 71 6c 69 74 65 56 64 62 65  .);...sqliteVdbe
2d10: 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56  AddOp(pParse->pV
2d20: 64 62 65 2c 20 4f 50 5f 50 6f 70 4c 69 73 74 2c  dbe, OP_PopList,
2d30: 20 30 2c 20 30 29 3b 0a 09 09 62 72 65 61 6b 3b   0, 0);...break;
2d40: 0a 09 09 09 20 20 20 20 7d 0a 09 20 20 20 20 64  ....    }..    d
2d50: 65 66 61 75 6c 74 3a 0a 09 09 09 20 20 20 20 61  efault:....    a
2d60: 73 73 65 72 74 28 30 29 3b 0a 09 7d 20 0a 09 70  ssert(0);..} ..p
2d70: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 73 61  Parse->nTab = sa
2d80: 76 65 4e 54 61 62 3b 0a 09 73 74 65 70 20 3d 20  veNTab;..step = 
2d90: 73 74 65 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  step->pNext;.   
2da0: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 30   }..    return 0
2db0: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 43  ;.}..int sqliteC
2dc0: 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 0a 09  odeRowTrigger(..
2dd0: 50 61 72 73 65 20 2a 20 70 50 61 72 73 65 2c 20  Parse * pParse, 
2de0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
2df0: 74 20 2a 2f 0a 09 69 6e 74 20 6f 70 2c 20 20 20  t */..int op,   
2e00: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2e10: 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f 49   TK_UPDATE, TK_I
2e20: 4e 53 45 52 54 2c 20 54 4b 5f 44 45 4c 45 54 45  NSERT, TK_DELETE
2e30: 20 2a 2f 0a 09 45 78 70 72 4c 69 73 74 20 2a 20   */..ExprList * 
2e40: 63 68 61 6e 67 65 73 2c 20 2f 2a 20 43 68 61 6e  changes, /* Chan
2e50: 67 65 73 20 6c 69 73 74 20 66 6f 72 20 61 6e 79  ges list for any
2e60: 20 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67   UPDATE OF trigg
2e70: 65 72 73 20 2a 2f 0a 09 69 6e 74 20 74 72 5f 74  ers */..int tr_t
2e80: 6d 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  m,       /* One 
2e90: 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b  of TK_BEFORE, TK
2ea0: 5f 41 46 54 45 52 20 2a 2f 0a 09 54 61 62 6c 65  _AFTER */..Table
2eb0: 20 2a 20 74 62 6c 2c 20 20 20 20 20 2f 2a 20 54   * tbl,     /* T
2ec0: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 6f 64 65  he table to code
2ed0: 20 74 72 69 67 67 65 72 73 20 66 72 6f 6d 20 2a   triggers from *
2ee0: 2f 0a 09 69 6e 74 20 6e 65 77 54 61 62 6c 65 2c  /..int newTable,
2ef0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 69 63      /* The indic
2f00: 65 20 6f 66 20 74 68 65 20 22 6e 65 77 22 20 72  e of the "new" r
2f10: 6f 77 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ow to access */.
2f20: 09 69 6e 74 20 6f 6c 64 54 61 62 6c 65 2c 20 20  .int oldTable,  
2f30: 20 20 2f 2a 20 54 68 65 20 69 6e 64 69 63 65 20    /* The indice 
2f40: 6f 66 20 74 68 65 20 22 6f 6c 64 22 20 72 6f 77  of the "old" row
2f50: 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 09 69   to access */..i
2f60: 6e 74 20 6f 6e 45 72 72 6f 72 29 20 20 20 20 20  nt onError)     
2f70: 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70  /* ON CONFLICT p
2f80: 6f 6c 69 63 79 20 2a 2f 0a 7b 0a 20 20 54 72 69  olicy */.{.  Tri
2f90: 67 67 65 72 20 2a 20 70 54 72 69 67 67 65 72 3b  gger * pTrigger;
2fa0: 0a 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20  .  TriggerStack 
2fb0: 2a 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 3b  * pTriggerStack;
2fc0: 0a 0a 0a 20 20 61 73 73 65 72 74 28 6f 70 20 3d  ...  assert(op =
2fd0: 3d 20 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20 6f  = TK_UPDATE || o
2fe0: 70 20 3d 3d 20 54 4b 5f 49 4e 53 45 52 54 20 7c  p == TK_INSERT |
2ff0: 7c 20 6f 70 20 3d 3d 20 54 4b 5f 44 45 4c 45 54  | op == TK_DELET
3000: 45 29 3b 0a 20 20 61 73 73 65 72 74 28 74 72 5f  E);.  assert(tr_
3010: 74 6d 20 3d 3d 20 54 4b 5f 42 45 46 4f 52 45 20  tm == TK_BEFORE 
3020: 7c 7c 20 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 41  || tr_tm == TK_A
3030: 46 54 45 52 29 3b 0a 0a 20 20 61 73 73 65 72 74  FTER);..  assert
3040: 28 6e 65 77 54 61 62 6c 65 20 21 3d 20 2d 31 20  (newTable != -1 
3050: 7c 7c 20 6f 6c 64 54 61 62 6c 65 20 21 3d 20 2d  || oldTable != -
3060: 31 29 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 20  1);..  pTrigger 
3070: 3d 20 74 62 6c 2d 3e 70 54 72 69 67 67 65 72 3b  = tbl->pTrigger;
3080: 0a 20 20 77 68 69 6c 65 20 28 70 54 72 69 67 67  .  while (pTrigg
3090: 65 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 66 69  er) {.    int fi
30a0: 72 65 5f 74 68 69 73 20 3d 20 30 3b 0a 0a 20 20  re_this = 0;..  
30b0: 20 20 2f 2a 20 64 65 74 65 72 6d 69 6e 65 20 77    /* determine w
30c0: 68 65 74 68 65 72 20 77 65 20 73 68 6f 75 6c 64  hether we should
30d0: 20 63 6f 64 65 20 74 68 69 73 20 74 72 69 67 67   code this trigg
30e0: 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 54  er */.    if (pT
30f0: 72 69 67 67 65 72 2d 3e 6f 70 20 3d 3d 20 6f 70  rigger->op == op
3100: 20 26 26 20 70 54 72 69 67 67 65 72 2d 3e 74 72   && pTrigger->tr
3110: 5f 74 6d 20 3d 3d 20 74 72 5f 74 6d 20 26 26 20  _tm == tr_tm && 
3120: 0a 09 70 54 72 69 67 67 65 72 2d 3e 66 6f 72 65  ..pTrigger->fore
3130: 61 63 68 20 3d 3d 20 54 4b 5f 52 4f 57 29 20 7b  ach == TK_ROW) {
3140: 0a 20 20 20 20 20 20 66 69 72 65 5f 74 68 69 73  .      fire_this
3150: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 72 69   = 1;.      pTri
3160: 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72  ggerStack = pPar
3170: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20  se->trigStack;. 
3180: 20 20 20 20 20 77 68 69 6c 65 20 28 70 54 72 69       while (pTri
3190: 67 67 65 72 53 74 61 63 6b 29 20 7b 0a 09 69 66  ggerStack) {..if
31a0: 20 28 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d   (pTriggerStack-
31b0: 3e 70 54 72 69 67 67 65 72 20 3d 3d 20 70 54 72  >pTrigger == pTr
31c0: 69 67 67 65 72 29 20 66 69 72 65 5f 74 68 69 73  igger) fire_this
31d0: 20 3d 20 30 3b 0a 09 70 54 72 69 67 67 65 72 53   = 0;..pTriggerS
31e0: 74 61 63 6b 20 3d 20 70 54 72 69 67 67 65 72 53  tack = pTriggerS
31f0: 74 61 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  tack->pNext;.   
3200: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 6f     }.      if (o
3210: 70 20 3d 3d 20 54 4b 5f 55 50 44 41 54 45 20 26  p == TK_UPDATE &
3220: 26 20 70 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c  & pTrigger->pCol
3230: 75 6d 6e 73 20 26 26 0a 09 20 20 21 63 68 65 63  umns &&..  !chec
3240: 6b 43 6f 6c 75 6d 6e 4f 76 65 72 4c 61 70 28 70  kColumnOverLap(p
3250: 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e  Trigger->pColumn
3260: 73 2c 20 63 68 61 6e 67 65 73 29 29 0a 09 66 69  s, changes))..fi
3270: 72 65 5f 74 68 69 73 20 3d 20 30 3b 0a 20 20 20  re_this = 0;.   
3280: 20 7d 0a 0a 20 20 20 20 69 66 20 28 66 69 72 65   }..    if (fire
3290: 5f 74 68 69 73 29 20 7b 0a 20 20 20 20 20 20 69  _this) {.      i
32a0: 6e 74 20 65 6e 64 54 72 69 67 67 65 72 3b 0a 20  nt endTrigger;. 
32b0: 20 20 20 20 20 49 64 4c 69 73 74 20 64 75 6d 6d       IdList dumm
32c0: 79 54 61 62 6c 69 73 74 3b 0a 20 20 20 20 20 20  yTablist;.      
32d0: 45 78 70 72 20 2a 20 77 68 65 6e 45 78 70 72 3b  Expr * whenExpr;
32e0: 0a 0a 20 20 20 20 20 20 64 75 6d 6d 79 54 61 62  ..      dummyTab
32f0: 6c 69 73 74 2e 6e 49 64 20 3d 20 30 3b 0a 20 20  list.nId = 0;.  
3300: 20 20 20 20 64 75 6d 6d 79 54 61 62 6c 69 73 74      dummyTablist
3310: 2e 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  .a = 0;..      /
3320: 2a 20 50 75 73 68 20 61 6e 20 65 6e 74 72 79 20  * Push an entry 
3330: 6f 6e 20 74 6f 20 74 68 65 20 74 72 69 67 67 65  on to the trigge
3340: 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20  r stack */.     
3350: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d   pTriggerStack =
3360: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
3370: 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 61 63  zeof(TriggerStac
3380: 6b 29 29 3b 0a 20 20 20 20 20 20 70 54 72 69 67  k));.      pTrig
3390: 67 65 72 53 74 61 63 6b 2d 3e 70 54 72 69 67 67  gerStack->pTrigg
33a0: 65 72 20 3d 20 70 54 72 69 67 67 65 72 3b 0a 20  er = pTrigger;. 
33b0: 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74 61       pTriggerSta
33c0: 63 6b 2d 3e 6e 65 77 49 64 78 20 3d 20 6e 65 77  ck->newIdx = new
33d0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 72  Table;.      pTr
33e0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
33f0: 64 78 20 3d 20 6f 6c 64 54 61 62 6c 65 3b 0a 20  dx = oldTable;. 
3400: 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74 61       pTriggerSta
3410: 63 6b 2d 3e 70 54 61 62 20 3d 20 74 62 6c 3b 0a  ck->pTab = tbl;.
3420: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74        pTriggerSt
3430: 61 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61  ack->pNext = pPa
3440: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a  rse->trigStack;.
3450: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72        pParse->tr
3460: 69 67 53 74 61 63 6b 20 3d 20 70 54 72 69 67 67  igStack = pTrigg
3470: 65 72 53 74 61 63 6b 3b 0a 0a 20 20 20 20 20 20  erStack;..      
3480: 2f 2a 20 63 6f 64 65 20 74 68 65 20 57 48 45 4e  /* code the WHEN
3490: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
34a0: 20 65 6e 64 54 72 69 67 67 65 72 20 3d 20 73 71   endTrigger = sq
34b0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
34c0: 6c 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 29  l(pParse->pVdbe)
34d0: 3b 0a 20 20 20 20 20 20 77 68 65 6e 45 78 70 72  ;.      whenExpr
34e0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70   = sqliteExprDup
34f0: 28 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e  (pTrigger->pWhen
3500: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 73 71 6c  );.      if (sql
3510: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
3520: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 26 64 75  s(pParse, 0, &du
3530: 6d 6d 79 54 61 62 6c 69 73 74 2c 20 30 2c 20 77  mmyTablist, 0, w
3540: 68 65 6e 45 78 70 72 29 29 20 7b 0a 09 70 50 61  henExpr)) {..pPa
3550: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d  rse->trigStack =
3560: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
3570: 63 6b 2d 3e 70 4e 65 78 74 3b 0a 09 73 71 6c 69  ck->pNext;..sqli
3580: 74 65 46 72 65 65 28 70 54 72 69 67 67 65 72 53  teFree(pTriggerS
3590: 74 61 63 6b 29 3b 0a 09 73 71 6c 69 74 65 45 78  tack);..sqliteEx
35a0: 70 72 44 65 6c 65 74 65 28 77 68 65 6e 45 78 70  prDelete(whenExp
35b0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20  r);..return 1;. 
35c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
35d0: 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70  iteExprIfFalse(p
35e0: 50 61 72 73 65 2c 20 77 68 65 6e 45 78 70 72 2c  Parse, whenExpr,
35f0: 20 65 6e 64 54 72 69 67 67 65 72 29 3b 0a 20 20   endTrigger);.  
3600: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
3610: 6c 65 74 65 28 77 68 65 6e 45 78 70 72 29 3b 0a  lete(whenExpr);.
3620: 0a 20 20 20 20 20 20 63 6f 64 65 54 72 69 67 67  .      codeTrigg
3630: 65 72 50 72 6f 67 72 61 6d 28 70 50 61 72 73 65  erProgram(pParse
3640: 2c 20 70 54 72 69 67 67 65 72 2d 3e 73 74 65 70  , pTrigger->step
3650: 5f 6c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 29 3b  _list, onError);
3660: 20 0a 0a 20 20 20 20 20 20 2f 2a 20 50 6f 70 20   ..      /* Pop 
3670: 74 68 65 20 65 6e 74 72 79 20 6f 66 66 20 74 68  the entry off th
3680: 65 20 74 72 69 67 67 65 72 20 73 74 61 63 6b 20  e trigger stack 
3690: 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  */.      pParse-
36a0: 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 70 50 61  >trigStack = pPa
36b0: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e  rse->trigStack->
36c0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
36d0: 69 74 65 46 72 65 65 28 70 54 72 69 67 67 65 72  iteFree(pTrigger
36e0: 53 74 61 63 6b 29 3b 0a 0a 20 20 20 20 20 20 73  Stack);..      s
36f0: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
3700: 4c 61 62 65 6c 28 70 50 61 72 73 65 2d 3e 70 56  Label(pParse->pV
3710: 64 62 65 2c 20 65 6e 64 54 72 69 67 67 65 72 29  dbe, endTrigger)
3720: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72 69  ;.    }.    pTri
3730: 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
3740: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72  >pNext;.  }..  r
3750: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  eturn 0;.}../*. 
3760: 2a 20 48 61 6e 64 6c 65 20 55 50 44 41 54 45 20  * Handle UPDATE 
3770: 61 6e 64 20 44 45 4c 45 54 45 20 74 72 69 67 67  and DELETE trigg
3780: 65 72 73 20 6f 6e 20 76 69 65 77 73 0a 20 2a 2f  ers on views. */
3790: 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77  .void sqliteView
37a0: 54 72 69 67 67 65 72 73 28 50 61 72 73 65 20 2a  Triggers(Parse *
37b0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
37c0: 54 61 62 2c 20 0a 20 20 20 20 45 78 70 72 20 2a  Tab, .    Expr *
37d0: 20 70 57 68 65 72 65 2c 20 69 6e 74 20 6f 6e 45   pWhere, int onE
37e0: 72 72 6f 72 2c 20 45 78 70 72 4c 69 73 74 20 2a  rror, ExprList *
37f0: 20 70 43 68 61 6e 67 65 73 29 0a 7b 0a 20 20 69   pChanges).{.  i
3800: 6e 74 20 6f 6c 64 49 64 78 20 3d 20 2d 31 3b 0a  nt oldIdx = -1;.
3810: 20 20 69 6e 74 20 6e 65 77 49 64 78 20 3d 20 2d    int newIdx = -
3820: 31 3b 0a 20 20 69 6e 74 20 2a 61 58 52 65 66 20  1;.  int *aXRef 
3830: 3d 20 30 3b 20 20 20 0a 20 20 56 64 62 65 20 2a  = 0;   .  Vdbe *
3840: 76 3b 0a 20 20 69 6e 74 20 65 6e 64 4f 66 4c 6f  v;.  int endOfLo
3850: 6f 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 4f  op;.  int startO
3860: 66 4c 6f 6f 70 3b 0a 20 20 53 65 6c 65 63 74 20  fLoop;.  Select 
3870: 74 68 65 53 65 6c 65 63 74 3b 0a 20 20 54 6f 6b  theSelect;.  Tok
3880: 65 6e 20 74 62 6c 4e 61 6d 65 54 6f 6b 65 6e 3b  en tblNameToken;
3890: 0a 0a 20 20 61 73 73 65 72 74 28 70 54 61 62 2d  ..  assert(pTab-
38a0: 3e 70 53 65 6c 65 63 74 29 3b 0a 0a 20 20 74 62  >pSelect);..  tb
38b0: 6c 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 3d 20 70  lNameToken.z = p
38c0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 74 62  Tab->zName;.  tb
38d0: 6c 4e 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20 73  lNameToken.n = s
38e0: 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a 4e 61 6d  trlen(pTab->zNam
38f0: 65 29 3b 0a 0a 20 20 74 68 65 53 65 6c 65 63 74  e);..  theSelect
3900: 2e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  .isDistinct = 0;
3910: 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 70 45 4c  .  theSelect.pEL
3920: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
3930: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 73 71  ListAppend(0, sq
3940: 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4c 4c 2c  liteExpr(TK_ALL,
3950: 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 20   0, 0, 0), 0);. 
3960: 20 74 68 65 53 65 6c 65 63 74 2e 70 53 72 63 20   theSelect.pSrc 
3970: 20 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74    = sqliteIdList
3980: 41 70 70 65 6e 64 28 30 2c 20 26 74 62 6c 4e 61  Append(0, &tblNa
3990: 6d 65 54 6f 6b 65 6e 29 3b 0a 20 20 74 68 65 53  meToken);.  theS
39a0: 65 6c 65 63 74 2e 70 57 68 65 72 65 20 3d 20 70  elect.pWhere = p
39b0: 57 68 65 72 65 3b 20 20 20 20 70 57 68 65 72 65  Where;    pWhere
39c0: 20 3d 20 30 3b 0a 20 20 74 68 65 53 65 6c 65 63   = 0;.  theSelec
39d0: 74 2e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a  t.pGroupBy = 0;.
39e0: 20 20 74 68 65 53 65 6c 65 63 74 2e 70 48 61 76    theSelect.pHav
39f0: 69 6e 67 20 3d 20 30 3b 0a 20 20 74 68 65 53 65  ing = 0;.  theSe
3a00: 6c 65 63 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  lect.pOrderBy = 
3a10: 30 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 6f  0;.  theSelect.o
3a20: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 20 2f  p = TK_SELECT; /
3a30: 2a 20 3f 3f 20 2a 2f 0a 20 20 74 68 65 53 65 6c  * ?? */.  theSel
3a40: 65 63 74 2e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ect.pPrior = 0;.
3a50: 20 20 74 68 65 53 65 6c 65 63 74 2e 6e 4c 69 6d    theSelect.nLim
3a60: 69 74 20 3d 20 2d 31 3b 0a 20 20 74 68 65 53 65  it = -1;.  theSe
3a70: 6c 65 63 74 2e 6e 4f 66 66 73 65 74 20 3d 20 2d  lect.nOffset = -
3a80: 31 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 7a  1;.  theSelect.z
3a90: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 74 68  Select = 0;.  th
3aa0: 65 53 65 6c 65 63 74 2e 62 61 73 65 20 3d 20 30  eSelect.base = 0
3ab0: 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  ;..  v = sqliteG
3ac0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
3ad0: 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 73    assert(v);.  s
3ae0: 71 6c 69 74 65 42 65 67 69 6e 4d 75 6c 74 69 57  qliteBeginMultiW
3af0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
3b00: 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  arse);..  /* All
3b10: 6f 63 61 74 65 20 74 65 6d 70 20 74 61 62 6c 65  ocate temp table
3b20: 73 20 2a 2f 0a 20 20 6f 6c 64 49 64 78 20 3d 20  s */.  oldIdx = 
3b30: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
3b40: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3b50: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
3b60: 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b 0a 20 20  , oldIdx, 0);.  
3b70: 69 66 20 28 70 43 68 61 6e 67 65 73 29 20 7b 0a  if (pChanges) {.
3b80: 20 20 20 20 6e 65 77 49 64 78 20 3d 20 70 50 61      newIdx = pPa
3b90: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
3ba0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3bb0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
3bc0: 20 6e 65 77 49 64 78 2c 20 30 29 3b 0a 20 20 7d   newIdx, 0);.  }
3bd0: 0a 0a 20 20 2f 2a 20 53 6e 61 70 73 68 6f 74 20  ..  /* Snapshot 
3be0: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 66  the view */.  if
3bf0: 20 28 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70   (sqliteSelect(p
3c00: 50 61 72 73 65 2c 20 26 74 68 65 53 65 6c 65 63  Parse, &theSelec
3c10: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 6f 6c  t, SRT_Table, ol
3c20: 64 49 64 78 2c 20 30 2c 20 30 2c 20 30 29 29 20  dIdx, 0, 0, 0)) 
3c30: 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  {.    goto trigg
3c40: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
3c50: 0a 20 20 2f 2a 20 6c 6f 6f 70 20 74 68 72 75 20  .  /* loop thru 
3c60: 74 68 65 20 76 69 65 77 20 73 6e 61 70 73 68 6f  the view snapsho
3c70: 74 2c 20 65 78 65 63 75 74 69 6e 67 20 74 72 69  t, executing tri
3c80: 67 67 65 72 73 20 66 6f 72 20 65 61 63 68 20 72  ggers for each r
3c90: 6f 77 20 2a 2f 0a 20 20 65 6e 64 4f 66 4c 6f 6f  ow */.  endOfLoo
3ca0: 70 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  p = sqliteVdbeMa
3cb0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71  keLabel(v);.  sq
3cc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3cd0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 6f 6c 64 49   OP_Rewind, oldI
3ce0: 64 78 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a  dx, endOfLoop);.
3cf0: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 75 20  .  /* Loop thru 
3d00: 74 68 65 20 76 69 65 77 20 73 6e 61 70 73 68 6f  the view snapsho
3d10: 74 2c 20 65 78 65 63 75 74 69 6e 67 20 74 72 69  t, executing tri
3d20: 67 67 65 72 73 20 66 6f 72 20 65 61 63 68 20 72  ggers for each r
3d30: 6f 77 20 2a 2f 0a 20 20 73 74 61 72 74 4f 66 4c  ow */.  startOfL
3d40: 6f 6f 70 20 3d 20 73 71 6c 69 74 65 56 64 62 65  oop = sqliteVdbe
3d50: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
3d60: 0a 20 20 2f 2a 20 42 75 69 6c 64 20 74 68 65 20  .  /* Build the 
3d70: 75 70 64 61 74 65 64 20 72 6f 77 20 69 66 20 72  updated row if r
3d80: 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 20  equired */.  if 
3d90: 28 70 43 68 61 6e 67 65 73 29 20 7b 0a 20 20 20  (pChanges) {.   
3da0: 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20   int ii, jj;..  
3db0: 20 20 61 58 52 65 66 20 3d 20 73 71 6c 69 74 65    aXRef = sqlite
3dc0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 69  Malloc( sizeof(i
3dd0: 6e 74 29 20 2a 20 70 54 61 62 2d 3e 6e 43 6f 6c  nt) * pTab->nCol
3de0: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 58 52 65   );.    if( aXRe
3df0: 66 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72 69 67  f==0 ) goto trig
3e00: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
3e10: 20 66 6f 72 20 28 69 69 20 3d 20 30 3b 20 69 69   for (ii = 0; ii
3e20: 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   < pTab->nCol; i
3e30: 69 2b 2b 29 0a 20 20 20 20 20 20 61 58 52 65 66  i++).      aXRef
3e40: 5b 69 69 5d 20 3d 20 2d 31 3b 0a 0a 20 20 20 20  [ii] = -1;..    
3e50: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 68  for(ii=0; ii<pCh
3e60: 61 6e 67 65 73 2d 3e 6e 45 78 70 72 3b 20 69 69  anges->nExpr; ii
3e70: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
3e80: 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  j;.      if( sql
3e90: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
3ea0: 73 28 70 50 61 72 73 65 2c 20 6f 6c 64 49 64 78  s(pParse, oldIdx
3eb0: 2c 20 74 68 65 53 65 6c 65 63 74 2e 70 53 72 63  , theSelect.pSrc
3ec0: 20 2c 20 30 2c 20 0a 09 20 20 20 20 70 43 68 61   , 0, ..    pCha
3ed0: 6e 67 65 73 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  nges->a[ii].pExp
3ee0: 72 29 20 29 0a 09 67 6f 74 6f 20 74 72 69 67 67  r) )..goto trigg
3ef0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 20  er_cleanup;..   
3f00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
3f10: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
3f20: 43 68 61 6e 67 65 73 2d 3e 61 5b 69 69 5d 2e 70  Changes->a[ii].p
3f30: 45 78 70 72 2c 20 30 2c 20 30 29 20 29 0a 09 67  Expr, 0, 0) )..g
3f40: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
3f50: 6e 75 70 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  nup;..      for(
3f60: 6a 6a 3d 30 3b 20 6a 6a 3c 70 54 61 62 2d 3e 6e  jj=0; jj<pTab->n
3f70: 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 09 69 66 28  Col; jj++){..if(
3f80: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70   sqliteStrICmp(p
3f90: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 6a 5d 2e 7a 4e  Tab->aCol[jj].zN
3fa0: 61 6d 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61  ame, pChanges->a
3fb0: 5b 69 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  [ii].zName)==0 )
3fc0: 7b 0a 09 20 20 61 58 52 65 66 5b 6a 6a 5d 20 3d  {..  aXRef[jj] =
3fd0: 20 69 69 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 09   ii;..  break;..
3fe0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
3ff0: 69 66 28 20 6a 6a 3e 3d 70 54 61 62 2d 3e 6e 43  if( jj>=pTab->nC
4000: 6f 6c 20 29 7b 0a 09 73 71 6c 69 74 65 53 65 74  ol ){..sqliteSet
4010: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
4020: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
4030: 68 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20 0a 09 20  h column: ", .. 
4040: 20 20 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69     pChanges->a[i
4050: 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 09 70  i].zName, 0);..p
4060: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 09  Parse->nErr++;..
4070: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
4080: 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  anup;.      }.  
4090: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 56    }..    sqliteV
40a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
40b0: 6e 74 65 67 65 72 2c 20 31 33 2c 20 30 29 3b 0a  nteger, 13, 0);.
40c0: 0a 20 20 20 20 66 6f 72 20 28 69 69 20 3d 20 30  .    for (ii = 0
40d0: 3b 20 69 69 20 3c 20 70 54 61 62 2d 3e 6e 43 6f  ; ii < pTab->nCo
40e0: 6c 3b 20 69 69 2b 2b 29 0a 20 20 20 20 20 20 69  l; ii++).      i
40f0: 66 28 20 61 58 52 65 66 5b 69 69 5d 20 3c 20 30  f( aXRef[ii] < 0
4100: 20 29 20 0a 09 73 71 6c 69 74 65 56 64 62 65 41   ) ..sqliteVdbeA
4110: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
4120: 6e 2c 20 6f 6c 64 49 64 78 2c 20 69 69 29 3b 0a  n, oldIdx, ii);.
4130: 20 20 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69        else..sqli
4140: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
4150: 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 61  e, pChanges->a[a
4160: 58 52 65 66 5b 69 69 5d 5d 2e 70 45 78 70 72 29  XRef[ii]].pExpr)
4170: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ;..    sqliteVdb
4180: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
4190: 65 52 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e 6e  eRecord, pTab->n
41a0: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Col, 0);.    sql
41b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
41c0: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 6e 65  OP_PutIntKey, ne
41d0: 77 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71  wIdx, 0);.    sq
41e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
41f0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 6e 65 77 49   OP_Rewind, newI
4200: 64 78 2c 20 30 29 3b 0a 0a 20 20 20 20 73 71 6c  dx, 0);..    sql
4210: 69 74 65 43 6f 64 65 52 6f 77 54 72 69 67 67 65  iteCodeRowTrigge
4220: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 55 50 44  r(pParse, TK_UPD
4230: 41 54 45 2c 20 70 43 68 61 6e 67 65 73 2c 20 54  ATE, pChanges, T
4240: 4b 5f 42 45 46 4f 52 45 2c 20 0a 09 70 54 61 62  K_BEFORE, ..pTab
4250: 2c 20 6e 65 77 49 64 78 2c 20 6f 6c 64 49 64 78  , newIdx, oldIdx
4260: 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a 20 20 20 20  , onError);.    
4270: 73 71 6c 69 74 65 43 6f 64 65 52 6f 77 54 72 69  sqliteCodeRowTri
4280: 67 67 65 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  gger(pParse, TK_
4290: 55 50 44 41 54 45 2c 20 70 43 68 61 6e 67 65 73  UPDATE, pChanges
42a0: 2c 20 54 4b 5f 41 46 54 45 52 2c 20 0a 09 70 54  , TK_AFTER, ..pT
42b0: 61 62 2c 20 6e 65 77 49 64 78 2c 20 6f 6c 64 49  ab, newIdx, oldI
42c0: 64 78 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a 20 20  dx, onError);.  
42d0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 71 6c  } else {.    sql
42e0: 69 74 65 43 6f 64 65 52 6f 77 54 72 69 67 67 65  iteCodeRowTrigge
42f0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 45 4c  r(pParse, TK_DEL
4300: 45 54 45 2c 20 30 2c 20 54 4b 5f 42 45 46 4f 52  ETE, 0, TK_BEFOR
4310: 45 2c 20 70 54 61 62 2c 20 2d 31 2c 20 6f 6c 64  E, pTab, -1, old
4320: 49 64 78 2c 20 0a 09 6f 6e 45 72 72 6f 72 29 3b  Idx, ..onError);
4330: 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 64 65 52  .    sqliteCodeR
4340: 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65  owTrigger(pParse
4350: 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20  , TK_DELETE, 0, 
4360: 54 4b 5f 41 46 54 45 52 2c 20 70 54 61 62 2c 20  TK_AFTER, pTab, 
4370: 2d 31 2c 20 6f 6c 64 49 64 78 2c 20 0a 09 6f 6e  -1, oldIdx, ..on
4380: 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 0a 20 20 73  Error);.  }..  s
4390: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
43a0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 6f 6c 64 49 64  , OP_Next, oldId
43b0: 78 2c 20 73 74 61 72 74 4f 66 4c 6f 6f 70 29 3b  x, startOfLoop);
43c0: 0a 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52 65  ..  sqliteVdbeRe
43d0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
43e0: 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 73 71 6c 69  dOfLoop);.  sqli
43f0: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
4400: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 0a 74 72  ion(pParse);..tr
4410: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20  igger_cleanup:. 
4420: 20 73 71 6c 69 74 65 46 72 65 65 28 61 58 52 65   sqliteFree(aXRe
4430: 66 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  f);.  sqliteExpr
4440: 4c 69 73 74 44 65 6c 65 74 65 28 70 43 68 61 6e  ListDelete(pChan
4450: 67 65 73 29 3b 0a 20 20 73 71 6c 69 74 65 45 78  ges);.  sqliteEx
4460: 70 72 44 65 6c 65 74 65 28 70 57 68 65 72 65 29  prDelete(pWhere)
4470: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69  ;.  sqliteExprLi
4480: 73 74 44 65 6c 65 74 65 28 74 68 65 53 65 6c 65  stDelete(theSele
4490: 63 74 2e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71  ct.pEList);.  sq
44a0: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
44b0: 28 74 68 65 53 65 6c 65 63 74 2e 70 53 72 63 29  (theSelect.pSrc)
44c0: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 44 65  ;.  sqliteExprDe
44d0: 6c 65 74 65 28 74 68 65 53 65 6c 65 63 74 2e 70  lete(theSelect.p
44e0: 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e  Where);.  return
44f0: 3b 0a 7d 0a 0a 0a                                ;.}...