/ Hex Artifact Content
Login

Artifact a5e6694f2cc6f1b3c10b954b9bc904548f3599fc:


0000: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  /*.**.** The aut
0010: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0020: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0030: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0040: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0050: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0060: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0070: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0080: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0090: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00a0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00b0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00c0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00d0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00e0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
00f0: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0100: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0110: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 0a 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  *.*.*/.#include 
0170: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0180: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
0190: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
01a0: 72 20 77 68 65 6e 20 69 74 20 73 65 65 73 20 61  r when it sees a
01b0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
01c0: 73 74 61 74 65 6d 65 6e 74 2e 20 53 65 65 0a 2a  statement. See.*
01d0: 2a 20 63 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f  * comments surro
01e0: 75 6e 64 69 6e 67 20 73 74 72 75 63 74 20 54 72  unding struct Tr
01f0: 69 67 67 65 72 20 69 6e 20 73 71 6c 69 74 65 49  igger in sqliteI
0200: 6e 74 2e 68 20 66 6f 72 20 61 20 64 65 73 63 72  nt.h for a descr
0210: 69 70 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 68 6f  iption of .** ho
0220: 77 20 74 72 69 67 67 65 72 73 20 61 72 65 20 73  w triggers are s
0230: 74 6f 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tored..*/.void s
0240: 71 6c 69 74 65 43 72 65 61 74 65 54 72 69 67 67  qliteCreateTrigg
0250: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
0260: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
0270: 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74 20 6f   parse context o
0280: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 52 49  f the CREATE TRI
0290: 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74 20 2a  GGER statement *
02a0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
02b0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  ,       /* The n
02c0: 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67 67  ame of the trigg
02d0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74  er */.  int tr_t
02e0: 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  m,          /* O
02f0: 6e 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c  ne of TK_BEFORE,
0300: 20 54 4b 5f 41 46 54 45 52 20 2a 2f 0a 20 20 69   TK_AFTER */.  i
0310: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
0320: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
0330: 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50 44 41 54  INSERT, TK_UPDAT
0340: 45 2c 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a  E, TK_DELETE */.
0350: 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d    IdList *pColum
0360: 6e 73 2c 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20  ns,   /* column 
0370: 6c 69 73 74 20 69 66 20 74 68 69 73 20 69 73 20  list if this is 
0380: 61 6e 20 55 50 44 41 54 45 20 4f 46 20 74 72 69  an UPDATE OF tri
0390: 67 67 65 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  gger */.  Token 
03a0: 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 2f 2a  *pTableName,  /*
03b0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
03c0: 20 74 61 62 6c 65 2f 76 69 65 77 20 74 68 65 20   table/view the 
03d0: 74 72 69 67 67 65 72 20 61 70 70 6c 69 65 73 20  trigger applies 
03e0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6f 72 65  to */.  int fore
03f0: 61 63 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  ach,        /* O
0400: 6e 65 20 6f 66 20 54 4b 5f 52 4f 57 20 6f 72 20  ne of TK_ROW or 
0410: 54 4b 5f 53 54 41 54 45 4d 45 4e 54 20 2a 2f 0a  TK_STATEMENT */.
0420: 20 20 45 78 70 72 20 2a 70 57 68 65 6e 2c 20 20    Expr *pWhen,  
0430: 20 20 20 20 20 20 2f 2a 20 57 48 45 4e 20 63 6c        /* WHEN cl
0440: 61 75 73 65 20 2a 2f 0a 20 20 54 72 69 67 67 65  ause */.  Trigge
0450: 72 53 74 65 70 20 2a 70 53 74 65 70 4c 69 73 74  rStep *pStepList
0460: 2c 20 2f 2a 20 54 68 65 20 74 72 69 67 67 65 72  , /* The trigger
0470: 65 64 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20  ed program */.  
0480: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74  char const *zDat
0490: 61 2c 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e  a,  /* The strin
04a0: 67 20 64 61 74 61 20 74 6f 20 6d 61 6b 65 20 70  g data to make p
04b0: 65 72 73 69 73 74 65 6e 74 20 2a 2f 0a 20 20 69  ersistent */.  i
04c0: 6e 74 20 7a 44 61 74 61 4c 65 6e 0a 29 7b 0a 20  nt zDataLen.){. 
04d0: 20 54 72 69 67 67 65 72 20 2a 6e 74 3b 0a 20 20   Trigger *nt;.  
04e0: 54 61 62 6c 65 20 20 20 2a 74 61 62 3b 0a 20 20  Table   *tab;.  
04f0: 69 6e 74 20 6f 66 66 73 65 74 3b 0a 20 20 54 72  int offset;.  Tr
0500: 69 67 67 65 72 53 74 65 70 20 2a 73 73 3b 0a 0a  iggerStep *ss;..
0510: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 3a    /* Check that:
0520: 20 0a 20 20 2a 2a 20 31 2e 20 74 68 65 20 74 72   .  ** 1. the tr
0530: 69 67 67 65 72 20 6e 61 6d 65 20 64 6f 65 73 20  igger name does 
0540: 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
0550: 74 2e 0a 20 20 2a 2a 20 32 2e 20 74 68 65 20 74  t..  ** 2. the t
0560: 61 62 6c 65 20 28 6f 72 20 76 69 65 77 29 20 64  able (or view) d
0570: 6f 65 73 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a  oes exist..  */.
0580: 20 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 74 6d    {.    char *tm
0590: 70 5f 73 74 72 20 3d 20 73 71 6c 69 74 65 53 74  p_str = sqliteSt
05a0: 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20  rNDup(pName->z, 
05b0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
05c0: 66 28 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e  f( sqliteHashFin
05d0: 64 28 26 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  d(&(pParse->db->
05e0: 74 72 69 67 48 61 73 68 29 2c 20 74 6d 70 5f 73  trigHash), tmp_s
05f0: 74 72 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 31  tr, pName->n + 1
0600: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
0610: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
0620: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
0630: 72 69 67 67 65 72 20 22 2c 20 2d 31 2c 0a 20 20  rigger ", -1,.  
0640: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
0650: 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 22 20 61 6c  , pName->n, " al
0660: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 2d  ready exists", -
0670: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
0680: 69 74 65 46 72 65 65 28 74 6d 70 5f 73 74 72 29  iteFree(tmp_str)
0690: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
06a0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f  nErr++;.      go
06b0: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
06c0: 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  up;.    }.    sq
06d0: 6c 69 74 65 46 72 65 65 28 74 6d 70 5f 73 74 72  liteFree(tmp_str
06e0: 29 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20 63  );.  }.  {.    c
06f0: 68 61 72 20 2a 74 6d 70 5f 73 74 72 20 3d 20 73  har *tmp_str = s
0700: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 54 61  qliteStrNDup(pTa
0710: 62 6c 65 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61 62  bleName->z, pTab
0720: 6c 65 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20  leName->n);.    
0730: 69 66 28 20 74 6d 70 5f 73 74 72 3d 3d 30 20 29  if( tmp_str==0 )
0740: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
0750: 65 61 6e 75 70 3b 0a 20 20 20 20 74 61 62 20 3d  eanup;.    tab =
0760: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
0770: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 74 6d 70  (pParse->db, tmp
0780: 5f 73 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  _str);.    sqlit
0790: 65 46 72 65 65 28 74 6d 70 5f 73 74 72 29 3b 0a  eFree(tmp_str);.
07a0: 20 20 20 20 69 66 28 20 21 74 61 62 20 29 7b 0a      if( !tab ){.
07b0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
07c0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
07d0: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
07e0: 68 20 74 61 62 6c 65 3a 20 22 2c 20 2d 31 2c 0a  h table: ", -1,.
07f0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65            pTable
0800: 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e  Name->z, pTableN
0810: 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ame->n, 0);.    
0820: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
0830: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69  ;.      goto tri
0840: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
0850: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
0860: 74 65 53 74 72 49 43 6d 70 28 74 61 62 2d 3e 7a  teStrICmp(tab->z
0870: 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
0880: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  E)==0 ){.      s
0890: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
08a0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
08b0: 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "cannot create 
08c0: 74 72 69 67 67 65 72 20 6f 6e 20 73 79 73 74 65  trigger on syste
08d0: 6d 20 22 0a 20 20 20 20 20 20 20 20 20 22 74 61  m ".         "ta
08e0: 62 6c 65 3a 20 22 20 4d 41 53 54 45 52 5f 4e 41  ble: " MASTER_NA
08f0: 4d 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  ME, 0);.      pP
0900: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
0910: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
0920: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
0930: 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20    }..  /* Build 
0940: 74 68 65 20 54 72 69 67 67 65 72 20 6f 62 6a 65  the Trigger obje
0950: 63 74 20 2a 2f 0a 20 20 6e 74 20 3d 20 28 54 72  ct */.  nt = (Tr
0960: 69 67 67 65 72 2a 29 73 71 6c 69 74 65 4d 61 6c  igger*)sqliteMal
0970: 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69 67 67  loc(sizeof(Trigg
0980: 65 72 29 29 3b 0a 20 20 69 66 28 20 6e 74 3d 3d  er));.  if( nt==
0990: 30 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72  0 ) goto trigger
09a0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 6e 74 2d 3e  _cleanup;.  nt->
09b0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  name = sqliteStr
09c0: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
09d0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 6e 74 2d 3e  Name->n);.  nt->
09e0: 74 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 53 74  table = sqliteSt
09f0: 72 4e 44 75 70 28 70 54 61 62 6c 65 4e 61 6d 65  rNDup(pTableName
0a00: 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d  ->z, pTableName-
0a10: 3e 6e 29 3b 0a 20 20 6e 74 2d 3e 73 74 72 69 6e  >n);.  nt->strin
0a20: 67 73 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  gs = sqliteStrND
0a30: 75 70 28 7a 44 61 74 61 2c 20 7a 44 61 74 61 4c  up(zData, zDataL
0a40: 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  en);.  if( sqlit
0a50: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
0a60: 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63  ) goto trigger_c
0a70: 6c 65 61 6e 75 70 3b 0a 20 20 6e 74 2d 3e 6f 70  leanup;.  nt->op
0a80: 20 3d 20 6f 70 3b 0a 20 20 6e 74 2d 3e 74 72 5f   = op;.  nt->tr_
0a90: 74 6d 20 3d 20 74 72 5f 74 6d 3b 0a 20 20 6e 74  tm = tr_tm;.  nt
0aa0: 2d 3e 70 57 68 65 6e 20 3d 20 70 57 68 65 6e 3b  ->pWhen = pWhen;
0ab0: 0a 20 20 6e 74 2d 3e 70 43 6f 6c 75 6d 6e 73 20  .  nt->pColumns 
0ac0: 3d 20 70 43 6f 6c 75 6d 6e 73 3b 0a 20 20 6e 74  = pColumns;.  nt
0ad0: 2d 3e 66 6f 72 65 61 63 68 20 3d 20 66 6f 72 65  ->foreach = fore
0ae0: 61 63 68 3b 0a 20 20 6e 74 2d 3e 73 74 65 70 5f  ach;.  nt->step_
0af0: 6c 69 73 74 20 3d 20 70 53 74 65 70 4c 69 73 74  list = pStepList
0b00: 3b 0a 20 20 6e 74 2d 3e 69 73 43 6f 6d 6d 69 74  ;.  nt->isCommit
0b10: 20 3d 20 30 3b 0a 20 20 6f 66 66 73 65 74 20 3d   = 0;.  offset =
0b20: 20 28 69 6e 74 29 28 6e 74 2d 3e 73 74 72 69 6e   (int)(nt->strin
0b30: 67 73 20 2d 20 7a 44 61 74 61 29 3b 0a 20 20 73  gs - zData);.  s
0b40: 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53 74 72  qliteExprMoveStr
0b50: 69 6e 67 73 28 6e 74 2d 3e 70 57 68 65 6e 2c 20  ings(nt->pWhen, 
0b60: 6f 66 66 73 65 74 29 3b 0a 0a 20 20 73 73 20 3d  offset);..  ss =
0b70: 20 6e 74 2d 3e 73 74 65 70 5f 6c 69 73 74 3b 0a   nt->step_list;.
0b80: 20 20 77 68 69 6c 65 28 20 73 73 20 29 7b 0a 20    while( ss ){. 
0b90: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 4d     sqliteSelectM
0ba0: 6f 76 65 53 74 72 69 6e 67 73 28 73 73 2d 3e 70  oveStrings(ss->p
0bb0: 53 65 6c 65 63 74 2c 20 6f 66 66 73 65 74 29 3b  Select, offset);
0bc0: 0a 20 20 20 20 69 66 28 20 73 73 2d 3e 74 61 72  .    if( ss->tar
0bd0: 67 65 74 2e 7a 20 29 7b 0a 20 20 20 20 20 20 73  get.z ){.      s
0be0: 73 2d 3e 74 61 72 67 65 74 2e 7a 20 2b 3d 20 6f  s->target.z += o
0bf0: 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
0c00: 20 73 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53   sqliteExprMoveS
0c10: 74 72 69 6e 67 73 28 73 73 2d 3e 70 57 68 65 72  trings(ss->pWher
0c20: 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  e, offset);.    
0c30: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 4d 6f  sqliteExprListMo
0c40: 76 65 53 74 72 69 6e 67 73 28 73 73 2d 3e 70 45  veStrings(ss->pE
0c50: 78 70 72 4c 69 73 74 2c 20 6f 66 66 73 65 74 29  xprList, offset)
0c60: 3b 0a 0a 20 20 20 20 73 73 20 3d 20 73 73 2d 3e  ;..    ss = ss->
0c70: 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pNext;.  }..  /*
0c80: 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69   if we are not i
0c90: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 61 6e 64  nitializing, and
0ca0: 20 74 68 69 73 20 74 72 69 67 67 65 72 20 69 73   this trigger is
0cb0: 20 6e 6f 74 20 6f 6e 20 61 20 54 45 4d 50 20 74   not on a TEMP t
0cc0: 61 62 6c 65 2c 20 0a 20 20 2a 2a 20 62 75 69 6c  able, .  ** buil
0cd0: 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  d the sqlite_mas
0ce0: 74 65 72 20 65 6e 74 72 79 0a 20 20 2a 2f 0a 20  ter entry.  */. 
0cf0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e   if( !pParse->in
0d00: 69 74 46 6c 61 67 20 26 26 20 21 74 61 62 2d 3e  itFlag && !tab->
0d10: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 73 74  isTemp ){.    st
0d20: 61 74 69 63 20 56 64 62 65 4f 70 20 69 6e 73 65  atic VdbeOp inse
0d30: 72 74 54 72 69 67 5b 5d 20 3d 20 7b 0a 20 20 20  rtTrig[] = {.   
0d40: 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74     { OP_OpenWrit
0d50: 65 2c 20 20 30 2c 20 32 2c 20 20 4d 41 53 54 45  e,  0, 2,  MASTE
0d60: 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b  R_NAME},.      {
0d70: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 20 20   OP_NewRecno,   
0d80: 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20 20  0, 0,  0        
0d90: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f    },.      { OP_
0da0: 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30  String,     0, 0
0db0: 2c 20 20 22 74 72 69 67 67 65 72 22 20 20 7d 2c  ,  "trigger"  },
0dc0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
0dd0: 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 30  ng,     0, 0,  0
0de0: 20 20 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a            },  /*
0df0: 20 33 3a 20 74 72 69 67 67 65 72 20 6e 61 6d 65   3: trigger name
0e00: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
0e10: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
0e20: 20 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 20    0          }, 
0e30: 20 2f 2a 20 34 3a 20 74 61 62 6c 65 20 6e 61 6d   /* 4: table nam
0e40: 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  e */.      { OP_
0e50: 49 6e 74 65 67 65 72 2c 20 20 20 20 30 2c 20 30  Integer,    0, 0
0e60: 2c 20 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c  ,  0          },
0e70: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
0e80: 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 30  ng,     0, 0,  0
0e90: 20 20 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a            },  /*
0ea0: 20 36 3a 20 53 51 4c 20 2a 2f 0a 20 20 20 20 20   6: SQL */.     
0eb0: 20 7b 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64   { OP_MakeRecord
0ec0: 2c 20 35 2c 20 30 2c 20 20 30 20 20 20 20 20 20  , 5, 0,  0      
0ed0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f      },.      { O
0ee0: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 20 30 2c  P_PutIntKey,  0,
0ef0: 20 30 2c 20 20 30 20 20 20 20 20 20 20 20 20 20   0,  0          
0f00: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e  },.      { OP_In
0f10: 74 65 67 65 72 2c 20 20 20 20 30 2c 20 30 2c 20  teger,    0, 0, 
0f20: 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 20 20   0          },  
0f30: 2f 2a 20 39 3a 20 4e 65 78 74 20 63 6f 6f 6b 69  /* 9: Next cooki
0f40: 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  e */.      { OP_
0f50: 53 65 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 30  SetCookie,  0, 0
0f60: 2c 20 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c  ,  0          },
0f70: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73  .      { OP_Clos
0f80: 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 20 30  e,      0, 0,  0
0f90: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
0fa0: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   };.    int addr
0fb0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a  ;.    Vdbe *v;..
0fc0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65      /* Make an e
0fd0: 6e 74 72 79 20 69 6e 20 74 68 65 20 73 71 6c 69  ntry in the sqli
0fe0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
0ff0: 2a 2f 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  */.    v = sqlit
1000: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
1010: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
1020: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
1030: 65 61 6e 75 70 3b 0a 20 20 20 20 73 71 6c 69 74  eanup;.    sqlit
1040: 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
1050: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 29 3b  tion(pParse, 0);
1060: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
1070: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
1080: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 69 6e 73  v, ArraySize(ins
1090: 65 72 74 54 72 69 67 29 2c 20 69 6e 73 65 72 74  ertTrig), insert
10a0: 54 72 69 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  Trig);.    sqlit
10b0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
10c0: 20 61 64 64 72 2b 33 2c 20 6e 74 2d 3e 6e 61 6d   addr+3, nt->nam
10d0: 65 2c 20 30 29 3b 20 0a 20 20 20 20 73 71 6c 69  e, 0); .    sqli
10e0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
10f0: 2c 20 61 64 64 72 2b 34 2c 20 6e 74 2d 3e 74 61  , addr+4, nt->ta
1100: 62 6c 65 2c 20 30 29 3b 20 0a 20 20 20 20 73 71  ble, 0); .    sq
1110: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
1120: 28 76 2c 20 61 64 64 72 2b 36 2c 20 6e 74 2d 3e  (v, addr+6, nt->
1130: 73 74 72 69 6e 67 73 2c 20 30 29 3b 0a 20 20 20  strings, 0);.   
1140: 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f   sqliteChangeCoo
1150: 6b 69 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  kie(pParse->db);
1160: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
1170: 68 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72 2b  hangeP1(v, addr+
1180: 39 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  9, pParse->db->n
1190: 65 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20  ext_cookie);.   
11a0: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
11b0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
11c0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
11d0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
11e0: 0a 20 20 20 20 2f 2a 20 53 74 69 63 6b 20 69 74  .    /* Stick it
11f0: 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62   in the hash-tab
1200: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
1210: 48 61 73 68 49 6e 73 65 72 74 28 26 28 70 50 61  HashInsert(&(pPa
1220: 72 73 65 2d 3e 64 62 2d 3e 74 72 69 67 48 61 73  rse->db->trigHas
1230: 68 29 2c 20 6e 74 2d 3e 6e 61 6d 65 2c 20 70 4e  h), nt->name, pN
1240: 61 6d 65 2d 3e 6e 20 2b 20 31 2c 20 6e 74 29 3b  ame->n + 1, nt);
1250: 0a 0a 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20  ..    /* Attach 
1260: 69 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  it to the table 
1270: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6e 74  object */.    nt
1280: 2d 3e 70 4e 65 78 74 20 3d 20 74 61 62 2d 3e 70  ->pNext = tab->p
1290: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 74 61 62  Trigger;.    tab
12a0: 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 6e 74 3b  ->pTrigger = nt;
12b0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
12c0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
12d0: 46 72 65 65 28 6e 74 2d 3e 73 74 72 69 6e 67 73  Free(nt->strings
12e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
12f0: 65 28 6e 74 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  e(nt->name);.   
1300: 20 73 71 6c 69 74 65 46 72 65 65 28 6e 74 2d 3e   sqliteFree(nt->
1310: 74 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69  table);.    sqli
1320: 74 65 46 72 65 65 28 6e 74 29 3b 0a 20 20 7d 0a  teFree(nt);.  }.
1330: 0a 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70  .trigger_cleanup
1340: 3a 0a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73  :..  sqliteIdLis
1350: 74 44 65 6c 65 74 65 28 70 43 6f 6c 75 6d 6e 73  tDelete(pColumns
1360: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 44  );.  sqliteExprD
1370: 65 6c 65 74 65 28 70 57 68 65 6e 29 3b 0a 20 20  elete(pWhen);.  
1380: 7b 0a 20 20 20 20 54 72 69 67 67 65 72 53 74 65  {.    TriggerSte
1390: 70 20 2a 20 70 70 3b 0a 20 20 20 20 54 72 69 67  p * pp;.    Trig
13a0: 67 65 72 53 74 65 70 20 2a 20 6e 6e 3b 0a 0a 20  gerStep * nn;.. 
13b0: 20 20 20 70 70 20 3d 20 70 53 74 65 70 4c 69 73     pp = pStepLis
13c0: 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 70  t;.    while( pp
13d0: 20 29 7b 0a 20 20 20 20 20 20 6e 6e 20 3d 20 70   ){.      nn = p
13e0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
13f0: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
1400: 28 70 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  (pp->pWhere);.  
1410: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69      sqliteExprLi
1420: 73 74 44 65 6c 65 74 65 28 70 70 2d 3e 70 45 78  stDelete(pp->pEx
1430: 70 72 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73  prList);.      s
1440: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
1450: 65 28 70 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  e(pp->pSelect);.
1460: 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69        sqliteIdLi
1470: 73 74 44 65 6c 65 74 65 28 70 70 2d 3e 70 49 64  stDelete(pp->pId
1480: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  List);.      sql
1490: 69 74 65 46 72 65 65 28 70 70 29 3b 0a 20 20 20  iteFree(pp);.   
14a0: 20 20 20 70 70 20 3d 20 6e 6e 3b 0a 20 20 20 20     pp = nn;.    
14b0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
14c0: 75 72 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  urn a SELECT sta
14d0: 74 65 6d 65 6e 74 20 28 74 68 61 74 20 74 68 65  tement (that the
14e0: 20 70 53 65 6c 65 63 74 20 70 61 72 61 6d 65 74   pSelect paramet
14f0: 65 72 20 70 6f 69 6e 74 73 20 74 6f 29 20 69 6e  er points to) in
1500: 74 6f 0a 2a 2a 20 61 20 74 72 69 67 67 65 72 20  to.** a trigger 
1510: 73 74 65 70 2e 20 20 52 65 74 75 72 6e 20 61 20  step.  Return a 
1520: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 72 69  pointer to a Tri
1530: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
1540: 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  re..**.** The pa
1550: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
1560: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 20  routine when it 
1570: 66 69 6e 64 73 20 61 20 53 45 4c 45 43 54 20 73  finds a SELECT s
1580: 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62  tatement in.** b
1590: 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52  ody of a TRIGGER
15a0: 2e 20 20 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74  .  .*/.TriggerSt
15b0: 65 70 20 2a 73 71 6c 69 74 65 54 72 69 67 67 65  ep *sqliteTrigge
15c0: 72 53 65 6c 65 63 74 53 74 65 70 28 53 65 6c 65  rSelectStep(Sele
15d0: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
15e0: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72  TriggerStep *pTr
15f0: 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69  iggerStep = sqli
1600: 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
1610: 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a 20  TriggerStep));. 
1620: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65   if( pTriggerSte
1630: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
1640: 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ..  pTriggerStep
1650: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1660: 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ;.  pTriggerStep
1670: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ->pSelect = pSel
1680: 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53  ect;.  pTriggerS
1690: 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45  tep->orconf = OE
16a0: 5f 44 65 66 61 75 6c 74 3b 0a 0a 20 20 72 65 74  _Default;..  ret
16b0: 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70  urn pTriggerStep
16c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 69 6c 64  ;.}../*.** Build
16d0: 20 61 20 74 72 69 67 67 65 72 20 73 74 65 70 20   a trigger step 
16e0: 6f 75 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  out of an INSERT
16f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74   statement.  Ret
1700: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
1710: 20 74 6f 20 74 68 65 20 6e 65 77 20 74 72 69 67   to the new trig
1720: 67 65 72 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  ger step..**.** 
1730: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
1740: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
1750: 65 6e 20 69 74 20 73 65 65 73 20 61 6e 20 49 4e  en it sees an IN
1760: 53 45 52 54 20 69 6e 73 69 64 65 20 74 68 65 0a  SERT inside the.
1770: 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20 74 72 69  ** body of a tri
1780: 67 67 65 72 2e 0a 2a 2f 0a 54 72 69 67 67 65 72  gger..*/.Trigger
1790: 53 74 65 70 20 2a 73 71 6c 69 74 65 54 72 69 67  Step *sqliteTrig
17a0: 67 65 72 49 6e 73 65 72 74 53 74 65 70 28 0a 20  gerInsertStep(. 
17b0: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
17c0: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
17d0: 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  the table into w
17e0: 68 69 63 68 20 77 65 20 69 6e 73 65 72 74 20 2a  hich we insert *
17f0: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c  /.  IdList *pCol
1800: 75 6d 6e 2c 20 20 20 20 2f 2a 20 4c 69 73 74 20  umn,    /* List 
1810: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 54  of columns in pT
1820: 61 62 6c 65 4e 61 6d 65 20 74 6f 20 69 6e 73 65  ableName to inse
1830: 72 74 20 69 6e 74 6f 20 2a 2f 0a 20 20 45 78 70  rt into */.  Exp
1840: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
1850: 20 2f 2a 20 54 68 65 20 56 41 4c 55 45 20 63 6c   /* The VALUE cl
1860: 61 75 73 65 3a 20 61 20 6c 69 73 74 20 6f 66 20  ause: a list of 
1870: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 69 6e 73  values to be ins
1880: 65 72 74 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  erted */.  Selec
1890: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 2f  t *pSelect,    /
18a0: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
18b0: 6d 65 6e 74 20 74 68 61 74 20 73 75 70 70 6c 69  ment that suppli
18c0: 65 73 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  es values */.  i
18d0: 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20  nt orconf       
18e0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69     /* The confli
18f0: 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 28 4f 45  ct algorithm (OE
1900: 5f 41 62 6f 72 74 2c 20 4f 45 5f 52 65 70 6c 61  _Abort, OE_Repla
1910: 63 65 2c 20 65 74 63 2e 29 20 2a 2f 0a 29 7b 0a  ce, etc.) */.){.
1920: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
1930: 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 73 71  TriggerStep = sq
1940: 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f  liteMalloc(sizeo
1950: 66 28 54 72 69 67 67 65 72 53 74 65 70 29 29 3b  f(TriggerStep));
1960: 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53  .  if( pTriggerS
1970: 74 65 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tep==0 ) return 
1980: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 70 45 4c  0;..  assert(pEL
1990: 69 73 74 20 3d 3d 20 30 20 7c 7c 20 70 53 65 6c  ist == 0 || pSel
19a0: 65 63 74 20 3d 3d 20 30 29 3b 0a 20 20 61 73 73  ect == 0);.  ass
19b0: 65 72 74 28 70 45 4c 69 73 74 20 21 3d 20 30 20  ert(pEList != 0 
19c0: 7c 7c 20 70 53 65 6c 65 63 74 20 21 3d 20 30 29  || pSelect != 0)
19d0: 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  ;..  pTriggerSte
19e0: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 53 45 52  p->op = TK_INSER
19f0: 54 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  T;.  pTriggerSte
1a00: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65  p->pSelect = pSe
1a10: 6c 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65 72  lect;.  pTrigger
1a20: 53 74 65 70 2d 3e 74 61 72 67 65 74 20 20 3d 20  Step->target  = 
1a30: 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 70  *pTableName;.  p
1a40: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64  TriggerStep->pId
1a50: 4c 69 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a  List = pColumn;.
1a60: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
1a70: 70 45 78 70 72 4c 69 73 74 20 3d 20 70 45 4c 69  pExprList = pELi
1a80: 73 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  st;.  pTriggerSt
1a90: 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63  ep->orconf = orc
1aa0: 6f 6e 66 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  onf;..  return p
1ab0: 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a  TriggerStep;.}..
1ac0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
1ad0: 61 20 74 72 69 67 67 65 72 20 73 74 65 70 20 74  a trigger step t
1ae0: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  hat implements a
1af0: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
1b00: 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  nt and return.**
1b10: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1b20: 61 74 20 74 72 69 67 67 65 72 20 73 74 65 70 2e  at trigger step.
1b30: 20 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c    The parser cal
1b40: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
1b50: 77 68 65 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20  when it.** sees 
1b60: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
1b70: 65 6e 74 20 69 6e 73 69 64 65 20 74 68 65 20 62  ent inside the b
1b80: 6f 64 79 20 6f 66 20 61 20 43 52 45 41 54 45 20  ody of a CREATE 
1b90: 54 52 49 47 47 45 52 2e 0a 2a 2f 0a 54 72 69 67  TRIGGER..*/.Trig
1ba0: 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 54  gerStep *sqliteT
1bb0: 72 69 67 67 65 72 55 70 64 61 74 65 53 74 65 70  riggerUpdateStep
1bc0: 28 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  (.  Token *pTabl
1bd0: 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  eName,   /* Name
1be0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
1bf0: 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20   be updated */. 
1c00: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1c10: 74 2c 20 20 20 20 2f 2a 20 54 68 65 20 53 45 54  t,    /* The SET
1c20: 20 63 6c 61 75 73 65 3a 20 6c 69 73 74 20 6f 66   clause: list of
1c30: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 6e 65 77 20   column and new 
1c40: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 45 78 70 72  values */.  Expr
1c50: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
1c60: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1c70: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  ause */.  int or
1c80: 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f  conf           /
1c90: 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61  * The conflict a
1ca0: 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62  lgorithm. (OE_Ab
1cb0: 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
1cc0: 65 74 63 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69  etc) */.){.  Tri
1cd0: 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67  ggerStep *pTrigg
1ce0: 65 72 53 74 65 70 20 3d 20 73 71 6c 69 74 65 4d  erStep = sqliteM
1cf0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69  alloc(sizeof(Tri
1d00: 67 67 65 72 53 74 65 70 29 29 3b 0a 20 20 69 66  ggerStep));.  if
1d10: 28 20 70 54 72 69 67 67 65 72 53 74 65 70 3d 3d  ( pTriggerStep==
1d20: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
1d30: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f   pTriggerStep->o
1d40: 70 20 3d 20 54 4b 5f 55 50 44 41 54 45 3b 0a 20  p = TK_UPDATE;. 
1d50: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 74   pTriggerStep->t
1d60: 61 72 67 65 74 20 20 3d 20 2a 70 54 61 62 6c 65  arget  = *pTable
1d70: 4e 61 6d 65 3b 0a 20 20 70 54 72 69 67 67 65 72  Name;.  pTrigger
1d80: 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 20  Step->pExprList 
1d90: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 54 72 69  = pEList;.  pTri
1da0: 67 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65  ggerStep->pWhere
1db0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 54 72   = pWhere;.  pTr
1dc0: 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e  iggerStep->orcon
1dd0: 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 0a 20 20 72  f = orconf;..  r
1de0: 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74  eturn pTriggerSt
1df0: 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  ep;.}../*.** Con
1e00: 73 74 72 75 63 74 20 61 20 74 72 69 67 67 65 72  struct a trigger
1e10: 20 73 74 65 70 20 74 68 61 74 20 69 6d 70 6c 65   step that imple
1e20: 6d 65 6e 74 73 20 61 20 44 45 4c 45 54 45 20 73  ments a DELETE s
1e30: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74  tatement and ret
1e40: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
1e50: 20 74 6f 20 74 68 61 74 20 74 72 69 67 67 65 72   to that trigger
1e60: 20 73 74 65 70 2e 20 20 54 68 65 20 70 61 72 73   step.  The pars
1e70: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
1e80: 75 74 69 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a  utine when it.**
1e90: 20 73 65 65 73 20 61 20 44 45 4c 45 54 45 20 73   sees a DELETE s
1ea0: 74 61 74 65 6d 65 6e 74 20 69 6e 73 69 64 65 20  tatement inside 
1eb0: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 43 52  the body of a CR
1ec0: 45 41 54 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f  EATE TRIGGER..*/
1ed0: 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71  .TriggerStep *sq
1ee0: 6c 69 74 65 54 72 69 67 67 65 72 44 65 6c 65 74  liteTriggerDelet
1ef0: 65 53 74 65 70 28 54 6f 6b 65 6e 20 2a 70 54 61  eStep(Token *pTa
1f00: 62 6c 65 4e 61 6d 65 2c 20 45 78 70 72 20 2a 70  bleName, Expr *p
1f10: 57 68 65 72 65 29 7b 0a 20 20 54 72 69 67 67 65  Where){.  Trigge
1f20: 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53  rStep *pTriggerS
1f30: 74 65 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tep = sqliteMall
1f40: 6f 63 28 73 69 7a 65 6f 66 28 54 72 69 67 67 65  oc(sizeof(Trigge
1f50: 72 53 74 65 70 29 29 3b 0a 20 20 69 66 28 20 70  rStep));.  if( p
1f60: 54 72 69 67 67 65 72 53 74 65 70 3d 3d 30 20 29  TriggerStep==0 )
1f70: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 70 54   return 0;..  pT
1f80: 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d  riggerStep->op =
1f90: 20 54 4b 5f 44 45 4c 45 54 45 3b 0a 20 20 70 54   TK_DELETE;.  pT
1fa0: 72 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67  riggerStep->targ
1fb0: 65 74 20 20 3d 20 2a 70 54 61 62 6c 65 4e 61 6d  et  = *pTableNam
1fc0: 65 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  e;.  pTriggerSte
1fd0: 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
1fe0: 72 65 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  re;.  pTriggerSt
1ff0: 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f  ep->orconf = OE_
2000: 44 65 66 61 75 6c 74 3b 0a 0a 20 20 72 65 74 75  Default;..  retu
2010: 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b  rn pTriggerStep;
2020: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 63 75 72  .}../* .** Recur
2030: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 20  sively delete a 
2040: 54 72 69 67 67 65 72 20 73 74 72 75 63 74 75 72  Trigger structur
2050: 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  e.*/.void sqlite
2060: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 54 72  DeleteTrigger(Tr
2070: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 29  igger *pTrigger)
2080: 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20  {.  TriggerStep 
2090: 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 0a  *pTriggerStep;..
20a0: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d    pTriggerStep =
20b0: 20 70 54 72 69 67 67 65 72 2d 3e 73 74 65 70 5f   pTrigger->step_
20c0: 6c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  list;.  while( p
20d0: 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20  TriggerStep ){. 
20e0: 20 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a     TriggerStep *
20f0: 20 70 54 6d 70 20 3d 20 70 54 72 69 67 67 65 72   pTmp = pTrigger
2100: 53 74 65 70 3b 0a 20 20 20 20 70 54 72 69 67 67  Step;.    pTrigg
2110: 65 72 53 74 65 70 20 3d 20 70 54 72 69 67 67 65  erStep = pTrigge
2120: 72 53 74 65 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  rStep->pNext;.. 
2130: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
2140: 65 74 65 28 70 54 6d 70 2d 3e 70 57 68 65 72 65  ete(pTmp->pWhere
2150: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  );.    sqliteExp
2160: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6d 70  rListDelete(pTmp
2170: 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b 0a 20 20  ->pExprList);.  
2180: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
2190: 6c 65 74 65 28 70 54 6d 70 2d 3e 70 53 65 6c 65  lete(pTmp->pSele
21a0: 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49  ct);.    sqliteI
21b0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6d 70  dListDelete(pTmp
21c0: 2d 3e 70 49 64 4c 69 73 74 29 3b 0a 0a 20 20 20  ->pIdList);..   
21d0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 6d 70   sqliteFree(pTmp
21e0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
21f0: 46 72 65 65 28 70 54 72 69 67 67 65 72 2d 3e 6e  Free(pTrigger->n
2200: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
2210: 65 65 28 70 54 72 69 67 67 65 72 2d 3e 74 61 62  ee(pTrigger->tab
2220: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  le);.  sqliteExp
2230: 72 44 65 6c 65 74 65 28 70 54 72 69 67 67 65 72  rDelete(pTrigger
2240: 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 73 71 6c 69  ->pWhen);.  sqli
2250: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
2260: 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e  Trigger->pColumn
2270: 73 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  s);.  sqliteFree
2280: 28 70 54 72 69 67 67 65 72 2d 3e 73 74 72 69 6e  (pTrigger->strin
2290: 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  gs);.  sqliteFre
22a0: 65 28 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a  e(pTrigger);.}..
22b0: 2f 2a 0a 20 2a 20 54 68 69 73 20 66 75 6e 63 74  /*. * This funct
22c0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
22d0: 20 64 72 6f 70 20 61 20 74 72 69 67 67 65 72 20   drop a trigger 
22e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
22f0: 65 20 73 63 68 65 6d 61 2e 20 0a 20 2a 0a 20 2a  e schema. . *. *
2300: 20 54 68 69 73 20 6d 61 79 20 62 65 20 63 61 6c   This may be cal
2310: 6c 65 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f  led directly fro
2320: 6d 20 74 68 65 20 70 61 72 73 65 72 2c 20 6f 72  m the parser, or
2330: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 0a 20 2a   from within . *
2340: 20 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c 65   sqliteDropTable
2350: 28 29 2e 20 49 6e 20 74 68 65 20 6c 61 74 74 65  (). In the latte
2360: 72 20 63 61 73 65 20 74 68 65 20 22 6e 65 73 74  r case the "nest
2370: 65 64 22 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ed" argument is 
2380: 74 72 75 65 2e 0a 20 2a 0a 20 2a 20 4e 6f 74 65  true.. *. * Note
2390: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
23a0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 64 65 6c  ion does not del
23b0: 65 74 65 20 74 68 65 20 74 72 69 67 67 65 72 20  ete the trigger 
23c0: 65 6e 74 69 72 65 6c 79 2e 20 49 6e 73 74 65 61  entirely. Instea
23d0: 64 20 69 74 0a 20 2a 20 72 65 6d 6f 76 65 73 20  d it. * removes 
23e0: 69 74 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  it from the inte
23f0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
2400: 70 6c 61 63 65 73 20 69 74 20 69 6e 20 74 68 65  places it in the
2410: 20 74 72 69 67 44 72 6f 70 20 68 61 73 68 20 0a   trigDrop hash .
2420: 20 2a 20 74 61 62 6c 65 2e 20 54 68 69 73 20 69   * table. This i
2430: 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 74 72  s so that the tr
2440: 69 67 67 65 72 20 63 61 6e 20 62 65 20 72 65 73  igger can be res
2450: 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64  tored into the d
2460: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 0a 20  atabase schema. 
2470: 2a 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  * if the transac
2480: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
2490: 61 63 6b 2e 0a 20 2a 2f 0a 76 6f 69 64 20 73 71  ack.. */.void sq
24a0: 6c 69 74 65 44 72 6f 70 54 72 69 67 67 65 72 28  liteDropTrigger(
24b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
24c0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  oken *pName, int
24d0: 20 6e 65 73 74 65 64 29 0a 7b 0a 20 20 63 68 61   nested).{.  cha
24e0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 72 69 67  r *zName;.  Trig
24f0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
2500: 20 54 61 62 6c 65 20 20 20 2a 70 54 61 62 6c 65   Table   *pTable
2510: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  ;..  zName = sql
2520: 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65  iteStrNDup(pName
2530: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
2540: 0a 20 20 2f 2a 20 65 6e 73 75 72 65 20 74 68 61  .  /* ensure tha
2550: 74 20 74 68 65 20 74 72 69 67 67 65 72 20 62 65  t the trigger be
2560: 69 6e 67 20 64 72 6f 70 70 65 64 20 65 78 69 73  ing dropped exis
2570: 74 73 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72  ts */.  pTrigger
2580: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e   = sqliteHashFin
2590: 64 28 26 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  d(&(pParse->db->
25a0: 74 72 69 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65  trigHash), zName
25b0: 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 31 29 3b  , pName->n + 1);
25c0: 20 0a 20 20 69 66 28 20 21 70 54 72 69 67 67 65   .  if( !pTrigge
25d0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  r ){.    sqliteS
25e0: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
25f0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
2600: 73 75 63 68 20 74 72 69 67 67 65 72 3a 20 22 2c  such trigger: ",
2610: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 7a 4e 61   -1,.        zNa
2620: 6d 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  me, -1, 0);.    
2630: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
2640: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2650: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 20 2a 20 49 66   }..  /*.   * If
2660: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20   this is not an 
2670: 22 65 78 70 6c 61 69 6e 22 2c 20 64 6f 20 74 68  "explain", do th
2680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
2690: 2a 20 31 2e 20 52 65 6d 6f 76 65 20 74 68 65 20  * 1. Remove the 
26a0: 74 72 69 67 67 65 72 20 66 72 6f 6d 20 69 74 73  trigger from its
26b0: 20 61 73 73 6f 63 69 61 74 65 64 20 74 61 62 6c   associated tabl
26c0: 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 2a  e structure.   *
26d0: 20 32 2e 20 4d 6f 76 65 20 74 68 65 20 74 72 69   2. Move the tri
26e0: 67 67 65 72 20 66 72 6f 6d 20 74 68 65 20 74 72  gger from the tr
26f0: 69 67 48 61 73 68 20 68 61 73 68 20 74 6f 20 74  igHash hash to t
2700: 72 69 67 44 72 6f 70 0a 20 20 20 2a 2f 0a 20 20  rigDrop.   */.  
2710: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
2720: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 31  lain ){.    /* 1
2730: 20 2a 2f 0a 20 20 20 20 70 54 61 62 6c 65 20 3d   */.    pTable =
2740: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
2750: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 72  (pParse->db, pTr
2760: 69 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20  igger->table);. 
2770: 20 20 20 61 73 73 65 72 74 28 70 54 61 62 6c 65     assert(pTable
2780: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
2790: 65 2d 3e 70 54 72 69 67 67 65 72 20 3d 3d 20 70  e->pTrigger == p
27a0: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20  Trigger ){.     
27b0: 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65   pTable->pTrigge
27c0: 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
27d0: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
27e0: 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 63        Trigger *c
27f0: 63 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69  c = pTable->pTri
2800: 67 67 65 72 3b 0a 20 20 20 20 20 20 77 68 69 6c  gger;.      whil
2810: 65 28 20 63 63 20 29 7b 20 0a 20 20 20 20 20 20  e( cc ){ .      
2820: 20 20 69 66 28 20 63 63 2d 3e 70 4e 65 78 74 20    if( cc->pNext 
2830: 3d 3d 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  == pTrigger ){. 
2840: 20 20 20 20 20 20 20 20 20 63 63 2d 3e 70 4e 65           cc->pNe
2850: 78 74 20 3d 20 63 63 2d 3e 70 4e 65 78 74 2d 3e  xt = cc->pNext->
2860: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
2870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2880: 7d 0a 20 20 20 20 20 20 20 20 63 63 20 3d 20 63  }.        cc = c
2890: 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  c->pNext;.      
28a0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 63  }.      assert(c
28b0: 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c);.    }..    /
28c0: 2a 20 32 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  * 2 */.    sqlit
28d0: 65 48 61 73 68 49 6e 73 65 72 74 28 26 28 70 50  eHashInsert(&(pP
28e0: 61 72 73 65 2d 3e 64 62 2d 3e 74 72 69 67 48 61  arse->db->trigHa
28f0: 73 68 29 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20  sh), zName, .   
2900: 20 20 20 20 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20       pName->n + 
2910: 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 71  1, NULL);.    sq
2920: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
2930: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 74 72 69  (pParse->db->tri
2940: 67 44 72 6f 70 29 2c 20 70 54 72 69 67 67 65 72  gDrop), pTrigger
2950: 2d 3e 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  ->name, .       
2960: 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 31 2c 20 70   pName->n + 1, p
2970: 54 72 69 67 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  Trigger);.  }.. 
2980: 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 69 73 20   /* Unless this 
2990: 69 73 20 61 20 74 72 69 67 67 65 72 20 6f 6e 20  is a trigger on 
29a0: 61 20 54 45 4d 50 20 54 41 42 4c 45 2c 20 67 65  a TEMP TABLE, ge
29b0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
29c0: 65 73 74 72 6f 79 20 74 68 65 0a 20 20 20 2a 20  estroy the.   * 
29d0: 64 61 74 61 62 61 73 65 20 72 65 63 6f 72 64 20  database record 
29e0: 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20 2a  of the trigger *
29f0: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 2d  /.  if( !pTable-
2a00: 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 69  >isTemp ){.    i
2a10: 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 73 74 61  nt base;.    sta
2a20: 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 54  tic VdbeOp dropT
2a30: 72 69 67 67 65 72 5b 5d 20 3d 20 7b 0a 20 20 20  rigger[] = {.   
2a40: 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74     { OP_OpenWrit
2a50: 65 2c 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20  e,  0, 2,       
2a60: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20   MASTER_NAME},. 
2a70: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
2a80: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29  ,     0, ADDR(9)
2a90: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
2aa0: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c  P_String,     0,
2ab0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
2ac0: 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 2 */.      { O
2ad0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c  P_MemStore,   1,
2ae0: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   1,        0},. 
2af0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
2b00: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
2b10: 20 20 20 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20     0}, /* 4 */. 
2b20: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
2b30: 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20  ,     0, 1,     
2b40: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
2b50: 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c  P_Ne,         0,
2b60: 20 41 44 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20   ADDR(8),  0},. 
2b70: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
2b80: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
2b90: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
2ba0: 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c  P_Next,       0,
2bb0: 20 41 44 44 52 28 34 29 2c 20 20 30 7d 2c 20 2f   ADDR(4),  0}, /
2bc0: 2a 20 38 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 8 */.      { O
2bd0: 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 30 2c  P_Integer,    0,
2be0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
2bf0: 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 9 */.      { O
2c00: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 30 2c  P_SetCookie,  0,
2c10: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
2c20: 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c       { OP_Close,
2c30: 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20        0, 0,     
2c40: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 0a 20     0},.    };.. 
2c50: 20 20 20 69 66 28 20 21 6e 65 73 74 65 64 20 29     if( !nested )
2c60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 65  {.      sqliteBe
2c70: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
2c80: 6e 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  n(pParse, 0);.  
2c90: 20 20 7d 0a 20 20 20 20 62 61 73 65 20 3d 20 73    }.    base = s
2ca0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
2cb0: 73 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  st(pParse->pVdbe
2cc0: 2c 20 0a 20 20 20 20 20 20 20 20 41 72 72 61 79  , .        Array
2cd0: 53 69 7a 65 28 64 72 6f 70 54 72 69 67 67 65 72  Size(dropTrigger
2ce0: 29 2c 20 64 72 6f 70 54 72 69 67 67 65 72 29 3b  ), dropTrigger);
2cf0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
2d00: 68 61 6e 67 65 50 33 28 70 50 61 72 73 65 2d 3e  hangeP3(pParse->
2d10: 70 56 64 62 65 2c 20 62 61 73 65 2b 32 2c 20 7a  pVdbe, base+2, z
2d20: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Name, 0);.    if
2d30: 28 20 21 6e 65 73 74 65 64 20 29 7b 0a 20 20 20  ( !nested ){.   
2d40: 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43     sqliteChangeC
2d50: 6f 6f 6b 69 65 28 70 50 61 72 73 65 2d 3e 64 62  ookie(pParse->db
2d60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2d70: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 31 28  iteVdbeChangeP1(
2d80: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 62  pParse->pVdbe, b
2d90: 61 73 65 2b 39 2c 20 70 50 61 72 73 65 2d 3e 64  ase+9, pParse->d
2da0: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 29 3b  b->next_cookie);
2db0: 0a 20 20 20 20 69 66 28 20 21 6e 65 73 74 65 64  .    if( !nested
2dc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2dd0: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
2de0: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  n(pParse);.    }
2df0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 46 72  .  }..  sqliteFr
2e00: 65 65 28 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  ee(zName);.}../*
2e10: 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 74 68  .** pEList is th
2e20: 65 20 53 45 54 20 63 6c 61 75 73 65 20 6f 66 20  e SET clause of 
2e30: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
2e40: 65 6e 74 2e 20 20 45 61 63 68 20 65 6e 74 72 79  ent.  Each entry
2e50: 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 69 73  .** in pEList is
2e60: 20 6f 66 20 74 68 65 20 66 6f 72 6d 61 74 20 3c   of the format <
2e70: 69 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49 66 20  id>=<expr>.  If 
2e80: 61 6e 79 20 6f 66 20 74 68 65 20 65 6e 74 72 69  any of the entri
2e90: 65 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20  es.** in pEList 
2ea0: 68 61 76 65 20 61 6e 20 3c 69 64 3e 20 77 68 69  have an <id> whi
2eb0: 63 68 20 6d 61 74 63 68 65 73 20 61 6e 20 69 64  ch matches an id
2ec0: 65 6e 74 69 66 69 65 72 20 69 6e 20 70 49 64 4c  entifier in pIdL
2ed0: 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  ist,.** then ret
2ee0: 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 70 49  urn TRUE.  If pI
2ef0: 64 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65  dList==NULL, the
2f00: 6e 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72  n it is consider
2f10: 65 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61 72 64  ed a.** wildcard
2f20: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 6e   that matches an
2f30: 79 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77 69 73  ything.  Likewis
2f40: 65 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55 4c  e if pEList==NUL
2f50: 4c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d 61 74  L then.** it mat
2f60: 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20 73 6f  ches anything so
2f70: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   always return t
2f80: 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  rue.  Return fal
2f90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  se only.** if th
2fa0: 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2e  ere is no match.
2fb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2fc0: 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 4c 61  heckColumnOverLa
2fd0: 70 28 49 64 4c 69 73 74 20 2a 70 49 64 4c 69 73  p(IdList *pIdLis
2fe0: 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  t, ExprList *pEL
2ff0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 65  ist){.  int i, e
3000: 3b 0a 20 20 69 66 28 20 21 70 49 64 4c 69 73 74  ;.  if( !pIdList
3010: 20 29 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66   )return 1;.  if
3020: 28 20 21 70 45 4c 69 73 74 20 29 72 65 74 75 72  ( !pEList )retur
3030: 6e 20 31 3b 0a 0a 20 20 66 6f 72 28 69 20 3d 20  n 1;..  for(i = 
3040: 30 3b 20 69 20 3c 20 70 49 64 4c 69 73 74 2d 3e  0; i < pIdList->
3050: 6e 49 64 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nId; i++){ .    
3060: 66 6f 72 28 65 20 3d 20 30 3b 20 65 20 3c 20 70  for(e = 0; e < p
3070: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 65 2b  EList->nExpr; e+
3080: 2b 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 21  +){ .      if( !
3090: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 49  sqliteStrICmp(pI
30a0: 64 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  dList->a[i].zNam
30b0: 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 65 5d 2e  e, pEList->a[e].
30c0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
30d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
30e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
30f0: 20 72 65 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f   return 0; .}../
3100: 2a 20 41 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  * A global varia
3110: 62 6c 65 20 74 68 61 74 20 69 73 20 54 52 55 45  ble that is TRUE
3120: 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 61 6c   if we should al
3130: 77 61 79 73 20 73 65 74 20 75 70 20 74 65 6d 70  ways set up temp
3140: 20 74 61 62 6c 65 73 20 66 6f 72 0a 20 2a 20 66   tables for. * f
3150: 6f 72 20 74 72 69 67 67 65 72 73 2c 20 65 76 65  or triggers, eve
3160: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
3170: 6f 20 74 72 69 67 67 65 72 73 20 74 6f 20 63 6f  o triggers to co
3180: 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  de. This is used
3190: 20 74 6f 20 74 65 73 74 20 0a 20 2a 20 68 6f 77   to test . * how
31a0: 20 6d 75 63 68 20 6f 76 65 72 68 65 61 64 20 74   much overhead t
31b0: 68 65 20 74 72 69 67 67 65 72 73 20 61 6c 67 6f  he triggers algo
31c0: 72 69 74 68 6d 20 69 73 20 63 61 75 73 69 6e 67  rithm is causing
31d0: 2e 0a 20 2a 0a 20 2a 20 54 68 69 73 20 66 6c 61  .. *. * This fla
31e0: 67 20 63 61 6e 20 62 65 20 73 65 74 20 6f 72 20  g can be set or 
31f0: 63 6c 65 61 72 65 64 20 75 73 69 6e 67 20 74 68  cleared using th
3200: 65 20 22 74 72 69 67 67 65 72 5f 6f 76 65 72 68  e "trigger_overh
3210: 65 61 64 5f 74 65 73 74 22 20 70 72 61 67 6d 61  ead_test" pragma
3220: 2e 0a 20 2a 20 54 68 65 20 70 72 61 67 6d 61 20  .. * The pragma 
3230: 69 73 20 6e 6f 74 20 64 6f 63 75 6d 65 6e 74 65  is not documente
3240: 64 20 73 69 6e 63 65 20 69 74 20 69 73 20 6e 6f  d since it is no
3250: 74 20 72 65 61 6c 6c 79 20 70 61 72 74 20 6f 66  t really part of
3260: 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 0a 20   the interface. 
3270: 2a 20 74 6f 20 53 51 4c 69 74 65 2c 20 6a 75 73  * to SQLite, jus
3280: 74 20 74 68 65 20 74 65 73 74 20 70 72 6f 63 65  t the test proce
3290: 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 61 6c 77  dure..*/.int alw
32a0: 61 79 73 5f 63 6f 64 65 5f 74 72 69 67 67 65 72  ays_code_trigger
32b0: 5f 73 65 74 75 70 20 3d 20 30 3b 0a 0a 2f 2a 0a  _setup = 0;../*.
32c0: 20 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65 20   * Returns true 
32d0: 69 66 20 61 20 74 72 69 67 67 65 72 20 6d 61 74  if a trigger mat
32e0: 63 68 69 6e 67 20 6f 70 2c 20 74 72 5f 74 6d 20  ching op, tr_tm 
32f0: 61 6e 64 20 66 6f 72 65 61 63 68 20 74 68 61 74  and foreach that
3300: 20 69 73 20 4e 4f 54 20 61 6c 72 65 61 64 79 0a   is NOT already.
3310: 20 2a 20 6f 6e 20 74 68 65 20 50 61 72 73 65 20   * on the Parse 
3320: 6f 62 6a 65 63 74 73 20 74 72 69 67 67 65 72 2d  objects trigger-
3330: 73 74 61 63 6b 20 28 74 6f 20 70 72 65 76 65 6e  stack (to preven
3340: 74 20 72 65 63 75 72 73 69 76 65 20 74 72 69 67  t recursive trig
3350: 67 65 72 20 66 69 72 69 6e 67 29 20 69 73 0a 20  ger firing) is. 
3360: 2a 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 6c  * found in the l
3370: 69 73 74 20 73 70 65 63 69 66 69 65 64 20 61 73  ist specified as
3380: 20 70 54 72 69 67 67 65 72 2e 0a 20 2a 2f 0a 69   pTrigger.. */.i
3390: 6e 74 20 73 71 6c 69 74 65 54 72 69 67 67 65 72  nt sqliteTrigger
33a0: 73 45 78 69 73 74 28 0a 20 20 50 61 72 73 65 20  sExist(.  Parse 
33b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
33c0: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68 65    /* Used to che
33d0: 63 6b 20 66 6f 72 20 72 65 63 75 72 73 69 76 65  ck for recursive
33e0: 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 54   triggers */.  T
33f0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
3400: 2c 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74  ,      /* A list
3410: 20 6f 66 20 74 72 69 67 67 65 72 73 20 61 73 73   of triggers ass
3420: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 74  ociated with a t
3430: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  able */.  int op
3440: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3450: 20 20 2f 2a 20 6f 6e 65 20 6f 66 20 54 4b 5f 44    /* one of TK_D
3460: 45 4c 45 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54  ELETE, TK_INSERT
3470: 2c 20 54 4b 5f 55 50 44 41 54 45 20 2a 2f 0a 20  , TK_UPDATE */. 
3480: 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20 20   int tr_tm,     
3490: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 65 20           /* one 
34a0: 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b  of TK_BEFORE, TK
34b0: 5f 41 46 54 45 52 20 2a 2f 0a 20 20 69 6e 74 20  _AFTER */.  int 
34c0: 66 6f 72 65 61 63 68 2c 20 20 20 20 20 20 20 20  foreach,        
34d0: 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66 20 54 4b      /* one of TK
34e0: 5f 52 4f 57 20 6f 72 20 54 4b 5f 53 54 41 54 45  _ROW or TK_STATE
34f0: 4d 45 4e 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69  MENT */.  ExprLi
3500: 73 74 20 2a 70 43 68 61 6e 67 65 73 20 20 20 20  st *pChanges    
3510: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74 68 61    /* Columns tha
3520: 74 20 63 68 61 6e 67 65 20 69 6e 20 61 6e 20 55  t change in an U
3530: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
3540: 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 20  */.){.  Trigger 
3550: 2a 20 70 54 72 69 67 67 65 72 43 75 72 73 6f 72  * pTriggerCursor
3560: 3b 0a 0a 20 20 69 66 28 20 61 6c 77 61 79 73 5f  ;..  if( always_
3570: 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74  code_trigger_set
3580: 75 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  up ){.    return
3590: 20 31 3b 0a 20 20 7d 0a 0a 20 20 70 54 72 69 67   1;.  }..  pTrig
35a0: 67 65 72 43 75 72 73 6f 72 20 3d 20 70 54 72 69  gerCursor = pTri
35b0: 67 67 65 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  gger;.  while( p
35c0: 54 72 69 67 67 65 72 43 75 72 73 6f 72 20 29 7b  TriggerCursor ){
35d0: 0a 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65  .    if( pTrigge
35e0: 72 43 75 72 73 6f 72 2d 3e 6f 70 20 3d 3d 20 6f  rCursor->op == o
35f0: 70 20 26 26 20 0a 09 70 54 72 69 67 67 65 72 43  p && ..pTriggerC
3600: 75 72 73 6f 72 2d 3e 74 72 5f 74 6d 20 3d 3d 20  ursor->tr_tm == 
3610: 74 72 5f 74 6d 20 26 26 20 0a 09 70 54 72 69 67  tr_tm && ..pTrig
3620: 67 65 72 43 75 72 73 6f 72 2d 3e 66 6f 72 65 61  gerCursor->forea
3630: 63 68 20 3d 3d 20 66 6f 72 65 61 63 68 20 26 26  ch == foreach &&
3640: 0a 09 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65  ..checkColumnOve
3650: 72 4c 61 70 28 70 54 72 69 67 67 65 72 43 75 72  rLap(pTriggerCur
3660: 73 6f 72 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70  sor->pColumns, p
3670: 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20 20  Changes) ){.    
3680: 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a    TriggerStack *
3690: 20 73 73 3b 0a 20 20 20 20 20 20 73 73 20 3d 20   ss;.      ss = 
36a0: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
36b0: 6b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  k;.      while( 
36c0: 73 73 20 26 26 20 73 73 2d 3e 70 54 72 69 67 67  ss && ss->pTrigg
36d0: 65 72 20 21 3d 20 70 54 72 69 67 67 65 72 20 29  er != pTrigger )
36e0: 7b 0a 09 73 73 20 3d 20 73 73 2d 3e 70 4e 65 78  {..ss = ss->pNex
36f0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
3700: 20 69 66 28 20 21 73 73 20 29 72 65 74 75 72 6e   if( !ss )return
3710: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54   1;.    }.    pT
3720: 72 69 67 67 65 72 43 75 72 73 6f 72 20 3d 20 70  riggerCursor = p
3730: 54 72 69 67 67 65 72 43 75 72 73 6f 72 2d 3e 70  TriggerCursor->p
3740: 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
3750: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
3760: 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
3770: 64 65 20 66 6f 72 20 7a 65 72 6f 20 6f 72 20 6d  de for zero or m
3780: 6f 72 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ore statements i
3790: 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f  nside the body o
37a0: 66 20 61 0a 2a 2a 20 74 72 69 67 67 65 72 2e 20  f a.** trigger. 
37b0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
37c0: 63 6f 64 65 54 72 69 67 67 65 72 50 72 6f 67 72  codeTriggerProgr
37d0: 61 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  am(.  Parse *pPa
37e0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
37f0: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
3800: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67  ntext */.  Trigg
3810: 65 72 53 74 65 70 20 2a 70 53 74 65 70 4c 69 73  erStep *pStepLis
3820: 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  t,   /* List of 
3830: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
3840: 65 20 74 68 65 20 74 72 69 67 67 65 72 20 62 6f  e the trigger bo
3850: 64 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f  dy */.  int orco
3860: 6e 66 69 6e 20 20 20 20 20 20 20 20 20 20 20 20  nfin            
3870: 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 61 6c    /* Conflict al
3880: 67 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62 6f  gorithm. (OE_Abo
3890: 72 74 2c 20 65 74 63 29 20 2a 2f 20 20 0a 29 7b  rt, etc) */  .){
38a0: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
38b0: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20   pTriggerStep = 
38c0: 70 53 74 65 70 4c 69 73 74 3b 0a 20 20 69 6e 74  pStepList;.  int
38d0: 20 6f 72 63 6f 6e 66 3b 0a 0a 20 20 77 68 69 6c   orconf;..  whil
38e0: 65 28 20 70 54 72 69 67 67 65 72 53 74 65 70 20  e( pTriggerStep 
38f0: 29 7b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 4e  ){.    int saveN
3900: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
3910: 61 62 3b 0a 20 20 20 20 6f 72 63 6f 6e 66 20 3d  ab;.    orconf =
3920: 20 28 6f 72 63 6f 6e 66 69 6e 20 3d 3d 20 4f 45   (orconfin == OE
3930: 5f 44 65 66 61 75 6c 74 29 3f 70 54 72 69 67 67  _Default)?pTrigg
3940: 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 3a 6f  erStep->orconf:o
3950: 72 63 6f 6e 66 69 6e 3b 0a 20 20 20 20 70 50 61  rconfin;.    pPa
3960: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e  rse->trigStack->
3970: 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b  orconf = orconf;
3980: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 54 72  .    switch( pTr
3990: 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 29 7b  iggerStep->op ){
39a0: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 53  .      case TK_S
39b0: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 20  ELECT: {.       
39c0: 20 69 6e 74 20 74 6d 70 5f 74 62 6c 20 3d 20 70   int tmp_tbl = p
39d0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 09  Parse->nTab++;..
39e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
39f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
3a00: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 6d 70 5f  P_OpenTemp, tmp_
3a10: 74 62 6c 2c 20 30 29 3b 0a 09 73 71 6c 69 74 65  tbl, 0);..sqlite
3a20: 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65  VdbeAddOp(pParse
3a30: 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4b 65 79 41  ->pVdbe, OP_KeyA
3a40: 73 44 61 74 61 2c 20 74 6d 70 5f 74 62 6c 2c 20  sData, tmp_tbl, 
3a50: 31 29 3b 0a 09 73 71 6c 69 74 65 53 65 6c 65 63  1);..sqliteSelec
3a60: 74 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  t(pParse, pTrigg
3a70: 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 2c  erStep->pSelect,
3a80: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 0a 09 20 20   SRT_Union, ..  
3a90: 20 20 74 6d 70 5f 74 62 6c 2c 20 30 2c 20 30 2c    tmp_tbl, 0, 0,
3aa0: 20 30 29 3b 0a 09 73 71 6c 69 74 65 56 64 62 65   0);..sqliteVdbe
3ab0: 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56  AddOp(pParse->pV
3ac0: 64 62 65 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  dbe, OP_Close, t
3ad0: 6d 70 5f 74 62 6c 2c 20 30 29 3b 0a 09 70 50 61  mp_tbl, 0);..pPa
3ae0: 72 73 65 2d 3e 6e 54 61 62 2d 2d 3b 0a 09 62 72  rse->nTab--;..br
3af0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3b00: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 44 41 54     case TK_UPDAT
3b10: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
3b20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 70 50 61  iteVdbeAddOp(pPa
3b30: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 50  rse->pVdbe, OP_P
3b40: 75 73 68 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a  ushList, 0, 0);.
3b50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 55 70          sqliteUp
3b60: 64 61 74 65 28 70 50 61 72 73 65 2c 20 26 70 54  date(pParse, &pT
3b70: 72 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67  riggerStep->targ
3b80: 65 74 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c  et, .        sql
3b90: 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70  iteExprListDup(p
3ba0: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 45 78  TriggerStep->pEx
3bb0: 70 72 4c 69 73 74 29 2c 20 0a 20 20 20 20 20 20  prList), .      
3bc0: 20 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28    sqliteExprDup(
3bd0: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57  pTriggerStep->pW
3be0: 68 65 72 65 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a  here), orconf);.
3bf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
3c00: 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e  beAddOp(pParse->
3c10: 70 56 64 62 65 2c 20 4f 50 5f 50 6f 70 4c 69 73  pVdbe, OP_PopLis
3c20: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
3c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3c40: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49  .      case TK_I
3c50: 4e 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 20  NSERT: {.       
3c60: 20 73 71 6c 69 74 65 49 6e 73 65 72 74 28 70 50   sqliteInsert(pP
3c70: 61 72 73 65 2c 20 26 70 54 72 69 67 67 65 72 53  arse, &pTriggerS
3c80: 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 0a 20 20  tep->target, .  
3c90: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
3ca0: 4c 69 73 74 44 75 70 28 70 54 72 69 67 67 65 72  ListDup(pTrigger
3cb0: 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 29  Step->pExprList)
3cc0: 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  , .        sqlit
3cd0: 65 53 65 6c 65 63 74 44 75 70 28 70 54 72 69 67  eSelectDup(pTrig
3ce0: 67 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74  gerStep->pSelect
3cf0: 29 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ), .        sqli
3d00: 74 65 49 64 4c 69 73 74 44 75 70 28 70 54 72 69  teIdListDup(pTri
3d10: 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c 69 73  ggerStep->pIdLis
3d20: 74 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 20  t), orconf);.   
3d30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3d40: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54    }.      case T
3d50: 4b 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20  K_DELETE: {.    
3d60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3d70: 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62  dOp(pParse->pVdb
3d80: 65 2c 20 4f 50 5f 50 75 73 68 4c 69 73 74 2c 20  e, OP_PushList, 
3d90: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
3da0: 71 6c 69 74 65 44 65 6c 65 74 65 46 72 6f 6d 28  qliteDeleteFrom(
3db0: 70 50 61 72 73 65 2c 20 26 70 54 72 69 67 67 65  pParse, &pTrigge
3dc0: 72 53 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 0a  rStep->target, .
3dd0: 09 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44  .    sqliteExprD
3de0: 75 70 28 70 54 72 69 67 67 65 72 53 74 65 70 2d  up(pTriggerStep-
3df0: 3e 70 57 68 65 72 65 29 29 3b 0a 20 20 20 20 20  >pWhere));.     
3e00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3e10: 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  Op(pParse->pVdbe
3e20: 2c 20 4f 50 5f 50 6f 70 4c 69 73 74 2c 20 30 2c  , OP_PopList, 0,
3e30: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
3e40: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3e50: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
3e60: 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
3e70: 20 20 7d 20 0a 20 20 20 20 70 50 61 72 73 65 2d    } .    pParse-
3e80: 3e 6e 54 61 62 20 3d 20 73 61 76 65 4e 54 61 62  >nTab = saveNTab
3e90: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
3ea0: 65 70 20 3d 20 70 54 72 69 67 67 65 72 53 74 65  ep = pTriggerSte
3eb0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20  p->pNext;.  }.. 
3ec0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3ed0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
3ee0: 65 64 20 74 6f 20 63 6f 64 65 20 46 4f 52 20 45  ed to code FOR E
3ef0: 41 43 48 20 52 4f 57 20 74 72 69 67 67 65 72 73  ACH ROW triggers
3f00: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
3f10: 20 63 6f 64 65 20 74 68 61 74 20 74 68 69 73 20   code that this 
3f20: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
3f30: 65 73 20 69 73 20 65 78 65 63 75 74 65 64 2c 20  es is executed, 
3f40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  the following .*
3f50: 2a 20 6d 75 73 74 20 62 65 20 74 72 75 65 3a 0a  * must be true:.
3f60: 2a 2a 0a 2a 2a 20 31 2e 20 4e 6f 20 63 75 72 73  **.** 1. No curs
3f70: 6f 72 73 20 6d 61 79 20 62 65 20 6f 70 65 6e 20  ors may be open 
3f80: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
3f90: 62 61 73 65 2e 20 20 28 42 75 74 20 6e 65 77 49  base.  (But newI
3fa0: 64 78 20 61 6e 64 20 6f 6c 64 49 64 78 0a 2a 2a  dx and oldIdx.**
3fb0: 20 20 20 20 63 61 6e 20 62 65 20 69 6e 64 69 63      can be indic
3fc0: 65 73 20 6f 66 20 63 75 72 73 6f 72 73 20 69 6e  es of cursors in
3fd0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
3fe0: 73 2e 20 20 53 65 65 20 62 65 6c 6f 77 2e 29 0a  s.  See below.).
3ff0: 2a 2a 0a 2a 2a 20 32 2e 20 49 66 20 74 68 65 20  **.** 2. If the 
4000: 74 72 69 67 67 65 72 73 20 62 65 69 6e 67 20 63  triggers being c
4010: 6f 64 65 64 20 61 72 65 20 4f 4e 20 49 4e 53 45  oded are ON INSE
4020: 52 54 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20  RT or ON UPDATE 
4030: 74 72 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a  triggers, then.*
4040: 2a 20 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79  *    a temporary
4050: 20 76 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e   vdbe cursor (in
4060: 64 65 78 20 6e 65 77 49 64 78 29 20 6d 75 73 74  dex newIdx) must
4070: 20 62 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69   be open and poi
4080: 6e 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61  nting at.**    a
4090: 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
40a0: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62  values to be sub
40b0: 73 74 69 74 75 74 65 64 20 66 6f 72 20 6e 65 77  stituted for new
40c0: 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  .* expressions i
40d0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67  n the.**    trig
40e0: 67 65 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a  ger program(s)..
40f0: 2a 2a 0a 2a 2a 20 33 2e 20 49 66 20 74 68 65 20  **.** 3. If the 
4100: 74 72 69 67 67 65 72 73 20 62 65 69 6e 67 20 63  triggers being c
4110: 6f 64 65 64 20 61 72 65 20 4f 4e 20 44 45 4c 45  oded are ON DELE
4120: 54 45 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20  TE or ON UPDATE 
4130: 74 72 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a  triggers, then.*
4140: 2a 20 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79  *    a temporary
4150: 20 76 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e   vdbe cursor (in
4160: 64 65 78 20 6f 6c 64 49 64 78 29 20 6d 75 73 74  dex oldIdx) must
4170: 20 62 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69   be open and poi
4180: 6e 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61  nting at.**    a
4190: 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
41a0: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62  values to be sub
41b0: 73 74 69 74 75 74 65 64 20 66 6f 72 20 6f 6c 64  stituted for old
41c0: 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  .* expressions i
41d0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67  n the.**    trig
41e0: 67 65 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a  ger program(s)..
41f0: 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
4200: 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 0a  CodeRowTrigger(.
4210: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4220: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
4230: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
4240: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
4250: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55    /* One of TK_U
4260: 50 44 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54  PDATE, TK_INSERT
4270: 2c 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20  , TK_DELETE */. 
4280: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
4290: 67 65 73 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73  ges,  /* Changes
42a0: 20 6c 69 73 74 20 66 6f 72 20 61 6e 79 20 55 50   list for any UP
42b0: 44 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 73  DATE OF triggers
42c0: 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c   */.  int tr_tm,
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
42e0: 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c 20  e of TK_BEFORE, 
42f0: 54 4b 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54 61  TK_AFTER */.  Ta
4300: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
4310: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
4320: 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 73  to code triggers
4330: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
4340: 65 77 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  ewIdx,          
4350: 2f 2a 20 54 68 65 20 69 6e 64 69 63 65 20 6f 66  /* The indice of
4360: 20 74 68 65 20 22 6e 65 77 22 20 72 6f 77 20 74   the "new" row t
4370: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e  o access */.  in
4380: 74 20 6f 6c 64 49 64 78 2c 20 20 20 20 20 20 20  t oldIdx,       
4390: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 69 63 65     /* The indice
43a0: 20 6f 66 20 74 68 65 20 22 6f 6c 64 22 20 72 6f   of the "old" ro
43b0: 77 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20  w to access */. 
43c0: 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20 20   int orconf     
43d0: 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46        /* ON CONF
43e0: 4c 49 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 29  LICT policy */.)
43f0: 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 20 70 54  {.  Trigger * pT
4400: 72 69 67 67 65 72 3b 0a 20 20 54 72 69 67 67 65  rigger;.  Trigge
4410: 72 53 74 61 63 6b 20 2a 20 70 54 72 69 67 67 65  rStack * pTrigge
4420: 72 53 74 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72  rStack;..  asser
4430: 74 28 6f 70 20 3d 3d 20 54 4b 5f 55 50 44 41 54  t(op == TK_UPDAT
4440: 45 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 49 4e  E || op == TK_IN
4450: 53 45 52 54 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b  SERT || op == TK
4460: 5f 44 45 4c 45 54 45 29 3b 0a 20 20 61 73 73 65  _DELETE);.  asse
4470: 72 74 28 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 42  rt(tr_tm == TK_B
4480: 45 46 4f 52 45 20 7c 7c 20 74 72 5f 74 6d 20 3d  EFORE || tr_tm =
4490: 3d 20 54 4b 5f 41 46 54 45 52 29 3b 0a 0a 20 20  = TK_AFTER);..  
44a0: 61 73 73 65 72 74 28 6e 65 77 49 64 78 20 21 3d  assert(newIdx !=
44b0: 20 2d 31 20 7c 7c 20 6f 6c 64 49 64 78 20 21 3d   -1 || oldIdx !=
44c0: 20 2d 31 29 3b 0a 0a 20 20 70 54 72 69 67 67 65   -1);..  pTrigge
44d0: 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67  r = pTab->pTrigg
44e0: 65 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72  er;.  while( pTr
44f0: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  igger ){.    int
4500: 20 66 69 72 65 5f 74 68 69 73 20 3d 20 30 3b 0a   fire_this = 0;.
4510: 0a 20 20 20 20 2f 2a 20 64 65 74 65 72 6d 69 6e  .    /* determin
4520: 65 20 77 68 65 74 68 65 72 20 77 65 20 73 68 6f  e whether we sho
4530: 75 6c 64 20 63 6f 64 65 20 74 68 69 73 20 74 72  uld code this tr
4540: 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  igger */.    if(
4550: 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 20 3d 3d   pTrigger->op ==
4560: 20 6f 70 20 26 26 20 70 54 72 69 67 67 65 72 2d   op && pTrigger-
4570: 3e 74 72 5f 74 6d 20 3d 3d 20 74 72 5f 74 6d 20  >tr_tm == tr_tm 
4580: 26 26 20 0a 20 20 20 20 20 20 20 20 70 54 72 69  && .        pTri
4590: 67 67 65 72 2d 3e 66 6f 72 65 61 63 68 20 3d 3d  gger->foreach ==
45a0: 20 54 4b 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20   TK_ROW ){.     
45b0: 20 66 69 72 65 5f 74 68 69 73 20 3d 20 31 3b 0a   fire_this = 1;.
45c0: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74        pTriggerSt
45d0: 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72  ack = pParse->tr
45e0: 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 77  igStack;.      w
45f0: 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 53 74  hile( pTriggerSt
4600: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ack ){.        i
4610: 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  f( pTriggerStack
4620: 2d 3e 70 54 72 69 67 67 65 72 20 3d 3d 20 70 54  ->pTrigger == pT
4630: 72 69 67 67 65 72 20 29 7b 0a 09 20 20 66 69 72  rigger ){..  fir
4640: 65 5f 74 68 69 73 20 3d 20 30 3b 0a 09 7d 0a 20  e_this = 0;..}. 
4650: 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 53         pTriggerS
4660: 74 61 63 6b 20 3d 20 70 54 72 69 67 67 65 72 53  tack = pTriggerS
4670: 74 61 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  tack->pNext;.   
4680: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f     }.      if( o
4690: 70 20 3d 3d 20 54 4b 5f 55 50 44 41 54 45 20 26  p == TK_UPDATE &
46a0: 26 20 70 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c  & pTrigger->pCol
46b0: 75 6d 6e 73 20 26 26 0a 20 20 20 20 20 20 20 20  umns &&.        
46c0: 20 20 21 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76    !checkColumnOv
46d0: 65 72 4c 61 70 28 70 54 72 69 67 67 65 72 2d 3e  erLap(pTrigger->
46e0: 70 43 6f 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67  pColumns, pChang
46f0: 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  es) ){.        f
4700: 69 72 65 5f 74 68 69 73 20 3d 20 30 3b 0a 20 20  ire_this = 0;.  
4710: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
4720: 20 69 66 28 20 66 69 72 65 5f 74 68 69 73 20 26   if( fire_this &
4730: 26 20 28 70 54 72 69 67 67 65 72 53 74 61 63 6b  & (pTriggerStack
4740: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
4750: 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74  sizeof(TriggerSt
4760: 61 63 6b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  ack)))!=0 ){.   
4770: 20 20 20 69 6e 74 20 65 6e 64 54 72 69 67 67 65     int endTrigge
4780: 72 3b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  r;.      IdList 
4790: 64 75 6d 6d 79 54 61 62 6c 69 73 74 3b 0a 20 20  dummyTablist;.  
47a0: 20 20 20 20 45 78 70 72 20 2a 20 77 68 65 6e 45      Expr * whenE
47b0: 78 70 72 3b 0a 0a 20 20 20 20 20 20 64 75 6d 6d  xpr;..      dumm
47c0: 79 54 61 62 6c 69 73 74 2e 6e 49 64 20 3d 20 30  yTablist.nId = 0
47d0: 3b 0a 20 20 20 20 20 20 64 75 6d 6d 79 54 61 62  ;.      dummyTab
47e0: 6c 69 73 74 2e 61 20 3d 20 30 3b 0a 0a 20 20 20  list.a = 0;..   
47f0: 20 20 20 2f 2a 20 50 75 73 68 20 61 6e 20 65 6e     /* Push an en
4800: 74 72 79 20 6f 6e 20 74 6f 20 74 68 65 20 74 72  try on to the tr
4810: 69 67 67 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20  igger stack */. 
4820: 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74 61       pTriggerSta
4830: 63 6b 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70  ck->pTrigger = p
4840: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 70  Trigger;.      p
4850: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
4860: 77 49 64 78 20 3d 20 6e 65 77 49 64 78 3b 0a 20  wIdx = newIdx;. 
4870: 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74 61       pTriggerSta
4880: 63 6b 2d 3e 6f 6c 64 49 64 78 20 3d 20 6f 6c 64  ck->oldIdx = old
4890: 49 64 78 3b 0a 20 20 20 20 20 20 70 54 72 69 67  Idx;.      pTrig
48a0: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 3d  gerStack->pTab =
48b0: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 70 54 72   pTab;.      pTr
48c0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 4e 65 78  iggerStack->pNex
48d0: 74 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67  t = pParse->trig
48e0: 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 70 50 61  Stack;.      pPa
48f0: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d  rse->trigStack =
4900: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 3b 0a   pTriggerStack;.
4910: 0a 20 20 20 20 20 20 2f 2a 20 63 6f 64 65 20 74  .      /* code t
4920: 68 65 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  he WHEN clause *
4930: 2f 0a 20 20 20 20 20 20 65 6e 64 54 72 69 67 67  /.      endTrigg
4940: 65 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  er = sqliteVdbeM
4950: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 2d  akeLabel(pParse-
4960: 3e 70 56 64 62 65 29 3b 0a 20 20 20 20 20 20 77  >pVdbe);.      w
4970: 68 65 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65  henExpr = sqlite
4980: 45 78 70 72 44 75 70 28 70 54 72 69 67 67 65 72  ExprDup(pTrigger
4990: 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 20 20 20 20  ->pWhen);.      
49a0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
49b0: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
49c0: 20 30 2c 20 26 64 75 6d 6d 79 54 61 62 6c 69 73   0, &dummyTablis
49d0: 74 2c 20 30 2c 20 77 68 65 6e 45 78 70 72 29 20  t, 0, whenExpr) 
49e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
49f0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 70  e->trigStack = p
4a00: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
4a10: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
4a20: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 72 69   sqliteFree(pTri
4a30: 67 67 65 72 53 74 61 63 6b 29 3b 0a 20 20 20 20  ggerStack);.    
4a40: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
4a50: 6c 65 74 65 28 77 68 65 6e 45 78 70 72 29 3b 0a  lete(whenExpr);.
4a60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
4a70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4a80: 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
4a90: 65 28 70 50 61 72 73 65 2c 20 77 68 65 6e 45 78  e(pParse, whenEx
4aa0: 70 72 2c 20 65 6e 64 54 72 69 67 67 65 72 29 3b  pr, endTrigger);
4ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
4ac0: 72 44 65 6c 65 74 65 28 77 68 65 6e 45 78 70 72  rDelete(whenExpr
4ad0: 29 3b 0a 0a 20 20 20 20 20 20 63 6f 64 65 54 72  );..      codeTr
4ae0: 69 67 67 65 72 50 72 6f 67 72 61 6d 28 70 50 61  iggerProgram(pPa
4af0: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 73  rse, pTrigger->s
4b00: 74 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e 66  tep_list, orconf
4b10: 29 3b 20 0a 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ); ..      /* Po
4b20: 70 20 74 68 65 20 65 6e 74 72 79 20 6f 66 66 20  p the entry off 
4b30: 74 68 65 20 74 72 69 67 67 65 72 20 73 74 61 63  the trigger stac
4b40: 6b 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73  k */.      pPars
4b50: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 70  e->trigStack = p
4b60: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
4b70: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
4b80: 71 6c 69 74 65 46 72 65 65 28 70 54 72 69 67 67  qliteFree(pTrigg
4b90: 65 72 53 74 61 63 6b 29 3b 0a 0a 20 20 20 20 20  erStack);..     
4ba0: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
4bb0: 76 65 4c 61 62 65 6c 28 70 50 61 72 73 65 2d 3e  veLabel(pParse->
4bc0: 70 56 64 62 65 2c 20 65 6e 64 54 72 69 67 67 65  pVdbe, endTrigge
4bd0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  r);.    }.    pT
4be0: 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
4bf0: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20  r->pNext;.  }.. 
4c00: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4c10: 0a 20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  . * This functio
4c20: 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  n is called to c
4c30: 6f 64 65 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  ode ON UPDATE an
4c40: 64 20 4f 4e 20 44 45 4c 45 54 45 20 74 72 69 67  d ON DELETE trig
4c50: 67 65 72 73 20 6f 6e 20 0a 20 2a 20 76 69 65 77  gers on . * view
4c60: 73 2e 20 0a 20 2a 0a 20 2a 20 54 68 69 73 20 66  s. . *. * This f
4c70: 75 6e 63 74 69 6f 6e 20 64 65 6c 65 74 65 73 20  unction deletes 
4c80: 74 68 65 20 64 61 74 61 20 70 6f 69 6e 74 65 64  the data pointed
4c90: 20 61 74 20 62 79 20 74 68 65 20 70 57 68 65 72   at by the pWher
4ca0: 65 20 61 6e 64 20 70 43 68 61 6e 67 65 73 0a 20  e and pChanges. 
4cb0: 2a 20 61 72 67 75 6d 65 6e 74 73 20 62 65 66 6f  * arguments befo
4cc0: 72 65 20 69 74 20 63 6f 6d 70 6c 65 74 65 73 2e  re it completes.
4cd0: 0a 20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  . */.void sqlite
4ce0: 56 69 65 77 54 72 69 67 67 65 72 73 28 0a 20 20  ViewTriggers(.  
4cf0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
4d00: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
4d10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
4d20: 65 77 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67  ew to code trigg
4d30: 65 72 73 20 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ers on */.  Expr
4d40: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
4d50: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
4d60: 61 75 73 65 20 6f 66 20 74 68 65 20 73 74 61 74  ause of the stat
4d70: 65 6d 65 6e 74 20 63 61 75 73 69 6e 67 20 74 72  ement causing tr
4d80: 69 67 67 65 72 73 2a 2f 0a 20 20 69 6e 74 20 6f  iggers*/.  int o
4d90: 72 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20  rconf,          
4da0: 2f 2a 20 54 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  /* The ON CONFLI
4db0: 43 54 20 70 6f 6c 69 63 79 20 73 70 65 63 69 66  CT policy specif
4dc0: 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
4dd0: 68 65 0a 09 09 09 20 20 73 74 61 74 65 6d 65 6e  he....  statemen
4de0: 74 20 63 61 75 73 69 6e 67 20 74 68 65 73 65 20  t causing these 
4df0: 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 45 78  triggers */.  Ex
4e00: 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73  prList *pChanges
4e10: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
4e20: 20 61 6e 20 73 74 61 74 65 6d 65 6e 74 20 63 61   an statement ca
4e30: 75 73 69 6e 67 20 74 72 69 67 67 65 72 73 20 74  using triggers t
4e40: 6f 20 66 69 72 65 0a 09 09 09 20 20 69 73 20 61  o fire....  is a
4e50: 6e 20 55 50 44 41 54 45 2c 20 74 68 65 6e 20 74  n UPDATE, then t
4e60: 68 69 73 20 6c 69 73 74 20 68 6f 6c 64 73 20 74  his list holds t
4e70: 68 65 20 63 6f 6c 75 6d 6e 73 0a 09 09 09 20 20  he columns....  
4e80: 74 6f 20 75 70 64 61 74 65 20 61 6e 64 20 74 68  to update and th
4e90: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f  e expressions to
4ea0: 20 75 70 64 61 74 65 20 74 68 65 6d 20 74 6f 2e   update them to.
4eb0: 0a 09 09 09 20 20 53 65 65 20 63 6f 6d 6d 65 6e  ....  See commen
4ec0: 74 73 20 66 6f 72 20 73 71 6c 69 74 65 55 70 64  ts for sqliteUpd
4ed0: 61 74 65 28 29 2e 20 2a 2f 0a 29 7b 0a 20 20 69  ate(). */.){.  i
4ee0: 6e 74 20 6f 6c 64 49 64 78 20 3d 20 2d 31 3b 0a  nt oldIdx = -1;.
4ef0: 20 20 69 6e 74 20 6e 65 77 49 64 78 20 3d 20 2d    int newIdx = -
4f00: 31 3b 0a 20 20 69 6e 74 20 2a 61 58 52 65 66 20  1;.  int *aXRef 
4f10: 3d 20 30 3b 20 20 20 0a 20 20 56 64 62 65 20 2a  = 0;   .  Vdbe *
4f20: 76 3b 0a 20 20 69 6e 74 20 65 6e 64 4f 66 4c 6f  v;.  int endOfLo
4f30: 6f 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 4f  op;.  int startO
4f40: 66 4c 6f 6f 70 3b 0a 20 20 53 65 6c 65 63 74 20  fLoop;.  Select 
4f50: 74 68 65 53 65 6c 65 63 74 3b 0a 20 20 54 6f 6b  theSelect;.  Tok
4f60: 65 6e 20 74 62 6c 4e 61 6d 65 54 6f 6b 65 6e 3b  en tblNameToken;
4f70: 0a 0a 20 20 61 73 73 65 72 74 28 70 54 61 62 2d  ..  assert(pTab-
4f80: 3e 70 53 65 6c 65 63 74 29 3b 0a 0a 20 20 74 62  >pSelect);..  tb
4f90: 6c 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 3d 20 70  lNameToken.z = p
4fa0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 74 62  Tab->zName;.  tb
4fb0: 6c 4e 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20 73  lNameToken.n = s
4fc0: 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a 4e 61 6d  trlen(pTab->zNam
4fd0: 65 29 3b 0a 0a 20 20 74 68 65 53 65 6c 65 63 74  e);..  theSelect
4fe0: 2e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  .isDistinct = 0;
4ff0: 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 70 45 4c  .  theSelect.pEL
5000: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
5010: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 73 71  ListAppend(0, sq
5020: 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4c 4c 2c  liteExpr(TK_ALL,
5030: 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 20   0, 0, 0), 0);. 
5040: 20 74 68 65 53 65 6c 65 63 74 2e 70 53 72 63 20   theSelect.pSrc 
5050: 20 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74    = sqliteIdList
5060: 41 70 70 65 6e 64 28 30 2c 20 26 74 62 6c 4e 61  Append(0, &tblNa
5070: 6d 65 54 6f 6b 65 6e 29 3b 0a 20 20 74 68 65 53  meToken);.  theS
5080: 65 6c 65 63 74 2e 70 57 68 65 72 65 20 3d 20 70  elect.pWhere = p
5090: 57 68 65 72 65 3b 20 20 20 20 70 57 68 65 72 65  Where;    pWhere
50a0: 20 3d 20 30 3b 0a 20 20 74 68 65 53 65 6c 65 63   = 0;.  theSelec
50b0: 74 2e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a  t.pGroupBy = 0;.
50c0: 20 20 74 68 65 53 65 6c 65 63 74 2e 70 48 61 76    theSelect.pHav
50d0: 69 6e 67 20 3d 20 30 3b 0a 20 20 74 68 65 53 65  ing = 0;.  theSe
50e0: 6c 65 63 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  lect.pOrderBy = 
50f0: 30 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 6f  0;.  theSelect.o
5100: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 20 2f  p = TK_SELECT; /
5110: 2a 20 3f 3f 20 2a 2f 0a 20 20 74 68 65 53 65 6c  * ?? */.  theSel
5120: 65 63 74 2e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ect.pPrior = 0;.
5130: 20 20 74 68 65 53 65 6c 65 63 74 2e 6e 4c 69 6d    theSelect.nLim
5140: 69 74 20 3d 20 2d 31 3b 0a 20 20 74 68 65 53 65  it = -1;.  theSe
5150: 6c 65 63 74 2e 6e 4f 66 66 73 65 74 20 3d 20 2d  lect.nOffset = -
5160: 31 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 7a  1;.  theSelect.z
5170: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 74 68  Select = 0;.  th
5180: 65 53 65 6c 65 63 74 2e 62 61 73 65 20 3d 20 30  eSelect.base = 0
5190: 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  ;..  v = sqliteG
51a0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
51b0: 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 73    assert(v);.  s
51c0: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
51d0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
51e0: 20 31 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63   1);..  /* Alloc
51f0: 61 74 65 20 74 65 6d 70 20 74 61 62 6c 65 73 20  ate temp tables 
5200: 2a 2f 0a 20 20 6f 6c 64 49 64 78 20 3d 20 70 50  */.  oldIdx = pP
5210: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
5220: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5230: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
5240: 6f 6c 64 49 64 78 2c 20 30 29 3b 0a 20 20 69 66  oldIdx, 0);.  if
5250: 28 20 70 43 68 61 6e 67 65 73 20 29 7b 0a 20 20  ( pChanges ){.  
5260: 20 20 6e 65 77 49 64 78 20 3d 20 70 50 61 72 73    newIdx = pPars
5270: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
5280: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5290: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 6e  , OP_OpenTemp, n
52a0: 65 77 49 64 78 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ewIdx, 0);.  }..
52b0: 20 20 2f 2a 20 53 6e 61 70 73 68 6f 74 20 74 68    /* Snapshot th
52c0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  e view */.  if( 
52d0: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
52e0: 72 73 65 2c 20 26 74 68 65 53 65 6c 65 63 74 2c  rse, &theSelect,
52f0: 20 53 52 54 5f 54 61 62 6c 65 2c 20 6f 6c 64 49   SRT_Table, oldI
5300: 64 78 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a  dx, 0, 0, 0) ){.
5310: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
5320: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
5330: 20 2f 2a 20 6c 6f 6f 70 20 74 68 72 75 20 74 68   /* loop thru th
5340: 65 20 76 69 65 77 20 73 6e 61 70 73 68 6f 74 2c  e view snapshot,
5350: 20 65 78 65 63 75 74 69 6e 67 20 74 72 69 67 67   executing trigg
5360: 65 72 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77  ers for each row
5370: 20 2a 2f 0a 20 20 65 6e 64 4f 66 4c 6f 6f 70 20   */.  endOfLoop 
5380: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
5390: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69  Label(v);.  sqli
53a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
53b0: 50 5f 52 65 77 69 6e 64 2c 20 6f 6c 64 49 64 78  P_Rewind, oldIdx
53c0: 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 0a 20  , endOfLoop);.. 
53d0: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 75 20 74 68   /* Loop thru th
53e0: 65 20 76 69 65 77 20 73 6e 61 70 73 68 6f 74 2c  e view snapshot,
53f0: 20 65 78 65 63 75 74 69 6e 67 20 74 72 69 67 67   executing trigg
5400: 65 72 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77  ers for each row
5410: 20 2a 2f 0a 20 20 73 74 61 72 74 4f 66 4c 6f 6f   */.  startOfLoo
5420: 70 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75  p = sqliteVdbeCu
5430: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
5440: 20 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 75 70   /* Build the up
5450: 64 61 74 65 64 20 72 6f 77 20 69 66 20 72 65 71  dated row if req
5460: 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  uired */.  if( p
5470: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 69  Changes ){.    i
5480: 6e 74 20 69 69 3b 0a 0a 20 20 20 20 61 58 52 65  nt ii;..    aXRe
5490: 66 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  f = sqliteMalloc
54a0: 28 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20  ( sizeof(int) * 
54b0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
54c0: 20 20 69 66 28 20 61 58 52 65 66 3d 3d 30 20 29    if( aXRef==0 )
54d0: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
54e0: 65 61 6e 75 70 3b 0a 20 20 20 20 66 6f 72 28 69  eanup;.    for(i
54f0: 69 20 3d 20 30 3b 20 69 69 20 3c 20 70 54 61 62  i = 0; ii < pTab
5500: 2d 3e 6e 43 6f 6c 3b 20 69 69 2b 2b 29 7b 0a 20  ->nCol; ii++){. 
5510: 20 20 20 20 20 61 58 52 65 66 5b 69 69 5d 20 3d       aXRef[ii] =
5520: 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
5530: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 68  for(ii=0; ii<pCh
5540: 61 6e 67 65 73 2d 3e 6e 45 78 70 72 3b 20 69 69  anges->nExpr; ii
5550: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
5560: 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  j;.      if( sql
5570: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
5580: 73 28 70 50 61 72 73 65 2c 20 6f 6c 64 49 64 78  s(pParse, oldIdx
5590: 2c 20 74 68 65 53 65 6c 65 63 74 2e 70 53 72 63  , theSelect.pSrc
55a0: 20 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20   , 0, .         
55b0: 20 20 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69     pChanges->a[i
55c0: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
55d0: 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65       goto trigge
55e0: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  r_cleanup;.     
55f0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71   }..      if( sq
5600: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
5610: 61 72 73 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e  arse, pChanges->
5620: 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 2c 20  a[ii].pExpr, 0, 
5630: 30 29 20 29 0a 20 20 20 20 20 20 20 20 67 6f 74  0) ).        got
5640: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
5650: 70 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a  p;..      for(jj
5660: 3d 30 3b 20 6a 6a 3c 70 54 61 62 2d 3e 6e 43 6f  =0; jj<pTab->nCo
5670: 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  l; jj++){.      
5680: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
5690: 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  Cmp(pTab->aCol[j
56a0: 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 43 68 61 6e 67  j].zName, pChang
56b0: 65 73 2d 3e 61 5b 69 69 5d 2e 7a 4e 61 6d 65 29  es->a[ii].zName)
56c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
56d0: 20 61 58 52 65 66 5b 6a 6a 5d 20 3d 20 69 69 3b   aXRef[jj] = ii;
56e0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
56f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5700: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 6a    }.      if( jj
5710: 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
5720: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
5730: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
5740: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
5750: 63 68 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20 0a 20  ch column: ", . 
5760: 20 20 20 20 20 20 20 20 20 20 20 70 43 68 61 6e             pChan
5770: 67 65 73 2d 3e 61 5b 69 69 5d 2e 7a 4e 61 6d 65  ges->a[ii].zName
5780: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
5790: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
57a0: 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67        goto trigg
57b0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  er_cleanup;.    
57c0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
57d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
57e0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 33  , OP_Integer, 13
57f0: 2c 20 30 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  , 0);..    for(i
5800: 69 20 3d 20 30 3b 20 69 69 3c 70 54 61 62 2d 3e  i = 0; ii<pTab->
5810: 6e 43 6f 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nCol; ii++){.   
5820: 20 20 20 69 66 28 20 61 58 52 65 66 5b 69 69 5d     if( aXRef[ii]
5830: 20 3c 20 30 20 29 7b 20 0a 20 20 20 20 20 20 20   < 0 ){ .       
5840: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5850: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 6f  (v, OP_Column, o
5860: 6c 64 49 64 78 2c 20 69 69 29 3b 0a 20 20 20 20  ldIdx, ii);.    
5870: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5880: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
5890: 70 50 61 72 73 65 2c 20 70 43 68 61 6e 67 65 73  pParse, pChanges
58a0: 2d 3e 61 5b 61 58 52 65 66 5b 69 69 5d 5d 2e 70  ->a[aXRef[ii]].p
58b0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
58c0: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
58d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
58e0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 54 61 62  MakeRecord, pTab
58f0: 2d 3e 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  ->nCol, 0);.    
5900: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5910: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
5920: 20 6e 65 77 49 64 78 2c 20 30 29 3b 0a 20 20 20   newIdx, 0);.   
5930: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5940: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 6e  (v, OP_Rewind, n
5950: 65 77 49 64 78 2c 20 30 29 3b 0a 0a 20 20 20 20  ewIdx, 0);..    
5960: 73 71 6c 69 74 65 43 6f 64 65 52 6f 77 54 72 69  sqliteCodeRowTri
5970: 67 67 65 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  gger(pParse, TK_
5980: 55 50 44 41 54 45 2c 20 70 43 68 61 6e 67 65 73  UPDATE, pChanges
5990: 2c 20 54 4b 5f 42 45 46 4f 52 45 2c 20 0a 20 20  , TK_BEFORE, .  
59a0: 20 20 20 20 20 20 70 54 61 62 2c 20 6e 65 77 49        pTab, newI
59b0: 64 78 2c 20 6f 6c 64 49 64 78 2c 20 6f 72 63 6f  dx, oldIdx, orco
59c0: 6e 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43  nf);.    sqliteC
59d0: 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70 50  odeRowTrigger(pP
59e0: 61 72 73 65 2c 20 54 4b 5f 55 50 44 41 54 45 2c  arse, TK_UPDATE,
59f0: 20 70 43 68 61 6e 67 65 73 2c 20 54 4b 5f 41 46   pChanges, TK_AF
5a00: 54 45 52 2c 20 0a 20 20 20 20 20 20 20 20 70 54  TER, .        pT
5a10: 61 62 2c 20 6e 65 77 49 64 78 2c 20 6f 6c 64 49  ab, newIdx, oldI
5a20: 64 78 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 7d  dx, orconf);.  }
5a30: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
5a40: 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70  CodeRowTrigger(p
5a50: 50 61 72 73 65 2c 20 54 4b 5f 44 45 4c 45 54 45  Parse, TK_DELETE
5a60: 2c 20 30 2c 20 54 4b 5f 42 45 46 4f 52 45 2c 20  , 0, TK_BEFORE, 
5a70: 70 54 61 62 2c 20 2d 31 2c 20 6f 6c 64 49 64 78  pTab, -1, oldIdx
5a80: 2c 20 0a 20 20 20 20 20 20 20 20 6f 72 63 6f 6e  , .        orcon
5a90: 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f  f);.    sqliteCo
5aa0: 64 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61  deRowTrigger(pPa
5ab0: 72 73 65 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20  rse, TK_DELETE, 
5ac0: 30 2c 20 54 4b 5f 41 46 54 45 52 2c 20 70 54 61  0, TK_AFTER, pTa
5ad0: 62 2c 20 2d 31 2c 20 6f 6c 64 49 64 78 2c 20 0a  b, -1, oldIdx, .
5ae0: 20 20 20 20 20 20 20 20 6f 72 63 6f 6e 66 29 3b          orconf);
5af0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 56 64  .  }..  sqliteVd
5b00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
5b10: 78 74 2c 20 6f 6c 64 49 64 78 2c 20 73 74 61 72  xt, oldIdx, star
5b20: 74 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20 73 71 6c  tOfLoop);..  sql
5b30: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
5b40: 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f 70  bel(v, endOfLoop
5b50: 29 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64 57 72  );.  sqliteEndWr
5b60: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
5b70: 72 73 65 29 3b 0a 0a 74 72 69 67 67 65 72 5f 63  rse);..trigger_c
5b80: 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
5b90: 46 72 65 65 28 61 58 52 65 66 29 3b 0a 20 20 73  Free(aXRef);.  s
5ba0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
5bb0: 65 74 65 28 70 43 68 61 6e 67 65 73 29 3b 0a 20  ete(pChanges);. 
5bc0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
5bd0: 65 28 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c  e(pWhere);.  sql
5be0: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
5bf0: 65 28 74 68 65 53 65 6c 65 63 74 2e 70 45 4c 69  e(theSelect.pELi
5c00: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 49 64 4c  st);.  sqliteIdL
5c10: 69 73 74 44 65 6c 65 74 65 28 74 68 65 53 65 6c  istDelete(theSel
5c20: 65 63 74 2e 70 53 72 63 29 3b 0a 20 20 73 71 6c  ect.pSrc);.  sql
5c30: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 74 68  iteExprDelete(th
5c40: 65 53 65 6c 65 63 74 2e 70 57 68 65 72 65 29 3b  eSelect.pWhere);
5c50: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.