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

Artifact d88ab4d68d68955c217b38fb6717e090fbbf54a4:


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 2c 20 54 4b 5f 49   TK_AFTER , TK_I
0310: 4e 53 54 45 41 44 20 2a 2f 0a 20 20 69 6e 74 20  NSTEAD */.  int 
0320: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
0330: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e 53  /* One of TK_INS
0340: 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20  ERT, TK_UPDATE, 
0350: 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 49  TK_DELETE */.  I
0360: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c  dList *pColumns,
0370: 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73     /* column lis
0380: 74 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  t if this is an 
0390: 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67 65  UPDATE OF trigge
03a0: 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  r */.  Token *pT
03b0: 61 62 6c 65 4e 61 6d 65 2c 20 20 2f 2a 20 54 68  ableName,  /* Th
03c0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
03d0: 62 6c 65 2f 76 69 65 77 20 74 68 65 20 74 72 69  ble/view the tri
03e0: 67 67 65 72 20 61 70 70 6c 69 65 73 20 74 6f 20  gger applies to 
03f0: 2a 2f 0a 20 20 69 6e 74 20 66 6f 72 65 61 63 68  */.  int foreach
0400: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ,        /* One 
0410: 6f 66 20 54 4b 5f 52 4f 57 20 6f 72 20 54 4b 5f  of TK_ROW or TK_
0420: 53 54 41 54 45 4d 45 4e 54 20 2a 2f 0a 20 20 45  STATEMENT */.  E
0430: 78 70 72 20 2a 70 57 68 65 6e 2c 20 20 20 20 20  xpr *pWhen,     
0440: 20 20 20 2f 2a 20 57 48 45 4e 20 63 6c 61 75 73     /* WHEN claus
0450: 65 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74  e */.  TriggerSt
0460: 65 70 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 2f  ep *pStepList, /
0470: 2a 20 54 68 65 20 74 72 69 67 67 65 72 65 64 20  * The triggered 
0480: 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 63 68 61  program */.  cha
0490: 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 2c 20  r const *zData, 
04a0: 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 20 64   /* The string d
04b0: 61 74 61 20 74 6f 20 6d 61 6b 65 20 70 65 72 73  ata to make pers
04c0: 69 73 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  istent */.  int 
04d0: 7a 44 61 74 61 4c 65 6e 0a 29 7b 0a 20 20 54 72  zDataLen.){.  Tr
04e0: 69 67 67 65 72 20 2a 6e 74 3b 0a 20 20 54 61 62  igger *nt;.  Tab
04f0: 6c 65 20 20 20 2a 74 61 62 3b 0a 20 20 69 6e 74  le   *tab;.  int
0500: 20 6f 66 66 73 65 74 3b 0a 20 20 54 72 69 67 67   offset;.  Trigg
0510: 65 72 53 74 65 70 20 2a 73 73 3b 0a 0a 20 20 2f  erStep *ss;..  /
0520: 2a 20 43 68 65 63 6b 20 74 68 61 74 3a 20 0a 20  * Check that: . 
0530: 20 2a 2a 20 31 2e 20 74 68 65 20 74 72 69 67 67   ** 1. the trigg
0540: 65 72 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  er name does not
0550: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
0560: 20 20 2a 2a 20 32 2e 20 74 68 65 20 74 61 62 6c    ** 2. the tabl
0570: 65 20 28 6f 72 20 76 69 65 77 29 20 64 6f 65 73  e (or view) does
0580: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 33 2e 20   exist..  ** 3. 
0590: 74 68 61 74 20 77 65 20 61 72 65 20 6e 6f 74 20  that we are not 
05a0: 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65  trying to create
05b0: 20 61 20 74 72 69 67 67 65 72 20 6f 6e 20 74 68   a trigger on th
05c0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
05d0: 74 61 62 6c 65 0a 20 20 2a 2a 20 34 2e 20 54 68  table.  ** 4. Th
05e0: 61 74 20 77 65 20 61 72 65 20 6e 6f 74 20 74 72  at we are not tr
05f0: 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20 61  ying to create a
0600: 6e 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69  n INSTEAD OF tri
0610: 67 67 65 72 20 6f 6e 20 61 20 74 61 62 6c 65 2e  gger on a table.
0620: 0a 20 20 2a 2a 20 35 2e 20 54 68 61 74 20 77 65  .  ** 5. That we
0630: 20 61 72 65 20 6e 6f 74 20 74 72 79 69 6e 67 20   are not trying 
0640: 74 6f 20 63 72 65 61 74 65 20 61 20 42 45 46 4f  to create a BEFO
0650: 52 45 20 6f 72 20 41 46 54 45 52 20 74 72 69 67  RE or AFTER trig
0660: 67 65 72 20 6f 6e 20 61 20 76 69 65 77 2e 0a 20  ger on a view.. 
0670: 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 63 68 61 72   */.  {.    char
0680: 20 2a 74 6d 70 5f 73 74 72 20 3d 20 73 71 6c 69   *tmp_str = sqli
0690: 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d  teStrNDup(pName-
06a0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
06b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 48 61 73     if( sqliteHas
06c0: 68 46 69 6e 64 28 26 28 70 50 61 72 73 65 2d 3e  hFind(&(pParse->
06d0: 64 62 2d 3e 74 72 69 67 48 61 73 68 29 2c 20 74  db->trigHash), t
06e0: 6d 70 5f 73 74 72 2c 20 70 4e 61 6d 65 2d 3e 6e  mp_str, pName->n
06f0: 20 2b 20 31 29 20 29 7b 0a 20 20 20 20 20 20 73   + 1) ){.      s
0700: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
0710: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
0720: 2c 20 22 74 72 69 67 67 65 72 20 22 2c 20 2d 31  , "trigger ", -1
0730: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d  ,.          pNam
0740: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
0750: 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  " already exists
0760: 22 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  ", -1, 0);.     
0770: 20 73 71 6c 69 74 65 46 72 65 65 28 74 6d 70 5f   sqliteFree(tmp_
0780: 73 74 72 29 3b 0a 20 20 20 20 20 20 70 50 61 72  str);.      pPar
0790: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
07a0: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
07b0: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
07c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 6d 70    sqliteFree(tmp
07d0: 5f 73 74 72 29 3b 0a 20 20 7d 0a 20 20 7b 0a 20  _str);.  }.  {. 
07e0: 20 20 20 63 68 61 72 20 2a 74 6d 70 5f 73 74 72     char *tmp_str
07f0: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
0800: 28 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 7a 2c 20  (pTableName->z, 
0810: 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e 29 3b 0a  pTableName->n);.
0820: 20 20 20 20 69 66 28 20 74 6d 70 5f 73 74 72 3d      if( tmp_str=
0830: 3d 30 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65  =0 ) goto trigge
0840: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 74  r_cleanup;.    t
0850: 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  ab = sqliteFindT
0860: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
0870: 20 74 6d 70 5f 73 74 72 29 3b 0a 20 20 20 20 73   tmp_str);.    s
0880: 71 6c 69 74 65 46 72 65 65 28 74 6d 70 5f 73 74  qliteFree(tmp_st
0890: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 74 61 62  r);.    if( !tab
08a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
08b0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
08c0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
08d0: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20   such table: ", 
08e0: 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 70 54  -1,.          pT
08f0: 61 62 6c 65 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61  ableName->z, pTa
0900: 62 6c 65 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a  bleName->n, 0);.
0910: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
0920: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rr++;.      goto
0930: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
0940: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
0950: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 74 61  sqliteStrICmp(ta
0960: 62 2d 3e 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52  b->zName, MASTER
0970: 5f 4e 41 4d 45 29 3d 3d 30 20 29 7b 0a 20 20 20  _NAME)==0 ){.   
0980: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
0990: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
09a0: 4d 73 67 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65  Msg, "cannot cre
09b0: 61 74 65 20 74 72 69 67 67 65 72 20 6f 6e 20 73  ate trigger on s
09c0: 79 73 74 65 6d 20 22 0a 20 20 20 20 20 20 20 20  ystem ".        
09d0: 20 22 74 61 62 6c 65 3a 20 22 20 4d 41 53 54 45   "table: " MASTE
09e0: 52 5f 4e 41 4d 45 2c 20 30 29 3b 0a 20 20 20 20  R_NAME, 0);.    
09f0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
0a00: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69  ;.      goto tri
0a10: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
0a20: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
0a30: 74 65 53 74 72 49 43 6d 70 28 74 61 62 2d 3e 7a  teStrICmp(tab->z
0a40: 4e 61 6d 65 2c 20 54 45 4d 50 5f 4d 41 53 54 45  Name, TEMP_MASTE
0a50: 52 5f 4e 41 4d 45 29 3d 3d 30 20 29 7b 0a 20 20  R_NAME)==0 ){.  
0a60: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
0a70: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
0a80: 72 4d 73 67 2c 20 22 63 61 6e 6e 6f 74 20 63 72  rMsg, "cannot cr
0a90: 65 61 74 65 20 74 72 69 67 67 65 72 20 6f 6e 20  eate trigger on 
0aa0: 73 79 73 74 65 6d 20 22 0a 20 20 20 20 20 20 20  system ".       
0ab0: 20 20 22 74 61 62 6c 65 3a 20 22 20 54 45 4d 50    "table: " TEMP
0ac0: 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 30 29  _MASTER_NAME, 0)
0ad0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
0ae0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f  nErr++;.      go
0af0: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
0b00: 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  up;.    }.    if
0b10: 28 20 74 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  ( tab->pSelect &
0b20: 26 20 74 72 5f 74 6d 20 21 3d 20 54 4b 5f 49 4e  & tr_tm != TK_IN
0b30: 53 54 45 41 44 20 29 7b 0a 20 20 20 20 20 20 73  STEAD ){.      s
0b40: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
0b50: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
0b60: 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65  , "cannot create
0b70: 20 22 2c 20 2d 31 2c 0a 09 20 20 28 74 72 5f 74   ", -1,..  (tr_t
0b80: 6d 20 3d 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f  m == TK_BEFORE)?
0b90: 22 42 45 46 4f 52 45 22 3a 22 41 46 54 45 52 22  "BEFORE":"AFTER"
0ba0: 2c 20 2d 31 2c 20 22 20 74 72 69 67 67 65 72 20  , -1, " trigger 
0bb0: 6f 6e 20 76 69 65 77 3a 20 22 2c 20 2d 31 0a 20  on view: ", -1. 
0bc0: 20 20 20 20 20 20 20 20 20 2c 20 70 54 61 62 6c           , pTabl
0bd0: 65 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c 65  eName->z, pTable
0be0: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  Name->n, 0);.   
0bf0: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
0c00: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
0c10: 20 20 20 69 66 28 20 21 74 61 62 2d 3e 70 53 65     if( !tab->pSe
0c20: 6c 65 63 74 20 26 26 20 74 72 5f 74 6d 20 3d 3d  lect && tr_tm ==
0c30: 20 54 4b 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20   TK_INSTEAD ){. 
0c40: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
0c50: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
0c60: 45 72 72 4d 73 67 2c 20 22 63 61 6e 6e 6f 74 20  ErrMsg, "cannot 
0c70: 63 72 65 61 74 65 20 49 4e 53 54 45 41 44 20 4f  create INSTEAD O
0c80: 46 22 2c 20 2d 31 2c 20 0a 09 20 20 22 20 74 72  F", -1, ..  " tr
0c90: 69 67 67 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20  igger on table: 
0ca0: 22 2c 20 2d 31 2c 20 70 54 61 62 6c 65 4e 61 6d  ", -1, pTableNam
0cb0: 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e 61 6d 65  e->z, pTableName
0cc0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 67  ->n, 0);.      g
0cd0: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
0ce0: 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nup;.    }.  }..
0cf0: 20 20 69 66 20 28 74 72 5f 74 6d 20 3d 3d 20 54    if (tr_tm == T
0d00: 4b 5f 49 4e 53 54 45 41 44 29 7b 0a 20 20 20 20  K_INSTEAD){.    
0d10: 74 72 5f 74 6d 20 3d 20 54 4b 5f 42 45 46 4f 52  tr_tm = TK_BEFOR
0d20: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69  E;.  }..  /* Bui
0d30: 6c 64 20 74 68 65 20 54 72 69 67 67 65 72 20 6f  ld the Trigger o
0d40: 62 6a 65 63 74 20 2a 2f 0a 20 20 6e 74 20 3d 20  bject */.  nt = 
0d50: 28 54 72 69 67 67 65 72 2a 29 73 71 6c 69 74 65  (Trigger*)sqlite
0d60: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72  Malloc(sizeof(Tr
0d70: 69 67 67 65 72 29 29 3b 0a 20 20 69 66 28 20 6e  igger));.  if( n
0d80: 74 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72 69 67  t==0 ) goto trig
0d90: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 6e  ger_cleanup;.  n
0da0: 74 2d 3e 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t->name = sqlite
0db0: 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a  StrNDup(pName->z
0dc0: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 6e  , pName->n);.  n
0dd0: 74 2d 3e 74 61 62 6c 65 20 3d 20 73 71 6c 69 74  t->table = sqlit
0de0: 65 53 74 72 4e 44 75 70 28 70 54 61 62 6c 65 4e  eStrNDup(pTableN
0df0: 61 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e 61  ame->z, pTableNa
0e00: 6d 65 2d 3e 6e 29 3b 0a 20 20 6e 74 2d 3e 73 74  me->n);.  nt->st
0e10: 72 69 6e 67 73 20 3d 20 73 71 6c 69 74 65 53 74  rings = sqliteSt
0e20: 72 4e 44 75 70 28 7a 44 61 74 61 2c 20 7a 44 61  rNDup(zData, zDa
0e30: 74 61 4c 65 6e 29 3b 0a 20 20 69 66 28 20 73 71  taLen);.  if( sq
0e40: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
0e50: 65 64 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65  ed ) goto trigge
0e60: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 6e 74 2d  r_cleanup;.  nt-
0e70: 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 6e 74 2d 3e  >op = op;.  nt->
0e80: 74 72 5f 74 6d 20 3d 20 74 72 5f 74 6d 3b 0a 20  tr_tm = tr_tm;. 
0e90: 20 6e 74 2d 3e 70 57 68 65 6e 20 3d 20 70 57 68   nt->pWhen = pWh
0ea0: 65 6e 3b 0a 20 20 6e 74 2d 3e 70 43 6f 6c 75 6d  en;.  nt->pColum
0eb0: 6e 73 20 3d 20 70 43 6f 6c 75 6d 6e 73 3b 0a 20  ns = pColumns;. 
0ec0: 20 6e 74 2d 3e 66 6f 72 65 61 63 68 20 3d 20 66   nt->foreach = f
0ed0: 6f 72 65 61 63 68 3b 0a 20 20 6e 74 2d 3e 73 74  oreach;.  nt->st
0ee0: 65 70 5f 6c 69 73 74 20 3d 20 70 53 74 65 70 4c  ep_list = pStepL
0ef0: 69 73 74 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20  ist;.  offset = 
0f00: 28 69 6e 74 29 28 6e 74 2d 3e 73 74 72 69 6e 67  (int)(nt->string
0f10: 73 20 2d 20 7a 44 61 74 61 29 3b 0a 20 20 73 71  s - zData);.  sq
0f20: 6c 69 74 65 45 78 70 72 4d 6f 76 65 53 74 72 69  liteExprMoveStri
0f30: 6e 67 73 28 6e 74 2d 3e 70 57 68 65 6e 2c 20 6f  ngs(nt->pWhen, o
0f40: 66 66 73 65 74 29 3b 0a 0a 20 20 73 73 20 3d 20  ffset);..  ss = 
0f50: 6e 74 2d 3e 73 74 65 70 5f 6c 69 73 74 3b 0a 20  nt->step_list;. 
0f60: 20 77 68 69 6c 65 28 20 73 73 20 29 7b 0a 20 20   while( ss ){.  
0f70: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 4d 6f    sqliteSelectMo
0f80: 76 65 53 74 72 69 6e 67 73 28 73 73 2d 3e 70 53  veStrings(ss->pS
0f90: 65 6c 65 63 74 2c 20 6f 66 66 73 65 74 29 3b 0a  elect, offset);.
0fa0: 20 20 20 20 69 66 28 20 73 73 2d 3e 74 61 72 67      if( ss->targ
0fb0: 65 74 2e 7a 20 29 7b 0a 20 20 20 20 20 20 73 73  et.z ){.      ss
0fc0: 2d 3e 74 61 72 67 65 74 2e 7a 20 2b 3d 20 6f 66  ->target.z += of
0fd0: 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
0fe0: 73 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53 74  sqliteExprMoveSt
0ff0: 72 69 6e 67 73 28 73 73 2d 3e 70 57 68 65 72 65  rings(ss->pWhere
1000: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  , offset);.    s
1010: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 4d 6f 76  qliteExprListMov
1020: 65 53 74 72 69 6e 67 73 28 73 73 2d 3e 70 45 78  eStrings(ss->pEx
1030: 70 72 4c 69 73 74 2c 20 6f 66 66 73 65 74 29 3b  prList, offset);
1040: 0a 0a 20 20 20 20 73 73 20 3d 20 73 73 2d 3e 70  ..    ss = ss->p
1050: 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Next;.  }..  /* 
1060: 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
1070: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 61 6e 64 20  itializing, and 
1080: 74 68 69 73 20 74 72 69 67 67 65 72 20 69 73 20  this trigger is 
1090: 6e 6f 74 20 6f 6e 20 61 20 54 45 4d 50 20 74 61  not on a TEMP ta
10a0: 62 6c 65 2c 20 0a 20 20 2a 2a 20 62 75 69 6c 64  ble, .  ** build
10b0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
10c0: 65 72 20 65 6e 74 72 79 0a 20 20 2a 2f 0a 20 20  er entry.  */.  
10d0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69  if( !pParse->ini
10e0: 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 74 61  tFlag ){.    sta
10f0: 74 69 63 20 56 64 62 65 4f 70 20 69 6e 73 65 72  tic VdbeOp inser
1100: 74 54 72 69 67 5b 5d 20 3d 20 7b 0a 20 20 20 20  tTrig[] = {.    
1110: 20 20 7b 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c    { OP_NewRecno,
1120: 20 20 20 30 2c 20 30 2c 20 20 30 20 20 20 20 20     0, 0,  0     
1130: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
1140: 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30  OP_String,     0
1150: 2c 20 30 2c 20 20 22 74 72 69 67 67 65 72 22 20  , 0,  "trigger" 
1160: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   },.      { OP_S
1170: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
1180: 20 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 20    0          }, 
1190: 20 2f 2a 20 32 3a 20 74 72 69 67 67 65 72 20 6e   /* 2: trigger n
11a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  ame */.      { O
11b0: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c  P_String,     0,
11c0: 20 30 2c 20 20 30 20 20 20 20 20 20 20 20 20 20   0,  0          
11d0: 7d 2c 20 20 2f 2a 20 33 3a 20 74 61 62 6c 65 20  },  /* 3: table 
11e0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20  name */.      { 
11f0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 30  OP_Integer,    0
1200: 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20 20 20  , 0,  0         
1210: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   },.      { OP_S
1220: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
1230: 20 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 20    0          }, 
1240: 20 2f 2a 20 35 3a 20 53 51 4c 20 2a 2f 0a 20 20   /* 5: SQL */.  
1250: 20 20 20 20 7b 20 4f 50 5f 4d 61 6b 65 52 65 63      { OP_MakeRec
1260: 6f 72 64 2c 20 35 2c 20 30 2c 20 20 30 20 20 20  ord, 5, 0,  0   
1270: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
1280: 7b 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  { OP_PutIntKey, 
1290: 20 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20   0, 0,  0       
12a0: 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20     },.    };.   
12b0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 56   int addr;.    V
12c0: 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 2f 2a 20  dbe *v;..    /* 
12d0: 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  Make an entry in
12e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
12f0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
1300: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
1310: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
1320: 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 74  f( v==0 ) goto t
1330: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
1340: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
1350: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1360: 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  arse, 0);.    sq
1370: 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61  liteOpenMasterTa
1380: 62 6c 65 28 76 2c 20 74 61 62 2d 3e 69 73 54 65  ble(v, tab->isTe
1390: 6d 70 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  mp);.    addr = 
13a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
13b0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
13c0: 28 69 6e 73 65 72 74 54 72 69 67 29 2c 20 69 6e  (insertTrig), in
13d0: 73 65 72 74 54 72 69 67 29 3b 0a 20 20 20 20 73  sertTrig);.    s
13e0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
13f0: 33 28 76 2c 20 61 64 64 72 2c 20 74 61 62 2d 3e  3(v, addr, tab->
1400: 69 73 54 65 6d 70 20 3f 20 54 45 4d 50 5f 4d 41  isTemp ? TEMP_MA
1410: 53 54 45 52 5f 4e 41 4d 45 20 3a 20 4d 41 53 54  STER_NAME : MAST
1420: 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 20  ER_NAME,.       
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
1450: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
1460: 50 33 28 76 2c 20 61 64 64 72 2b 32 2c 20 6e 74  P3(v, addr+2, nt
1470: 2d 3e 6e 61 6d 65 2c 20 30 29 3b 20 0a 20 20 20  ->name, 0); .   
1480: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
1490: 65 50 33 28 76 2c 20 61 64 64 72 2b 33 2c 20 6e  eP3(v, addr+3, n
14a0: 74 2d 3e 74 61 62 6c 65 2c 20 30 29 3b 20 0a 20  t->table, 0); . 
14b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
14c0: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2b 35 2c  ngeP3(v, addr+5,
14d0: 20 6e 74 2d 3e 73 74 72 69 6e 67 73 2c 20 30 29   nt->strings, 0)
14e0: 3b 0a 20 20 20 20 69 66 28 20 21 74 61 62 2d 3e  ;.    if( !tab->
14f0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
1500: 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b  sqliteChangeCook
1510: 69 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 76  ie(pParse->db, v
1520: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1530: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1540: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
1550: 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72  .    sqliteEndWr
1560: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1570: 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rse);.  }..  if(
1580: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
1590: 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 69 63  n ){.    /* Stic
15a0: 6b 20 69 74 20 69 6e 20 74 68 65 20 68 61 73 68  k it in the hash
15b0: 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71  -table */.    sq
15c0: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
15d0: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 74 72 69  (pParse->db->tri
15e0: 67 48 61 73 68 29 2c 20 6e 74 2d 3e 6e 61 6d 65  gHash), nt->name
15f0: 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 31 2c 20  , pName->n + 1, 
1600: 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 74 74  nt);..    /* Att
1610: 61 63 68 20 69 74 20 74 6f 20 74 68 65 20 74 61  ach it to the ta
1620: 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ble object */.  
1630: 20 20 6e 74 2d 3e 70 4e 65 78 74 20 3d 20 74 61    nt->pNext = ta
1640: 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  b->pTrigger;.   
1650: 20 74 61 62 2d 3e 70 54 72 69 67 67 65 72 20 3d   tab->pTrigger =
1660: 20 6e 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   nt;.    return;
1670: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1680: 6c 69 74 65 46 72 65 65 28 6e 74 2d 3e 73 74 72  liteFree(nt->str
1690: 69 6e 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  ings);.    sqlit
16a0: 65 46 72 65 65 28 6e 74 2d 3e 6e 61 6d 65 29 3b  eFree(nt->name);
16b0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
16c0: 6e 74 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 20 20  nt->table);.    
16d0: 73 71 6c 69 74 65 46 72 65 65 28 6e 74 29 3b 0a  sqliteFree(nt);.
16e0: 20 20 7d 0a 0a 74 72 69 67 67 65 72 5f 63 6c 65    }..trigger_cle
16f0: 61 6e 75 70 3a 0a 0a 20 20 73 71 6c 69 74 65 49  anup:..  sqliteI
1700: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 43 6f 6c  dListDelete(pCol
1710: 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 45  umns);.  sqliteE
1720: 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 6e 29  xprDelete(pWhen)
1730: 3b 0a 20 20 7b 0a 20 20 20 20 54 72 69 67 67 65  ;.  {.    Trigge
1740: 72 53 74 65 70 20 2a 20 70 70 3b 0a 20 20 20 20  rStep * pp;.    
1750: 54 72 69 67 67 65 72 53 74 65 70 20 2a 20 6e 6e  TriggerStep * nn
1760: 3b 0a 0a 20 20 20 20 70 70 20 3d 20 70 53 74 65  ;..    pp = pSte
1770: 70 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  pList;.    while
1780: 28 20 70 70 20 29 7b 0a 20 20 20 20 20 20 6e 6e  ( pp ){.      nn
1790: 20 3d 20 70 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pp->pNext;.  
17a0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
17b0: 6c 65 74 65 28 70 70 2d 3e 70 57 68 65 72 65 29  lete(pp->pWhere)
17c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
17d0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 70 2d  prListDelete(pp-
17e0: 3e 70 45 78 70 72 4c 69 73 74 29 3b 0a 20 20 20  >pExprList);.   
17f0: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
1800: 65 6c 65 74 65 28 70 70 2d 3e 70 53 65 6c 65 63  elete(pp->pSelec
1810: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1820: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 70 2d  IdListDelete(pp-
1830: 3e 70 49 64 4c 69 73 74 29 3b 0a 20 20 20 20 20  >pIdList);.     
1840: 20 73 71 6c 69 74 65 46 72 65 65 28 70 70 29 3b   sqliteFree(pp);
1850: 0a 20 20 20 20 20 20 70 70 20 3d 20 6e 6e 3b 0a  .      pp = nn;.
1860: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1870: 2a 2a 20 54 75 72 6e 20 61 20 53 45 4c 45 43 54  ** Turn a SELECT
1880: 20 73 74 61 74 65 6d 65 6e 74 20 28 74 68 61 74   statement (that
1890: 20 74 68 65 20 70 53 65 6c 65 63 74 20 70 61 72   the pSelect par
18a0: 61 6d 65 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ameter points to
18b0: 29 20 69 6e 74 6f 0a 2a 2a 20 61 20 74 72 69 67  ) into.** a trig
18c0: 67 65 72 20 73 74 65 70 2e 20 20 52 65 74 75 72  ger step.  Retur
18d0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
18e0: 20 54 72 69 67 67 65 72 53 74 65 70 20 73 74 72   TriggerStep str
18f0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
1900: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
1910: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
1920: 20 69 74 20 66 69 6e 64 73 20 61 20 53 45 4c 45   it finds a SELE
1930: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 0a  CT statement in.
1940: 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  ** body of a TRI
1950: 47 47 45 52 2e 20 20 0a 2a 2f 0a 54 72 69 67 67  GGER.  .*/.Trigg
1960: 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 54 72  erStep *sqliteTr
1970: 69 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28  iggerSelectStep(
1980: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
1990: 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20  {.  TriggerStep 
19a0: 2a 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20  *pTriggerStep = 
19b0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
19c0: 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29  eof(TriggerStep)
19d0: 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  );.  if( pTrigge
19e0: 72 53 74 65 70 3d 3d 30 20 29 20 72 65 74 75 72  rStep==0 ) retur
19f0: 6e 20 30 3b 0a 0a 20 20 70 54 72 69 67 67 65 72  n 0;..  pTrigger
1a00: 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  Step->op = TK_SE
1a10: 4c 45 43 54 3b 0a 20 20 70 54 72 69 67 67 65 72  LECT;.  pTrigger
1a20: 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Step->pSelect = 
1a30: 70 53 65 6c 65 63 74 3b 0a 20 20 70 54 72 69 67  pSelect;.  pTrig
1a40: 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20  gerStep->orconf 
1a50: 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 0a 20  = OE_Default;.. 
1a60: 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72   return pTrigger
1a70: 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  Step;.}../*.** B
1a80: 75 69 6c 64 20 61 20 74 72 69 67 67 65 72 20 73  uild a trigger s
1a90: 74 65 70 20 6f 75 74 20 6f 66 20 61 6e 20 49 4e  tep out of an IN
1aa0: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  SERT statement. 
1ab0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1ac0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 77 20  r.** to the new 
1ad0: 74 72 69 67 67 65 72 20 73 74 65 70 2e 0a 2a 2a  trigger step..**
1ae0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
1af0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1b00: 65 20 77 68 65 6e 20 69 74 20 73 65 65 73 20 61  e when it sees a
1b10: 6e 20 49 4e 53 45 52 54 20 69 6e 73 69 64 65 20  n INSERT inside 
1b20: 74 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61  the.** body of a
1b30: 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72 69   trigger..*/.Tri
1b40: 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65  ggerStep *sqlite
1b50: 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 65  TriggerInsertSte
1b60: 70 28 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  p(.  Token *pTab
1b70: 6c 65 4e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  leName,  /* Name
1b80: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e   of the table in
1b90: 74 6f 20 77 68 69 63 68 20 77 65 20 69 6e 73 65  to which we inse
1ba0: 72 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  rt */.  IdList *
1bb0: 70 43 6f 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20 4c  pColumn,    /* L
1bc0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
1bd0: 6e 20 70 54 61 62 6c 65 4e 61 6d 65 20 74 6f 20  n pTableName to 
1be0: 69 6e 73 65 72 74 20 69 6e 74 6f 20 2a 2f 0a 20  insert into */. 
1bf0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1c00: 74 2c 20 20 20 2f 2a 20 54 68 65 20 56 41 4c 55  t,   /* The VALU
1c10: 45 20 63 6c 61 75 73 65 3a 20 61 20 6c 69 73 74  E clause: a list
1c20: 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 62 65   of values to be
1c30: 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 53   inserted */.  S
1c40: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
1c50: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
1c60: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 73 75  tatement that su
1c70: 70 70 6c 69 65 73 20 76 61 6c 75 65 73 20 2a 2f  pplies values */
1c80: 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20  .  int orconf   
1c90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1ca0: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
1cb0: 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 52   (OE_Abort, OE_R
1cc0: 65 70 6c 61 63 65 2c 20 65 74 63 2e 29 20 2a 2f  eplace, etc.) */
1cd0: 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65  .){.  TriggerSte
1ce0: 70 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 20  p *pTriggerStep 
1cf0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  = sqliteMalloc(s
1d00: 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 65  izeof(TriggerSte
1d10: 70 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67  p));.  if( pTrig
1d20: 67 65 72 53 74 65 70 3d 3d 30 20 29 20 72 65 74  gerStep==0 ) ret
1d30: 75 72 6e 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  urn 0;..  assert
1d40: 28 70 45 4c 69 73 74 20 3d 3d 20 30 20 7c 7c 20  (pEList == 0 || 
1d50: 70 53 65 6c 65 63 74 20 3d 3d 20 30 29 3b 0a 20  pSelect == 0);. 
1d60: 20 61 73 73 65 72 74 28 70 45 4c 69 73 74 20 21   assert(pEList !
1d70: 3d 20 30 20 7c 7c 20 70 53 65 6c 65 63 74 20 21  = 0 || pSelect !
1d80: 3d 20 30 29 3b 0a 0a 20 20 70 54 72 69 67 67 65  = 0);..  pTrigge
1d90: 72 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49  rStep->op = TK_I
1da0: 4e 53 45 52 54 3b 0a 20 20 70 54 72 69 67 67 65  NSERT;.  pTrigge
1db0: 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d  rStep->pSelect =
1dc0: 20 70 53 65 6c 65 63 74 3b 0a 20 20 70 54 72 69   pSelect;.  pTri
1dd0: 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74  ggerStep->target
1de0: 20 20 3d 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b    = *pTableName;
1df0: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
1e00: 3e 70 49 64 4c 69 73 74 20 3d 20 70 43 6f 6c 75  >pIdList = pColu
1e10: 6d 6e 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  mn;.  pTriggerSt
1e20: 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20  ep->pExprList = 
1e30: 70 45 4c 69 73 74 3b 0a 20 20 70 54 72 69 67 67  pEList;.  pTrigg
1e40: 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d  erStep->orconf =
1e50: 20 6f 72 63 6f 6e 66 3b 0a 0a 20 20 72 65 74 75   orconf;..  retu
1e60: 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b  rn pTriggerStep;
1e70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
1e80: 75 63 74 20 61 20 74 72 69 67 67 65 72 20 73 74  uct a trigger st
1e90: 65 70 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ep that implemen
1ea0: 74 73 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  ts an UPDATE sta
1eb0: 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72  tement and retur
1ec0: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
1ed0: 6f 20 74 68 61 74 20 74 72 69 67 67 65 72 20 73  o that trigger s
1ee0: 74 65 70 2e 20 20 54 68 65 20 70 61 72 73 65 72  tep.  The parser
1ef0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
1f00: 69 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73  ine when it.** s
1f10: 65 65 73 20 61 6e 20 55 50 44 41 54 45 20 73 74  ees an UPDATE st
1f20: 61 74 65 6d 65 6e 74 20 69 6e 73 69 64 65 20 74  atement inside t
1f30: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 43 52 45  he body of a CRE
1f40: 41 54 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a  ATE TRIGGER..*/.
1f50: 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c  TriggerStep *sql
1f60: 69 74 65 54 72 69 67 67 65 72 55 70 64 61 74 65  iteTriggerUpdate
1f70: 53 74 65 70 28 0a 20 20 54 6f 6b 65 6e 20 2a 70  Step(.  Token *p
1f80: 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20  TableName,   /* 
1f90: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
1fa0: 65 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  e to be updated 
1fb0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1fc0: 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20 54 68 65  EList,    /* The
1fd0: 20 53 45 54 20 63 6c 61 75 73 65 3a 20 6c 69 73   SET clause: lis
1fe0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  t of column and 
1ff0: 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  new values */.  
2000: 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
2010: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2020: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
2030: 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20  t orconf        
2040: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69     /* The confli
2050: 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f  ct algorithm. (O
2060: 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
2070: 72 65 2c 20 65 74 63 29 20 2a 2f 0a 29 7b 0a 20  re, etc) */.){. 
2080: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54   TriggerStep *pT
2090: 72 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c  riggerStep = sql
20a0: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
20b0: 28 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a  (TriggerStep));.
20c0: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
20d0: 65 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ep==0 ) return 0
20e0: 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  ;..  pTriggerSte
20f0: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 55 50 44 41 54  p->op = TK_UPDAT
2100: 45 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  E;.  pTriggerSte
2110: 70 2d 3e 74 61 72 67 65 74 20 20 3d 20 2a 70 54  p->target  = *pT
2120: 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 70 54 72 69  ableName;.  pTri
2130: 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c  ggerStep->pExprL
2140: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
2150: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57  pTriggerStep->pW
2160: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
2170: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f   pTriggerStep->o
2180: 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a  rconf = orconf;.
2190: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67  .  return pTrigg
21a0: 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erStep;.}../*.**
21b0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69   Construct a tri
21c0: 67 67 65 72 20 73 74 65 70 20 74 68 61 74 20 69  gger step that i
21d0: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 44 45 4c 45  mplements a DELE
21e0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  TE statement and
21f0: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
2200: 6e 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69  nter to that tri
2210: 67 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20  gger step.  The 
2220: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
2230: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69  s routine when i
2240: 74 0a 2a 2a 20 73 65 65 73 20 61 20 44 45 4c 45  t.** sees a DELE
2250: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73  TE statement ins
2260: 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20  ide the body of 
2270: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  a CREATE TRIGGER
2280: 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70  ..*/.TriggerStep
2290: 20 2a 73 71 6c 69 74 65 54 72 69 67 67 65 72 44   *sqliteTriggerD
22a0: 65 6c 65 74 65 53 74 65 70 28 54 6f 6b 65 6e 20  eleteStep(Token 
22b0: 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 45 78 70  *pTableName, Exp
22c0: 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 54 72  r *pWhere){.  Tr
22d0: 69 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67  iggerStep *pTrig
22e0: 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69 74 65  gerStep = sqlite
22f0: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72  Malloc(sizeof(Tr
2300: 69 67 67 65 72 53 74 65 70 29 29 3b 0a 20 20 69  iggerStep));.  i
2310: 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70 3d  f( pTriggerStep=
2320: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
2330: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
2340: 6f 70 20 3d 20 54 4b 5f 44 45 4c 45 54 45 3b 0a  op = TK_DELETE;.
2350: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
2360: 74 61 72 67 65 74 20 20 3d 20 2a 70 54 61 62 6c  target  = *pTabl
2370: 65 4e 61 6d 65 3b 0a 20 20 70 54 72 69 67 67 65  eName;.  pTrigge
2380: 72 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d 20  rStep->pWhere = 
2390: 70 57 68 65 72 65 3b 0a 20 20 70 54 72 69 67 67  pWhere;.  pTrigg
23a0: 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d  erStep->orconf =
23b0: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 0a 20 20   OE_Default;..  
23c0: 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53  return pTriggerS
23d0: 74 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52  tep;.}../* .** R
23e0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
23f0: 65 20 61 20 54 72 69 67 67 65 72 20 73 74 72 75  e a Trigger stru
2400: 63 74 75 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71  cture.*/.void sq
2410: 6c 69 74 65 44 65 6c 65 74 65 54 72 69 67 67 65  liteDeleteTrigge
2420: 72 28 54 72 69 67 67 65 72 20 2a 70 54 72 69 67  r(Trigger *pTrig
2430: 67 65 72 29 7b 0a 20 20 54 72 69 67 67 65 72 53  ger){.  TriggerS
2440: 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65  tep *pTriggerSte
2450: 70 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74  p;..  pTriggerSt
2460: 65 70 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 73  ep = pTrigger->s
2470: 74 65 70 5f 6c 69 73 74 3b 0a 20 20 77 68 69 6c  tep_list;.  whil
2480: 65 28 20 70 54 72 69 67 67 65 72 53 74 65 70 20  e( pTriggerStep 
2490: 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 53 74  ){.    TriggerSt
24a0: 65 70 20 2a 20 70 54 6d 70 20 3d 20 70 54 72 69  ep * pTmp = pTri
24b0: 67 67 65 72 53 74 65 70 3b 0a 20 20 20 20 70 54  ggerStep;.    pT
24c0: 72 69 67 67 65 72 53 74 65 70 20 3d 20 70 54 72  riggerStep = pTr
24d0: 69 67 67 65 72 53 74 65 70 2d 3e 70 4e 65 78 74  iggerStep->pNext
24e0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  ;..    sqliteExp
24f0: 72 44 65 6c 65 74 65 28 70 54 6d 70 2d 3e 70 57  rDelete(pTmp->pW
2500: 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
2510: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
2520: 70 54 6d 70 2d 3e 70 45 78 70 72 4c 69 73 74 29  pTmp->pExprList)
2530: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65  ;.    sqliteSele
2540: 63 74 44 65 6c 65 74 65 28 70 54 6d 70 2d 3e 70  ctDelete(pTmp->p
2550: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
2560: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
2570: 70 54 6d 70 2d 3e 70 49 64 4c 69 73 74 29 3b 0a  pTmp->pIdList);.
2580: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2590: 70 54 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  pTmp);.  }..  sq
25a0: 6c 69 74 65 46 72 65 65 28 70 54 72 69 67 67 65  liteFree(pTrigge
25b0: 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  r->name);.  sqli
25c0: 74 65 46 72 65 65 28 70 54 72 69 67 67 65 72 2d  teFree(pTrigger-
25d0: 3e 74 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  >table);.  sqlit
25e0: 65 45 78 70 72 44 65 6c 65 74 65 28 70 54 72 69  eExprDelete(pTri
25f0: 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b 0a 20 20  gger->pWhen);.  
2600: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
2610: 74 65 28 70 54 72 69 67 67 65 72 2d 3e 70 43 6f  te(pTrigger->pCo
2620: 6c 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65  lumns);.  sqlite
2630: 46 72 65 65 28 70 54 72 69 67 67 65 72 2d 3e 73  Free(pTrigger->s
2640: 74 72 69 6e 67 73 29 3b 0a 20 20 73 71 6c 69 74  trings);.  sqlit
2650: 65 46 72 65 65 28 70 54 72 69 67 67 65 72 29 3b  eFree(pTrigger);
2660: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 66  .}../*. * This f
2670: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2680: 64 20 74 6f 20 64 72 6f 70 20 61 20 74 72 69 67  d to drop a trig
2690: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ger from the dat
26a0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 0a 20  abase schema. . 
26b0: 2a 0a 20 2a 20 54 68 69 73 20 6d 61 79 20 62 65  *. * This may be
26c0: 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79   called directly
26d0: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
26e0: 2c 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  , or from within
26f0: 20 0a 20 2a 20 73 71 6c 69 74 65 44 72 6f 70 54   . * sqliteDropT
2700: 61 62 6c 65 28 29 2e 20 49 6e 20 74 68 65 20 6c  able(). In the l
2710: 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 22  atter case the "
2720: 6e 65 73 74 65 64 22 20 61 72 67 75 6d 65 6e 74  nested" argument
2730: 20 69 73 20 74 72 75 65 2e 0a 20 2a 0a 20 2a 20   is true.. *. * 
2740: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 66  Note that this f
2750: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2760: 20 64 65 6c 65 74 65 20 74 68 65 20 74 72 69 67   delete the trig
2770: 67 65 72 20 65 6e 74 69 72 65 6c 79 2e 20 49 6e  ger entirely. In
2780: 73 74 65 61 64 20 69 74 0a 20 2a 20 72 65 6d 6f  stead it. * remo
2790: 76 65 73 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ves it from the 
27a0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
27b0: 61 6e 64 20 70 6c 61 63 65 73 20 69 74 20 69 6e  and places it in
27c0: 20 74 68 65 20 74 72 69 67 44 72 6f 70 20 68 61   the trigDrop ha
27d0: 73 68 20 0a 20 2a 20 74 61 62 6c 65 2e 20 54 68  sh . * table. Th
27e0: 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 74 68  is is so that th
27f0: 65 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  e trigger can be
2800: 20 72 65 73 74 6f 72 65 64 20 69 6e 74 6f 20 74   restored into t
2810: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
2820: 6d 61 0a 20 2a 20 69 66 20 74 68 65 20 74 72 61  ma. * if the tra
2830: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
2840: 65 64 20 62 61 63 6b 2e 0a 20 2a 2f 0a 76 6f 69  ed back.. */.voi
2850: 64 20 73 71 6c 69 74 65 44 72 6f 70 54 72 69 67  d sqliteDropTrig
2860: 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
2870: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  e, Token *pName,
2880: 20 69 6e 74 20 6e 65 73 74 65 64 29 7b 0a 20 20   int nested){.  
2890: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54  char *zName;.  T
28a0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
28b0: 3b 0a 20 20 54 61 62 6c 65 20 20 20 2a 70 54 61  ;.  Table   *pTa
28c0: 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ble;.  Vdbe *v;.
28d0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
28e0: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
28f0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 0a 20  z, pName->n);.. 
2900: 20 2f 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   /* ensure that 
2910: 74 68 65 20 74 72 69 67 67 65 72 20 62 65 69 6e  the trigger bein
2920: 67 20 64 72 6f 70 70 65 64 20 65 78 69 73 74 73  g dropped exists
2930: 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d   */.  pTrigger =
2940: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
2950: 26 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 74 72  &(pParse->db->tr
2960: 69 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65 2c 20  igHash), zName, 
2970: 70 4e 61 6d 65 2d 3e 6e 20 2b 20 31 29 3b 20 0a  pName->n + 1); .
2980: 20 20 69 66 28 20 21 70 54 72 69 67 67 65 72 20    if( !pTrigger 
2990: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
29a0: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
29b0: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
29c0: 63 68 20 74 72 69 67 67 65 72 3a 20 22 2c 20 2d  ch trigger: ", -
29d0: 31 2c 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  1,.        zName
29e0: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  , -1, 0);.    sq
29f0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
2a00: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2a10: 0a 0a 20 20 2f 2a 0a 20 20 20 2a 20 49 66 20 74  ..  /*.   * If t
2a20: 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20 22 65  his is not an "e
2a30: 78 70 6c 61 69 6e 22 2c 20 74 68 65 6e 20 64 65  xplain", then de
2a40: 6c 65 74 65 20 74 68 65 20 74 72 69 67 67 65 72  lete the trigger
2a50: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 2a   structure..   *
2a60: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
2a70: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
2a80: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 46  pTable = sqliteF
2a90: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
2aa0: 3e 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 74  >db, pTrigger->t
2ab0: 61 62 6c 65 29 3b 0a 20 20 20 20 61 73 73 65 72  able);.    asser
2ac0: 74 28 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  t(pTable);.    i
2ad0: 66 28 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67  f( pTable->pTrig
2ae0: 67 65 72 20 3d 3d 20 70 54 72 69 67 67 65 72 20  ger == pTrigger 
2af0: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  ){.      pTable-
2b00: 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69  >pTrigger = pTri
2b10: 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
2b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 72   }else{.      Tr
2b30: 69 67 67 65 72 20 2a 63 63 20 3d 20 70 54 61 62  igger *cc = pTab
2b40: 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20  le->pTrigger;.  
2b50: 20 20 20 20 77 68 69 6c 65 28 20 63 63 20 29 7b      while( cc ){
2b60: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 63   .        if( cc
2b70: 2d 3e 70 4e 65 78 74 20 3d 3d 20 70 54 72 69 67  ->pNext == pTrig
2b80: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ger ){.         
2b90: 20 63 63 2d 3e 70 4e 65 78 74 20 3d 20 63 63 2d   cc->pNext = cc-
2ba0: 3e 70 4e 65 78 74 2d 3e 70 4e 65 78 74 3b 0a 20  >pNext->pNext;. 
2bb0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2bc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bd0: 20 20 63 63 20 3d 20 63 63 2d 3e 70 4e 65 78 74    cc = cc->pNext
2be0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bf0: 61 73 73 65 72 74 28 63 63 29 3b 0a 20 20 20 20  assert(cc);.    
2c00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  }.    sqliteHash
2c10: 49 6e 73 65 72 74 28 26 28 70 50 61 72 73 65 2d  Insert(&(pParse-
2c20: 3e 64 62 2d 3e 74 72 69 67 48 61 73 68 29 2c 20  >db->trigHash), 
2c30: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e 20  zName, pName->n 
2c40: 2b 20 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  + 1, NULL);.    
2c50: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 72 69 67  sqliteDeleteTrig
2c60: 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20  ger(pTrigger);. 
2c70: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
2c80: 65 20 63 6f 64 65 20 74 6f 20 64 65 73 74 72 6f  e code to destro
2c90: 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  y the database r
2ca0: 65 63 6f 72 64 20 6f 66 20 74 68 65 20 74 72 69  ecord of the tri
2cb0: 67 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gger..  */.  if(
2cc0: 20 70 54 61 62 6c 65 21 3d 30 20 26 26 20 21 6e   pTable!=0 && !n
2cd0: 65 73 74 65 64 20 26 26 20 28 76 20 3d 20 73 71  ested && (v = sq
2ce0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
2cf0: 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  se))!=0 ){.    i
2d00: 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 73 74 61  nt base;.    sta
2d10: 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 54  tic VdbeOp dropT
2d20: 72 69 67 67 65 72 5b 5d 20 3d 20 7b 0a 20 20 20  rigger[] = {.   
2d30: 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
2d40: 20 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20      0, ADDR(8), 
2d50: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
2d60: 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30  String,     0, 0
2d70: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  ,        0}, /* 
2d80: 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  1 */.      { OP_
2d90: 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31  MemStore,   1, 1
2da0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
2db0: 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c     { OP_MemLoad,
2dc0: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
2dd0: 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20   0}, /* 3 */.   
2de0: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20     { OP_Column, 
2df0: 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20      0, 1,       
2e00: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
2e10: 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Ne,         0, A
2e20: 44 44 52 28 37 29 2c 20 20 30 7d 2c 0a 20 20 20  DDR(7),  0},.   
2e30: 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
2e40: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
2e50: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
2e60: 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41  Next,       0, A
2e70: 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a 20  DDR(3),  0}, /* 
2e80: 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a 0a 20 20 20  7 */.    };..   
2e90: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
2ea0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
2eb0: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
2ec0: 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  eOpenMasterTable
2ed0: 28 76 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65  (v, pTable->isTe
2ee0: 6d 70 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20  mp);.    base = 
2ef0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
2f00: 69 73 74 28 76 2c 20 20 41 72 72 61 79 53 69 7a  ist(v,  ArraySiz
2f10: 65 28 64 72 6f 70 54 72 69 67 67 65 72 29 2c 20  e(dropTrigger), 
2f20: 64 72 6f 70 54 72 69 67 67 65 72 29 3b 0a 20 20  dropTrigger);.  
2f30: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
2f40: 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20  geP3(v, base+1, 
2f50: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69  zName, 0);.    i
2f60: 66 28 20 21 70 54 61 62 6c 65 2d 3e 69 73 54 65  f( !pTable->isTe
2f70: 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  mp ){.      sqli
2f80: 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  teChangeCookie(p
2f90: 50 61 72 73 65 2d 3e 64 62 2c 20 76 29 3b 0a 20  Parse->db, v);. 
2fa0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
2fb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
2fc0: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
2fd0: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
2fe0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
2ff0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 46  ;.  }..  sqliteF
3000: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ree(zName);.}../
3010: 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 74  *.** pEList is t
3020: 68 65 20 53 45 54 20 63 6c 61 75 73 65 20 6f 66  he SET clause of
3030: 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
3040: 6d 65 6e 74 2e 20 20 45 61 63 68 20 65 6e 74 72  ment.  Each entr
3050: 79 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 69  y.** in pEList i
3060: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 61 74 20  s of the format 
3070: 3c 69 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49 66  <id>=<expr>.  If
3080: 20 61 6e 79 20 6f 66 20 74 68 65 20 65 6e 74 72   any of the entr
3090: 69 65 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74  ies.** in pEList
30a0: 20 68 61 76 65 20 61 6e 20 3c 69 64 3e 20 77 68   have an <id> wh
30b0: 69 63 68 20 6d 61 74 63 68 65 73 20 61 6e 20 69  ich matches an i
30c0: 64 65 6e 74 69 66 69 65 72 20 69 6e 20 70 49 64  dentifier in pId
30d0: 4c 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  List,.** then re
30e0: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 70  turn TRUE.  If p
30f0: 49 64 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74 68  IdList==NULL, th
3100: 65 6e 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65  en it is conside
3110: 72 65 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61 72  red a.** wildcar
3120: 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  d that matches a
3130: 6e 79 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77 69  nything.  Likewi
3140: 73 65 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55  se if pEList==NU
3150: 4c 4c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d 61  LL then.** it ma
3160: 74 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20 73  tches anything s
3170: 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20  o always return 
3180: 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61  true.  Return fa
3190: 6c 73 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lse only.** if t
31a0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68  here is no match
31b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31c0: 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 4c  checkColumnOverL
31d0: 61 70 28 49 64 4c 69 73 74 20 2a 70 49 64 4c 69  ap(IdList *pIdLi
31e0: 73 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  st, ExprList *pE
31f0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b 0a  List){.  int e;.
3200: 20 20 69 66 28 20 21 70 49 64 4c 69 73 74 20 7c    if( !pIdList |
3210: 7c 20 21 70 45 4c 69 73 74 20 29 20 72 65 74 75  | !pEList ) retu
3220: 72 6e 20 31 3b 0a 20 20 66 6f 72 28 65 3d 30 3b  rn 1;.  for(e=0;
3230: 20 65 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   e<pEList->nExpr
3240: 3b 20 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; e++){.    if( 
3250: 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e 64 65  sqliteIdListInde
3260: 78 28 70 49 64 4c 69 73 74 2c 20 70 45 4c 69 73  x(pIdList, pELis
3270: 74 2d 3e 61 5b 65 5d 2e 7a 4e 61 6d 65 29 3e 3d  t->a[e].zName)>=
3280: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
3290: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 20 0a 7d  }.  return 0; .}
32a0: 0a 0a 2f 2a 20 41 20 67 6c 6f 62 61 6c 20 76 61  ../* A global va
32b0: 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 54  riable that is T
32c0: 52 55 45 20 69 66 20 77 65 20 73 68 6f 75 6c 64  RUE if we should
32d0: 20 61 6c 77 61 79 73 20 73 65 74 20 75 70 20 74   always set up t
32e0: 65 6d 70 20 74 61 62 6c 65 73 20 66 6f 72 0a 20  emp tables for. 
32f0: 2a 20 66 6f 72 20 74 72 69 67 67 65 72 73 2c 20  * for triggers, 
3300: 65 76 65 6e 20 69 66 20 74 68 65 72 65 20 61 72  even if there ar
3310: 65 20 6e 6f 20 74 72 69 67 67 65 72 73 20 74 6f  e no triggers to
3320: 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75   code. This is u
3330: 73 65 64 20 74 6f 20 74 65 73 74 20 0a 20 2a 20  sed to test . * 
3340: 68 6f 77 20 6d 75 63 68 20 6f 76 65 72 68 65 61  how much overhea
3350: 64 20 74 68 65 20 74 72 69 67 67 65 72 73 20 61  d the triggers a
3360: 6c 67 6f 72 69 74 68 6d 20 69 73 20 63 61 75 73  lgorithm is caus
3370: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 54 68 69 73 20  ing.. *. * This 
3380: 66 6c 61 67 20 63 61 6e 20 62 65 20 73 65 74 20  flag can be set 
3390: 6f 72 20 63 6c 65 61 72 65 64 20 75 73 69 6e 67  or cleared using
33a0: 20 74 68 65 20 22 74 72 69 67 67 65 72 5f 6f 76   the "trigger_ov
33b0: 65 72 68 65 61 64 5f 74 65 73 74 22 20 70 72 61  erhead_test" pra
33c0: 67 6d 61 2e 0a 20 2a 20 54 68 65 20 70 72 61 67  gma.. * The prag
33d0: 6d 61 20 69 73 20 6e 6f 74 20 64 6f 63 75 6d 65  ma is not docume
33e0: 6e 74 65 64 20 73 69 6e 63 65 20 69 74 20 69 73  nted since it is
33f0: 20 6e 6f 74 20 72 65 61 6c 6c 79 20 70 61 72 74   not really part
3400: 20 6f 66 20 74 68 65 20 69 6e 74 65 72 66 61 63   of the interfac
3410: 65 0a 20 2a 20 74 6f 20 53 51 4c 69 74 65 2c 20  e. * to SQLite, 
3420: 6a 75 73 74 20 74 68 65 20 74 65 73 74 20 70 72  just the test pr
3430: 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ocedure..*/.int 
3440: 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72 69 67  always_code_trig
3450: 67 65 72 5f 73 65 74 75 70 20 3d 20 30 3b 0a 0a  ger_setup = 0;..
3460: 2f 2a 0a 20 2a 20 52 65 74 75 72 6e 73 20 74 72  /*. * Returns tr
3470: 75 65 20 69 66 20 61 20 74 72 69 67 67 65 72 20  ue if a trigger 
3480: 6d 61 74 63 68 69 6e 67 20 6f 70 2c 20 74 72 5f  matching op, tr_
3490: 74 6d 20 61 6e 64 20 66 6f 72 65 61 63 68 20 74  tm and foreach t
34a0: 68 61 74 20 69 73 20 4e 4f 54 20 61 6c 72 65 61  hat is NOT alrea
34b0: 64 79 0a 20 2a 20 6f 6e 20 74 68 65 20 50 61 72  dy. * on the Par
34c0: 73 65 20 6f 62 6a 65 63 74 73 20 74 72 69 67 67  se objects trigg
34d0: 65 72 2d 73 74 61 63 6b 20 28 74 6f 20 70 72 65  er-stack (to pre
34e0: 76 65 6e 74 20 72 65 63 75 72 73 69 76 65 20 74  vent recursive t
34f0: 72 69 67 67 65 72 20 66 69 72 69 6e 67 29 20 69  rigger firing) i
3500: 73 0a 20 2a 20 66 6f 75 6e 64 20 69 6e 20 74 68  s. * found in th
3510: 65 20 6c 69 73 74 20 73 70 65 63 69 66 69 65 64  e list specified
3520: 20 61 73 20 70 54 72 69 67 67 65 72 2e 0a 20 2a   as pTrigger.. *
3530: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 54 72 69 67  /.int sqliteTrig
3540: 67 65 72 73 45 78 69 73 74 28 0a 20 20 50 61 72  gersExist(.  Par
3550: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3560: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
3570: 63 68 65 63 6b 20 66 6f 72 20 72 65 63 75 72 73  check for recurs
3580: 69 76 65 20 74 72 69 67 67 65 72 73 20 2a 2f 0a  ive triggers */.
3590: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
35a0: 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 41 20 6c  ger,      /* A l
35b0: 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73 20  ist of triggers 
35c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
35d0: 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  a table */.  int
35e0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
35f0: 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66 20 54       /* one of T
3600: 4b 5f 44 45 4c 45 54 45 2c 20 54 4b 5f 49 4e 53  K_DELETE, TK_INS
3610: 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 20 2a  ERT, TK_UPDATE *
3620: 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20  /.  int tr_tm,  
3630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
3640: 6e 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c  ne of TK_BEFORE,
3650: 20 54 4b 5f 41 46 54 45 52 20 2a 2f 0a 20 20 69   TK_AFTER */.  i
3660: 6e 74 20 66 6f 72 65 61 63 68 2c 20 20 20 20 20  nt foreach,     
3670: 20 20 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66         /* one of
3680: 20 54 4b 5f 52 4f 57 20 6f 72 20 54 4b 5f 53 54   TK_ROW or TK_ST
3690: 41 54 45 4d 45 4e 54 20 2a 2f 0a 20 20 45 78 70  ATEMENT */.  Exp
36a0: 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 20  rList *pChanges 
36b0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20       /* Columns 
36c0: 74 68 61 74 20 63 68 61 6e 67 65 20 69 6e 20 61  that change in a
36d0: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
36e0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  nt */.){.  Trigg
36f0: 65 72 20 2a 20 70 54 72 69 67 67 65 72 43 75 72  er * pTriggerCur
3700: 73 6f 72 3b 0a 0a 20 20 69 66 28 20 61 6c 77 61  sor;..  if( alwa
3710: 79 73 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f  ys_code_trigger_
3720: 73 65 74 75 70 20 29 7b 0a 20 20 20 20 72 65 74  setup ){.    ret
3730: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 70 54  urn 1;.  }..  pT
3740: 72 69 67 67 65 72 43 75 72 73 6f 72 20 3d 20 70  riggerCursor = p
3750: 54 72 69 67 67 65 72 3b 0a 20 20 77 68 69 6c 65  Trigger;.  while
3760: 28 20 70 54 72 69 67 67 65 72 43 75 72 73 6f 72  ( pTriggerCursor
3770: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 72 69   ){.    if( pTri
3780: 67 67 65 72 43 75 72 73 6f 72 2d 3e 6f 70 20 3d  ggerCursor->op =
3790: 3d 20 6f 70 20 26 26 20 0a 09 70 54 72 69 67 67  = op && ..pTrigg
37a0: 65 72 43 75 72 73 6f 72 2d 3e 74 72 5f 74 6d 20  erCursor->tr_tm 
37b0: 3d 3d 20 74 72 5f 74 6d 20 26 26 20 0a 09 70 54  == tr_tm && ..pT
37c0: 72 69 67 67 65 72 43 75 72 73 6f 72 2d 3e 66 6f  riggerCursor->fo
37d0: 72 65 61 63 68 20 3d 3d 20 66 6f 72 65 61 63 68  reach == foreach
37e0: 20 26 26 0a 09 63 68 65 63 6b 43 6f 6c 75 6d 6e   &&..checkColumn
37f0: 4f 76 65 72 4c 61 70 28 70 54 72 69 67 67 65 72  OverLap(pTrigger
3800: 43 75 72 73 6f 72 2d 3e 70 43 6f 6c 75 6d 6e 73  Cursor->pColumns
3810: 2c 20 70 43 68 61 6e 67 65 73 29 20 29 7b 0a 20  , pChanges) ){. 
3820: 20 20 20 20 20 54 72 69 67 67 65 72 53 74 61 63       TriggerStac
3830: 6b 20 2a 20 73 73 3b 0a 20 20 20 20 20 20 73 73  k * ss;.      ss
3840: 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53   = pParse->trigS
3850: 74 61 63 6b 3b 0a 20 20 20 20 20 20 77 68 69 6c  tack;.      whil
3860: 65 28 20 73 73 20 26 26 20 73 73 2d 3e 70 54 72  e( ss && ss->pTr
3870: 69 67 67 65 72 20 21 3d 20 70 54 72 69 67 67 65  igger != pTrigge
3880: 72 20 29 7b 0a 09 73 73 20 3d 20 73 73 2d 3e 70  r ){..ss = ss->p
3890: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
38a0: 20 20 20 20 69 66 28 20 21 73 73 20 29 72 65 74      if( !ss )ret
38b0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
38c0: 20 70 54 72 69 67 67 65 72 43 75 72 73 6f 72 20   pTriggerCursor 
38d0: 3d 20 70 54 72 69 67 67 65 72 43 75 72 73 6f 72  = pTriggerCursor
38e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  ->pNext;.  }..  
38f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3900: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
3910: 20 63 6f 64 65 20 66 6f 72 20 7a 65 72 6f 20 6f   code for zero o
3920: 72 20 6d 6f 72 65 20 73 74 61 74 65 6d 65 6e 74  r more statement
3930: 73 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64  s inside the bod
3940: 79 20 6f 66 20 61 0a 2a 2a 20 74 72 69 67 67 65  y of a.** trigge
3950: 72 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  r.  .*/.static i
3960: 6e 74 20 63 6f 64 65 54 72 69 67 67 65 72 50 72  nt codeTriggerPr
3970: 6f 67 72 61 6d 28 0a 20 20 50 61 72 73 65 20 2a  ogram(.  Parse *
3980: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3990: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
39a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72   context */.  Tr
39b0: 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65 70  iggerStep *pStep
39c0: 4c 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20  List,   /* List 
39d0: 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  of statements in
39e0: 73 69 64 65 20 74 68 65 20 74 72 69 67 67 65 72  side the trigger
39f0: 20 62 6f 64 79 20 2a 2f 0a 20 20 69 6e 74 20 6f   body */.  int o
3a00: 72 63 6f 6e 66 69 6e 20 20 20 20 20 20 20 20 20  rconfin         
3a10: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
3a20: 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45 5f   algorithm. (OE_
3a30: 41 62 6f 72 74 2c 20 65 74 63 29 20 2a 2f 20 20  Abort, etc) */  
3a40: 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65  .){.  TriggerSte
3a50: 70 20 2a 20 70 54 72 69 67 67 65 72 53 74 65 70  p * pTriggerStep
3a60: 20 3d 20 70 53 74 65 70 4c 69 73 74 3b 0a 20 20   = pStepList;.  
3a70: 69 6e 74 20 6f 72 63 6f 6e 66 3b 0a 0a 20 20 77  int orconf;..  w
3a80: 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 53 74  hile( pTriggerSt
3a90: 65 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 61  ep ){.    int sa
3aa0: 76 65 4e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  veNTab = pParse-
3ab0: 3e 6e 54 61 62 3b 0a 20 20 20 20 6f 72 63 6f 6e  >nTab;.    orcon
3ac0: 66 20 3d 20 28 6f 72 63 6f 6e 66 69 6e 20 3d 3d  f = (orconfin ==
3ad0: 20 4f 45 5f 44 65 66 61 75 6c 74 29 3f 70 54 72   OE_Default)?pTr
3ae0: 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e  iggerStep->orcon
3af0: 66 3a 6f 72 63 6f 6e 66 69 6e 3b 0a 20 20 20 20  f:orconfin;.    
3b00: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
3b10: 6b 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f  k->orconf = orco
3b20: 6e 66 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  nf;.    switch( 
3b30: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70  pTriggerStep->op
3b40: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54   ){.      case T
3b50: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 09 53 65 6c  K_SELECT: {..Sel
3b60: 65 63 74 20 2a 20 73 73 20 3d 20 73 71 6c 69 74  ect * ss = sqlit
3b70: 65 53 65 6c 65 63 74 44 75 70 28 70 54 72 69 67  eSelectDup(pTrig
3b80: 67 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74  gerStep->pSelect
3b90: 29 3b 09 09 20 20 0a 09 61 73 73 65 72 74 28 73  );..  ..assert(s
3ba0: 73 29 3b 0a 09 61 73 73 65 72 74 28 73 73 2d 3e  s);..assert(ss->
3bb0: 70 53 72 63 29 3b 0a 09 73 71 6c 69 74 65 53 65  pSrc);..sqliteSe
3bc0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 73 73 2c  lect(pParse, ss,
3bd0: 20 53 52 54 5f 44 69 73 63 61 72 64 2c 20 30 2c   SRT_Discard, 0,
3be0: 20 30 2c 20 30 2c 20 30 29 3b 0a 09 73 71 6c 69   0, 0, 0);..sqli
3bf0: 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73  teSelectDelete(s
3c00: 73 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  s);..break;.    
3c10: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54    }.      case T
3c20: 4b 5f 55 50 44 41 54 45 3a 20 7b 0a 20 20 20 20  K_UPDATE: {.    
3c30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3c40: 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62  dOp(pParse->pVdb
3c50: 65 2c 20 4f 50 5f 4c 69 73 74 50 75 73 68 2c 20  e, OP_ListPush, 
3c60: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
3c70: 71 6c 69 74 65 55 70 64 61 74 65 28 70 50 61 72  qliteUpdate(pPar
3c80: 73 65 2c 20 26 70 54 72 69 67 67 65 72 53 74 65  se, &pTriggerSte
3c90: 70 2d 3e 74 61 72 67 65 74 2c 20 0a 09 09 73 71  p->target, ...sq
3ca0: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
3cb0: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 45  pTriggerStep->pE
3cc0: 78 70 72 4c 69 73 74 29 2c 20 0a 09 09 73 71 6c  xprList), ...sql
3cd0: 69 74 65 45 78 70 72 44 75 70 28 70 54 72 69 67  iteExprDup(pTrig
3ce0: 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65 29  gerStep->pWhere)
3cf0: 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 20 20 20  , orconf);.     
3d00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3d10: 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  Op(pParse->pVdbe
3d20: 2c 20 4f 50 5f 4c 69 73 74 50 6f 70 2c 20 30 2c  , OP_ListPop, 0,
3d30: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
3d40: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3d50: 20 20 63 61 73 65 20 54 4b 5f 49 4e 53 45 52 54    case TK_INSERT
3d60: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
3d70: 74 65 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c  teInsert(pParse,
3d80: 20 26 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e   &pTriggerStep->
3d90: 74 61 72 67 65 74 2c 20 0a 20 20 20 20 20 20 20  target, .       
3da0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
3db0: 75 70 28 70 54 72 69 67 67 65 72 53 74 65 70 2d  up(pTriggerStep-
3dc0: 3e 70 45 78 70 72 4c 69 73 74 29 2c 20 0a 20 20  >pExprList), .  
3dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65        sqliteSele
3de0: 63 74 44 75 70 28 70 54 72 69 67 67 65 72 53 74  ctDup(pTriggerSt
3df0: 65 70 2d 3e 70 53 65 6c 65 63 74 29 2c 20 0a 20  ep->pSelect), . 
3e00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c         sqliteIdL
3e10: 69 73 74 44 75 70 28 70 54 72 69 67 67 65 72 53  istDup(pTriggerS
3e20: 74 65 70 2d 3e 70 49 64 4c 69 73 74 29 2c 20 6f  tep->pIdList), o
3e30: 72 63 6f 6e 66 29 3b 0a 20 20 20 20 20 20 20 20  rconf);.        
3e40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3e50: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 44 45 4c       case TK_DEL
3e60: 45 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ETE: {.        s
3e70: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 70  qliteVdbeAddOp(p
3e80: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
3e90: 5f 4c 69 73 74 50 75 73 68 2c 20 30 2c 20 30 29  _ListPush, 0, 0)
3ea0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3eb0: 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73  DeleteFrom(pPars
3ec0: 65 2c 20 26 70 54 72 69 67 67 65 72 53 74 65 70  e, &pTriggerStep
3ed0: 2d 3e 74 61 72 67 65 74 2c 20 0a 09 20 20 20 20  ->target, ..    
3ee0: 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 54  sqliteExprDup(pT
3ef0: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57 68 65  riggerStep->pWhe
3f00: 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  re));.        sq
3f10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 70 50  liteVdbeAddOp(pP
3f20: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
3f30: 4c 69 73 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a  ListPop, 0, 0);.
3f40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
3f60: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73  ault:.        as
3f70: 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 20 0a  sert(0);.    } .
3f80: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
3f90: 20 3d 20 73 61 76 65 4e 54 61 62 3b 0a 20 20 20   = saveNTab;.   
3fa0: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20   pTriggerStep = 
3fb0: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 4e  pTriggerStep->pN
3fc0: 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ext;.  }..  retu
3fd0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
3fe0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  his is called to
3ff0: 20 63 6f 64 65 20 46 4f 52 20 45 41 43 48 20 52   code FOR EACH R
4000: 4f 57 20 74 72 69 67 67 65 72 73 2e 0a 2a 2a 0a  OW triggers..**.
4010: 2a 2a 20 57 68 65 6e 20 74 68 65 20 63 6f 64 65  ** When the code
4020: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
4030: 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 69 73  ion generates is
4040: 20 65 78 65 63 75 74 65 64 2c 20 74 68 65 20 66   executed, the f
4050: 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 6d 75 73  ollowing .** mus
4060: 74 20 62 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a  t be true:.**.**
4070: 20 31 2e 20 4e 6f 20 63 75 72 73 6f 72 73 20 6d   1. No cursors m
4080: 61 79 20 62 65 20 6f 70 65 6e 20 69 6e 20 74 68  ay be open in th
4090: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e  e main database.
40a0: 20 20 28 42 75 74 20 6e 65 77 49 64 78 20 61 6e    (But newIdx an
40b0: 64 20 6f 6c 64 49 64 78 0a 2a 2a 20 20 20 20 63  d oldIdx.**    c
40c0: 61 6e 20 62 65 20 69 6e 64 69 63 65 73 20 6f 66  an be indices of
40d0: 20 63 75 72 73 6f 72 73 20 69 6e 20 74 65 6d 70   cursors in temp
40e0: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 53  orary tables.  S
40f0: 65 65 20 62 65 6c 6f 77 2e 29 0a 2a 2a 0a 2a 2a  ee below.).**.**
4100: 20 32 2e 20 49 66 20 74 68 65 20 74 72 69 67 67   2. If the trigg
4110: 65 72 73 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ers being coded 
4120: 61 72 65 20 4f 4e 20 49 4e 53 45 52 54 20 6f 72  are ON INSERT or
4130: 20 4f 4e 20 55 50 44 41 54 45 20 74 72 69 67 67   ON UPDATE trigg
4140: 65 72 73 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20  ers, then.**    
4150: 61 20 74 65 6d 70 6f 72 61 72 79 20 76 64 62 65  a temporary vdbe
4160: 20 63 75 72 73 6f 72 20 28 69 6e 64 65 78 20 6e   cursor (index n
4170: 65 77 49 64 78 29 20 6d 75 73 74 20 62 65 20 6f  ewIdx) must be o
4180: 70 65 6e 20 61 6e 64 20 70 6f 69 6e 74 69 6e 67  pen and pointing
4190: 20 61 74 0a 2a 2a 20 20 20 20 61 20 72 6f 77 20   at.**    a row 
41a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 6c 75 65  containing value
41b0: 73 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  s to be substitu
41c0: 74 65 64 20 66 6f 72 20 6e 65 77 2e 2a 20 65 78  ted for new.* ex
41d0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
41e0: 0a 2a 2a 20 20 20 20 74 72 69 67 67 65 72 20 70  .**    trigger p
41f0: 72 6f 67 72 61 6d 28 73 29 2e 0a 2a 2a 0a 2a 2a  rogram(s)..**.**
4200: 20 33 2e 20 49 66 20 74 68 65 20 74 72 69 67 67   3. If the trigg
4210: 65 72 73 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ers being coded 
4220: 61 72 65 20 4f 4e 20 44 45 4c 45 54 45 20 6f 72  are ON DELETE or
4230: 20 4f 4e 20 55 50 44 41 54 45 20 74 72 69 67 67   ON UPDATE trigg
4240: 65 72 73 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20  ers, then.**    
4250: 61 20 74 65 6d 70 6f 72 61 72 79 20 76 64 62 65  a temporary vdbe
4260: 20 63 75 72 73 6f 72 20 28 69 6e 64 65 78 20 6f   cursor (index o
4270: 6c 64 49 64 78 29 20 6d 75 73 74 20 62 65 20 6f  ldIdx) must be o
4280: 70 65 6e 20 61 6e 64 20 70 6f 69 6e 74 69 6e 67  pen and pointing
4290: 20 61 74 0a 2a 2a 20 20 20 20 61 20 72 6f 77 20   at.**    a row 
42a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 6c 75 65  containing value
42b0: 73 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  s to be substitu
42c0: 74 65 64 20 66 6f 72 20 6f 6c 64 2e 2a 20 65 78  ted for old.* ex
42d0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
42e0: 0a 2a 2a 20 20 20 20 74 72 69 67 67 65 72 20 70  .**    trigger p
42f0: 72 6f 67 72 61 6d 28 73 29 2e 0a 2a 2a 0a 2a 2f  rogram(s)..**.*/
4300: 0a 69 6e 74 20 73 71 6c 69 74 65 43 6f 64 65 52  .int sqliteCodeR
4310: 6f 77 54 72 69 67 67 65 72 28 0a 20 20 50 61 72  owTrigger(.  Par
4320: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4330: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
4340: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4360: 4f 6e 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45  One of TK_UPDATE
4370: 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f  , TK_INSERT, TK_
4380: 44 45 4c 45 54 45 20 2a 2f 0a 20 20 45 78 70 72  DELETE */.  Expr
4390: 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20  List *pChanges, 
43a0: 20 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74   /* Changes list
43b0: 20 66 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20   for any UPDATE 
43c0: 4f 46 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20  OF triggers */. 
43d0: 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20 20   int tr_tm,     
43e0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
43f0: 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b 5f 41 46  TK_BEFORE, TK_AF
4400: 54 45 52 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  TER */.  Table *
4410: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  pTab,         /*
4420: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 63 6f   The table to co
4430: 64 65 20 74 72 69 67 67 65 72 73 20 66 72 6f 6d  de triggers from
4440: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 49 64 78   */.  int newIdx
4450: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
4460: 65 20 69 6e 64 69 63 65 20 6f 66 20 74 68 65 20  e indice of the 
4470: 22 6e 65 77 22 20 72 6f 77 20 74 6f 20 61 63 63  "new" row to acc
4480: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 6c 64  ess */.  int old
4490: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx,          /*
44a0: 20 54 68 65 20 69 6e 64 69 63 65 20 6f 66 20 74   The indice of t
44b0: 68 65 20 22 6f 6c 64 22 20 72 6f 77 20 74 6f 20  he "old" row to 
44c0: 61 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  access */.  int 
44d0: 6f 72 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20  orconf,         
44e0: 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   /* ON CONFLICT 
44f0: 70 6f 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20  policy */.  int 
4500: 69 67 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20 20  ignoreJump      
4510: 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20   /* Instruction 
4520: 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52  to jump to for R
4530: 41 49 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a  AISE(IGNORE) */.
4540: 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 20 70  ){.  Trigger * p
4550: 54 72 69 67 67 65 72 3b 0a 20 20 54 72 69 67 67  Trigger;.  Trigg
4560: 65 72 53 74 61 63 6b 20 2a 20 70 54 72 69 67 67  erStack * pTrigg
4570: 65 72 53 74 61 63 6b 3b 0a 0a 20 20 61 73 73 65  erStack;..  asse
4580: 72 74 28 6f 70 20 3d 3d 20 54 4b 5f 55 50 44 41  rt(op == TK_UPDA
4590: 54 45 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 49  TE || op == TK_I
45a0: 4e 53 45 52 54 20 7c 7c 20 6f 70 20 3d 3d 20 54  NSERT || op == T
45b0: 4b 5f 44 45 4c 45 54 45 29 3b 0a 20 20 61 73 73  K_DELETE);.  ass
45c0: 65 72 74 28 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f  ert(tr_tm == TK_
45d0: 42 45 46 4f 52 45 20 7c 7c 20 74 72 5f 74 6d 20  BEFORE || tr_tm 
45e0: 3d 3d 20 54 4b 5f 41 46 54 45 52 29 3b 0a 0a 20  == TK_AFTER);.. 
45f0: 20 61 73 73 65 72 74 28 6e 65 77 49 64 78 20 21   assert(newIdx !
4600: 3d 20 2d 31 20 7c 7c 20 6f 6c 64 49 64 78 20 21  = -1 || oldIdx !
4610: 3d 20 2d 31 29 3b 0a 0a 20 20 70 54 72 69 67 67  = -1);..  pTrigg
4620: 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67  er = pTab->pTrig
4630: 67 65 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 54  ger;.  while( pT
4640: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 69 6e  rigger ){.    in
4650: 74 20 66 69 72 65 5f 74 68 69 73 20 3d 20 30 3b  t fire_this = 0;
4660: 0a 0a 20 20 20 20 2f 2a 20 64 65 74 65 72 6d 69  ..    /* determi
4670: 6e 65 20 77 68 65 74 68 65 72 20 77 65 20 73 68  ne whether we sh
4680: 6f 75 6c 64 20 63 6f 64 65 20 74 68 69 73 20 74  ould code this t
4690: 72 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  rigger */.    if
46a0: 28 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 20 3d  ( pTrigger->op =
46b0: 3d 20 6f 70 20 26 26 20 70 54 72 69 67 67 65 72  = op && pTrigger
46c0: 2d 3e 74 72 5f 74 6d 20 3d 3d 20 74 72 5f 74 6d  ->tr_tm == tr_tm
46d0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 54 72   && .        pTr
46e0: 69 67 67 65 72 2d 3e 66 6f 72 65 61 63 68 20 3d  igger->foreach =
46f0: 3d 20 54 4b 5f 52 4f 57 20 29 7b 0a 20 20 20 20  = TK_ROW ){.    
4700: 20 20 66 69 72 65 5f 74 68 69 73 20 3d 20 31 3b    fire_this = 1;
4710: 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 53  .      pTriggerS
4720: 74 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74  tack = pParse->t
4730: 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20  rigStack;.      
4740: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 53  while( pTriggerS
4750: 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  tack ){.        
4760: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63  if( pTriggerStac
4770: 6b 2d 3e 70 54 72 69 67 67 65 72 20 3d 3d 20 70  k->pTrigger == p
4780: 54 72 69 67 67 65 72 20 29 7b 0a 09 20 20 66 69  Trigger ){..  fi
4790: 72 65 5f 74 68 69 73 20 3d 20 30 3b 0a 09 7d 0a  re_this = 0;..}.
47a0: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
47b0: 53 74 61 63 6b 20 3d 20 70 54 72 69 67 67 65 72  Stack = pTrigger
47c0: 53 74 61 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  Stack->pNext;.  
47d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
47e0: 6f 70 20 3d 3d 20 54 4b 5f 55 50 44 41 54 45 20  op == TK_UPDATE 
47f0: 26 26 20 70 54 72 69 67 67 65 72 2d 3e 70 43 6f  && pTrigger->pCo
4800: 6c 75 6d 6e 73 20 26 26 0a 20 20 20 20 20 20 20  lumns &&.       
4810: 20 20 20 21 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f     !checkColumnO
4820: 76 65 72 4c 61 70 28 70 54 72 69 67 67 65 72 2d  verLap(pTrigger-
4830: 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70 43 68 61 6e  >pColumns, pChan
4840: 67 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ges) ){.        
4850: 66 69 72 65 5f 74 68 69 73 20 3d 20 30 3b 0a 20  fire_this = 0;. 
4860: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
4870: 20 20 69 66 28 20 66 69 72 65 5f 74 68 69 73 20    if( fire_this 
4880: 26 26 20 28 70 54 72 69 67 67 65 72 53 74 61 63  && (pTriggerStac
4890: 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  k = sqliteMalloc
48a0: 28 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53  (sizeof(TriggerS
48b0: 74 61 63 6b 29 29 29 21 3d 30 20 29 7b 0a 20 20  tack)))!=0 ){.  
48c0: 20 20 20 20 69 6e 74 20 65 6e 64 54 72 69 67 67      int endTrigg
48d0: 65 72 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73  er;.      SrcLis
48e0: 74 20 64 75 6d 6d 79 54 61 62 6c 69 73 74 3b 0a  t dummyTablist;.
48f0: 20 20 20 20 20 20 45 78 70 72 20 2a 20 77 68 65        Expr * whe
4900: 6e 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 64 75  nExpr;..      du
4910: 6d 6d 79 54 61 62 6c 69 73 74 2e 6e 53 72 63 20  mmyTablist.nSrc 
4920: 3d 20 30 3b 0a 20 20 20 20 20 20 64 75 6d 6d 79  = 0;.      dummy
4930: 54 61 62 6c 69 73 74 2e 61 20 3d 20 30 3b 0a 0a  Tablist.a = 0;..
4940: 20 20 20 20 20 20 2f 2a 20 50 75 73 68 20 61 6e        /* Push an
4950: 20 65 6e 74 72 79 20 6f 6e 20 74 6f 20 74 68 65   entry on to the
4960: 20 74 72 69 67 67 65 72 20 73 74 61 63 6b 20 2a   trigger stack *
4970: 2f 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  /.      pTrigger
4980: 53 74 61 63 6b 2d 3e 70 54 72 69 67 67 65 72 20  Stack->pTrigger 
4990: 3d 20 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  = pTrigger;.    
49a0: 20 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d    pTriggerStack-
49b0: 3e 6e 65 77 49 64 78 20 3d 20 6e 65 77 49 64 78  >newIdx = newIdx
49c0: 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
49d0: 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 3d 20  Stack->oldIdx = 
49e0: 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 70 54  oldIdx;.      pT
49f0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
4a00: 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
4a10: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
4a20: 4e 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 74  Next = pParse->t
4a30: 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20  rigStack;.      
4a40: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 69  pTriggerStack->i
4a50: 67 6e 6f 72 65 4a 75 6d 70 20 3d 20 69 67 6e 6f  gnoreJump = igno
4a60: 72 65 4a 75 6d 70 3b 0a 20 20 20 20 20 20 70 50  reJump;.      pP
4a70: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
4a80: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 3b  = pTriggerStack;
4a90: 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6f 64 65 20  ..      /* code 
4aa0: 74 68 65 20 57 48 45 4e 20 63 6c 61 75 73 65 20  the WHEN clause 
4ab0: 2a 2f 0a 20 20 20 20 20 20 65 6e 64 54 72 69 67  */.      endTrig
4ac0: 67 65 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ger = sqliteVdbe
4ad0: 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
4ae0: 2d 3e 70 56 64 62 65 29 3b 0a 20 20 20 20 20 20  ->pVdbe);.      
4af0: 77 68 65 6e 45 78 70 72 20 3d 20 73 71 6c 69 74  whenExpr = sqlit
4b00: 65 45 78 70 72 44 75 70 28 70 54 72 69 67 67 65  eExprDup(pTrigge
4b10: 72 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 20 20 20  r->pWhen);.     
4b20: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
4b30: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
4b40: 2c 20 30 2c 20 26 64 75 6d 6d 79 54 61 62 6c 69  , 0, &dummyTabli
4b50: 73 74 2c 20 30 2c 20 77 68 65 6e 45 78 70 72 29  st, 0, whenExpr)
4b60: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
4b70: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20  se->trigStack = 
4b80: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
4b90: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
4ba0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 72    sqliteFree(pTr
4bb0: 69 67 67 65 72 53 74 61 63 6b 29 3b 0a 20 20 20  iggerStack);.   
4bc0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
4bd0: 65 6c 65 74 65 28 77 68 65 6e 45 78 70 72 29 3b  elete(whenExpr);
4be0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4bf0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
4c00: 20 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c   sqliteExprIfFal
4c10: 73 65 28 70 50 61 72 73 65 2c 20 77 68 65 6e 45  se(pParse, whenE
4c20: 78 70 72 2c 20 65 6e 64 54 72 69 67 67 65 72 2c  xpr, endTrigger,
4c30: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
4c40: 65 45 78 70 72 44 65 6c 65 74 65 28 77 68 65 6e  eExprDelete(when
4c50: 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 63 6f  Expr);..      co
4c60: 64 65 54 72 69 67 67 65 72 50 72 6f 67 72 61 6d  deTriggerProgram
4c70: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
4c80: 72 2d 3e 73 74 65 70 5f 6c 69 73 74 2c 20 6f 72  r->step_list, or
4c90: 63 6f 6e 66 29 3b 20 0a 0a 20 20 20 20 20 20 2f  conf); ..      /
4ca0: 2a 20 50 6f 70 20 74 68 65 20 65 6e 74 72 79 20  * Pop the entry 
4cb0: 6f 66 66 20 74 68 65 20 74 72 69 67 67 65 72 20  off the trigger 
4cc0: 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 70  stack */.      p
4cd0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
4ce0: 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53   = pParse->trigS
4cf0: 74 61 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  tack->pNext;.   
4d00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
4d10: 72 69 67 67 65 72 53 74 61 63 6b 29 3b 0a 0a 20  riggerStack);.. 
4d20: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
4d30: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 70 50 61 72  esolveLabel(pPar
4d40: 73 65 2d 3e 70 56 64 62 65 2c 20 65 6e 64 54 72  se->pVdbe, endTr
4d50: 69 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  igger);.    }.  
4d60: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
4d70: 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
4d80: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
4d90: 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 66 75 6e  ../*. * This fun
4da0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
4db0: 74 6f 20 63 6f 64 65 20 4f 4e 20 55 50 44 41 54  to code ON UPDAT
4dc0: 45 20 61 6e 64 20 4f 4e 20 44 45 4c 45 54 45 20  E and ON DELETE 
4dd0: 74 72 69 67 67 65 72 73 20 6f 6e 20 0a 20 2a 20  triggers on . * 
4de0: 76 69 65 77 73 2e 20 0a 20 2a 0a 20 2a 20 54 68  views. . *. * Th
4df0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 6c 65  is function dele
4e00: 74 65 73 20 74 68 65 20 64 61 74 61 20 70 6f 69  tes the data poi
4e10: 6e 74 65 64 20 61 74 20 62 79 20 74 68 65 20 70  nted at by the p
4e20: 57 68 65 72 65 20 61 6e 64 20 70 43 68 61 6e 67  Where and pChang
4e30: 65 73 0a 20 2a 20 61 72 67 75 6d 65 6e 74 73 20  es. * arguments 
4e40: 62 65 66 6f 72 65 20 69 74 20 63 6f 6d 70 6c 65  before it comple
4e50: 74 65 73 2e 0a 20 2a 2f 0a 76 6f 69 64 20 73 71  tes.. */.void sq
4e60: 6c 69 74 65 56 69 65 77 54 72 69 67 67 65 72 73  liteViewTriggers
4e70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4e80: 65 2c 20 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  e, .  Table *pTa
4e90: 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  b,         /* Th
4ea0: 65 20 76 69 65 77 20 74 6f 20 63 6f 64 65 20 74  e view to code t
4eb0: 72 69 67 67 65 72 73 20 6f 6e 20 2a 2f 0a 20 20  riggers on */.  
4ec0: 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
4ed0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
4ee0: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
4ef0: 73 74 61 74 65 6d 65 6e 74 20 63 61 75 73 69 6e  statement causin
4f00: 67 20 74 72 69 67 67 65 72 73 2a 2f 0a 20 20 69  g triggers*/.  i
4f10: 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20 20 20 20  nt orconf,      
4f20: 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 43 4f      /* The ON CO
4f30: 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 73 70  NFLICT policy sp
4f40: 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
4f50: 6f 66 20 74 68 65 0a 09 09 09 20 20 73 74 61 74  of the....  stat
4f60: 65 6d 65 6e 74 20 63 61 75 73 69 6e 67 20 74 68  ement causing th
4f70: 65 73 65 20 74 72 69 67 67 65 72 73 20 2a 2f 0a  ese triggers */.
4f80: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61    ExprList *pCha
4f90: 6e 67 65 73 20 20 20 2f 2a 20 49 66 20 74 68 69  nges   /* If thi
4fa0: 73 20 69 73 20 61 6e 20 73 74 61 74 65 6d 65 6e  s is an statemen
4fb0: 74 20 63 61 75 73 69 6e 67 20 74 72 69 67 67 65  t causing trigge
4fc0: 72 73 20 74 6f 20 66 69 72 65 0a 09 09 09 20 20  rs to fire....  
4fd0: 69 73 20 61 6e 20 55 50 44 41 54 45 2c 20 74 68  is an UPDATE, th
4fe0: 65 6e 20 74 68 69 73 20 6c 69 73 74 20 68 6f 6c  en this list hol
4ff0: 64 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 09  ds the columns..
5000: 09 09 20 20 74 6f 20 75 70 64 61 74 65 20 61 6e  ..  to update an
5010: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
5020: 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 6d  s to update them
5030: 20 74 6f 2e 0a 09 09 09 20 20 53 65 65 20 63 6f   to.....  See co
5040: 6d 6d 65 6e 74 73 20 66 6f 72 20 73 71 6c 69 74  mments for sqlit
5050: 65 55 70 64 61 74 65 28 29 2e 20 2a 2f 0a 29 7b  eUpdate(). */.){
5060: 0a 20 20 69 6e 74 20 6f 6c 64 49 64 78 20 3d 20  .  int oldIdx = 
5070: 2d 31 3b 0a 20 20 69 6e 74 20 6e 65 77 49 64 78  -1;.  int newIdx
5080: 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 2a 61 58   = -1;.  int *aX
5090: 52 65 66 20 3d 20 30 3b 20 20 20 0a 20 20 56 64  Ref = 0;   .  Vd
50a0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 65 6e 64  be *v;.  int end
50b0: 4f 66 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 73 74  OfLoop;.  int st
50c0: 61 72 74 4f 66 4c 6f 6f 70 3b 0a 20 20 53 65 6c  artOfLoop;.  Sel
50d0: 65 63 74 20 74 68 65 53 65 6c 65 63 74 3b 0a 20  ect theSelect;. 
50e0: 20 54 6f 6b 65 6e 20 74 62 6c 4e 61 6d 65 54 6f   Token tblNameTo
50f0: 6b 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 70  ken;..  assert(p
5100: 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 0a  Tab->pSelect);..
5110: 20 20 74 62 6c 4e 61 6d 65 54 6f 6b 65 6e 2e 7a    tblNameToken.z
5120: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
5130: 20 20 74 62 6c 4e 61 6d 65 54 6f 6b 65 6e 2e 6e    tblNameToken.n
5140: 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e   = strlen(pTab->
5150: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 74 68 65 53 65  zName);..  theSe
5160: 6c 65 63 74 2e 69 73 44 69 73 74 69 6e 63 74 20  lect.isDistinct 
5170: 3d 20 30 3b 0a 20 20 74 68 65 53 65 6c 65 63 74  = 0;.  theSelect
5180: 2e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  .pEList = sqlite
5190: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
51a0: 2c 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  , sqliteExpr(TK_
51b0: 41 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30  ALL, 0, 0, 0), 0
51c0: 29 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 70  );.  theSelect.p
51d0: 53 72 63 20 20 20 3d 20 73 71 6c 69 74 65 53 72  Src   = sqliteSr
51e0: 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26  cListAppend(0, &
51f0: 74 62 6c 4e 61 6d 65 54 6f 6b 65 6e 29 3b 0a 20  tblNameToken);. 
5200: 20 74 68 65 53 65 6c 65 63 74 2e 70 57 68 65 72   theSelect.pWher
5210: 65 20 3d 20 70 57 68 65 72 65 3b 20 20 20 20 70  e = pWhere;    p
5220: 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 74 68 65  Where = 0;.  the
5230: 53 65 6c 65 63 74 2e 70 47 72 6f 75 70 42 79 20  Select.pGroupBy 
5240: 3d 20 30 3b 0a 20 20 74 68 65 53 65 6c 65 63 74  = 0;.  theSelect
5250: 2e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20  .pHaving = 0;.  
5260: 74 68 65 53 65 6c 65 63 74 2e 70 4f 72 64 65 72  theSelect.pOrder
5270: 42 79 20 3d 20 30 3b 0a 20 20 74 68 65 53 65 6c  By = 0;.  theSel
5280: 65 63 74 2e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45  ect.op = TK_SELE
5290: 43 54 3b 20 2f 2a 20 3f 3f 20 2a 2f 0a 20 20 74  CT; /* ?? */.  t
52a0: 68 65 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  heSelect.pPrior 
52b0: 3d 20 30 3b 0a 20 20 74 68 65 53 65 6c 65 63 74  = 0;.  theSelect
52c0: 2e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  .nLimit = -1;.  
52d0: 74 68 65 53 65 6c 65 63 74 2e 6e 4f 66 66 73 65  theSelect.nOffse
52e0: 74 20 3d 20 2d 31 3b 0a 20 20 74 68 65 53 65 6c  t = -1;.  theSel
52f0: 65 63 74 2e 7a 53 65 6c 65 63 74 20 3d 20 30 3b  ect.zSelect = 0;
5300: 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 62 61 73  .  theSelect.bas
5310: 65 20 3d 20 30 3b 0a 0a 20 20 76 20 3d 20 73 71  e = 0;..  v = sq
5320: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
5330: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 76 29  se);.  assert(v)
5340: 3b 0a 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57  ;.  sqliteBeginW
5350: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
5360: 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20  arse, 1);..  /* 
5370: 41 6c 6c 6f 63 61 74 65 20 74 65 6d 70 20 74 61  Allocate temp ta
5380: 62 6c 65 73 20 2a 2f 0a 20 20 6f 6c 64 49 64 78  bles */.  oldIdx
5390: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
53a0: 2b 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  +;.  sqliteVdbeA
53b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
53c0: 65 6d 70 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b  emp, oldIdx, 0);
53d0: 0a 20 20 69 66 28 20 70 43 68 61 6e 67 65 73 20  .  if( pChanges 
53e0: 29 7b 0a 20 20 20 20 6e 65 77 49 64 78 20 3d 20  ){.    newIdx = 
53f0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
5400: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5410: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
5420: 6d 70 2c 20 6e 65 77 49 64 78 2c 20 30 29 3b 0a  mp, newIdx, 0);.
5430: 20 20 7d 0a 0a 20 20 2f 2a 20 53 6e 61 70 73 68    }..  /* Snapsh
5440: 6f 74 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ot the view */. 
5450: 20 69 66 28 20 73 71 6c 69 74 65 53 65 6c 65 63   if( sqliteSelec
5460: 74 28 70 50 61 72 73 65 2c 20 26 74 68 65 53 65  t(pParse, &theSe
5470: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
5480: 20 6f 6c 64 49 64 78 2c 20 30 2c 20 30 2c 20 30   oldIdx, 0, 0, 0
5490: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
54a0: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
54b0: 20 7d 0a 0a 20 20 2f 2a 20 6c 6f 6f 70 20 74 68   }..  /* loop th
54c0: 72 75 20 74 68 65 20 76 69 65 77 20 73 6e 61 70  ru the view snap
54d0: 73 68 6f 74 2c 20 65 78 65 63 75 74 69 6e 67 20  shot, executing 
54e0: 74 72 69 67 67 65 72 73 20 66 6f 72 20 65 61 63  triggers for eac
54f0: 68 20 72 6f 77 20 2a 2f 0a 20 20 65 6e 64 4f 66  h row */.  endOf
5500: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 56 64 62  Loop = sqliteVdb
5510: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5520: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5530: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 6f  (v, OP_Rewind, o
5540: 6c 64 49 64 78 2c 20 65 6e 64 4f 66 4c 6f 6f 70  ldIdx, endOfLoop
5550: 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  );..  /* Loop th
5560: 72 75 20 74 68 65 20 76 69 65 77 20 73 6e 61 70  ru the view snap
5570: 73 68 6f 74 2c 20 65 78 65 63 75 74 69 6e 67 20  shot, executing 
5580: 74 72 69 67 67 65 72 73 20 66 6f 72 20 65 61 63  triggers for eac
5590: 68 20 72 6f 77 20 2a 2f 0a 20 20 73 74 61 72 74  h row */.  start
55a0: 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 56  OfLoop = sqliteV
55b0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
55c0: 29 3b 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 74  );..  /* Build t
55d0: 68 65 20 75 70 64 61 74 65 64 20 72 6f 77 20 69  he updated row i
55e0: 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
55f0: 69 66 28 20 70 43 68 61 6e 67 65 73 20 29 7b 0a  if( pChanges ){.
5600: 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20      int ii;..   
5610: 20 61 58 52 65 66 20 3d 20 73 71 6c 69 74 65 4d   aXRef = sqliteM
5620: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 69 6e  alloc( sizeof(in
5630: 74 29 20 2a 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t) * pTab->nCol 
5640: 29 3b 0a 20 20 20 20 69 66 28 20 61 58 52 65 66  );.    if( aXRef
5650: 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72 69 67 67  ==0 ) goto trigg
5660: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  er_cleanup;.    
5670: 66 6f 72 28 69 69 20 3d 20 30 3b 20 69 69 20 3c  for(ii = 0; ii <
5680: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 69 2b   pTab->nCol; ii+
5690: 2b 29 7b 0a 20 20 20 20 20 20 61 58 52 65 66 5b  +){.      aXRef[
56a0: 69 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ii] = -1;.    }.
56b0: 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
56c0: 69 3c 70 43 68 61 6e 67 65 73 2d 3e 6e 45 78 70  i<pChanges->nExp
56d0: 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
56e0: 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66  int jj;.      if
56f0: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
5700: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 6f  lveIds(pParse, o
5710: 6c 64 49 64 78 2c 20 74 68 65 53 65 6c 65 63 74  ldIdx, theSelect
5720: 2e 70 53 72 63 20 2c 20 30 2c 20 0a 20 20 20 20  .pSrc , 0, .    
5730: 20 20 20 20 20 20 20 20 70 43 68 61 6e 67 65 73          pChanges
5740: 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29  ->a[ii].pExpr) )
5750: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74  {.        goto t
5760: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
5770: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
5780: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
5790: 63 6b 28 70 50 61 72 73 65 2c 20 70 43 68 61 6e  ck(pParse, pChan
57a0: 67 65 73 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ges->a[ii].pExpr
57b0: 2c 20 30 2c 20 30 29 20 29 0a 20 20 20 20 20 20  , 0, 0) ).      
57c0: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
57d0: 6c 65 61 6e 75 70 3b 0a 0a 20 20 20 20 20 20 66  leanup;..      f
57e0: 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 54 61 62  or(jj=0; jj<pTab
57f0: 2d 3e 6e 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  ->nCol; jj++){. 
5800: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
5810: 65 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  eStrICmp(pTab->a
5820: 43 6f 6c 5b 6a 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  Col[jj].zName, p
5830: 43 68 61 6e 67 65 73 2d 3e 61 5b 69 69 5d 2e 7a  Changes->a[ii].z
5840: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
5850: 20 20 20 20 20 20 61 58 52 65 66 5b 6a 6a 5d 20        aXRef[jj] 
5860: 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
5870: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5890: 66 28 20 6a 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  f( jj>=pTab->nCo
58a0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
58b0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
58c0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
58d0: 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20  no such column: 
58e0: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
58f0: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 69 5d 2e  pChanges->a[ii].
5900: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
5910: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5920: 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  +;.        goto 
5930: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
5940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
5950: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5960: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
5970: 72 2c 20 31 33 2c 20 30 29 3b 0a 0a 20 20 20 20  r, 13, 0);..    
5980: 66 6f 72 28 69 69 20 3d 20 30 3b 20 69 69 3c 70  for(ii = 0; ii<p
5990: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 69 2b 2b 29  Tab->nCol; ii++)
59a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 58 52 65  {.      if( aXRe
59b0: 66 5b 69 69 5d 20 3c 20 30 20 29 7b 20 0a 20 20  f[ii] < 0 ){ .  
59c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
59d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
59e0: 6d 6e 2c 20 6f 6c 64 49 64 78 2c 20 69 69 29 3b  mn, oldIdx, ii);
59f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5a00: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5a10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 68  Code(pParse, pCh
5a20: 61 6e 67 65 73 2d 3e 61 5b 61 58 52 65 66 5b 69  anges->a[aXRef[i
5a30: 69 5d 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  i]].pExpr);.    
5a40: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
5a50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5a60: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5a70: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 30 29 3b   pTab->nCol, 0);
5a80: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
5a90: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
5aa0: 74 4b 65 79 2c 20 6e 65 77 49 64 78 2c 20 30 29  tKey, newIdx, 0)
5ab0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
5ac0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
5ad0: 6e 64 2c 20 6e 65 77 49 64 78 2c 20 30 29 3b 0a  nd, newIdx, 0);.
5ae0: 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 64 65 52  .    sqliteCodeR
5af0: 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65  owTrigger(pParse
5b00: 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 43 68  , TK_UPDATE, pCh
5b10: 61 6e 67 65 73 2c 20 54 4b 5f 42 45 46 4f 52 45  anges, TK_BEFORE
5b20: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c  , .        pTab,
5b30: 20 6e 65 77 49 64 78 2c 20 6f 6c 64 49 64 78 2c   newIdx, oldIdx,
5b40: 20 6f 72 63 6f 6e 66 2c 20 65 6e 64 4f 66 4c 6f   orconf, endOfLo
5b50: 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43  op);.    sqliteC
5b60: 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70 50  odeRowTrigger(pP
5b70: 61 72 73 65 2c 20 54 4b 5f 55 50 44 41 54 45 2c  arse, TK_UPDATE,
5b80: 20 70 43 68 61 6e 67 65 73 2c 20 54 4b 5f 41 46   pChanges, TK_AF
5b90: 54 45 52 2c 20 0a 20 20 20 20 20 20 20 20 70 54  TER, .        pT
5ba0: 61 62 2c 20 6e 65 77 49 64 78 2c 20 6f 6c 64 49  ab, newIdx, oldI
5bb0: 64 78 2c 20 6f 72 63 6f 6e 66 2c 20 65 6e 64 4f  dx, orconf, endO
5bc0: 66 4c 6f 6f 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  fLoop);.  }else{
5bd0: 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 64 65 52  .    sqliteCodeR
5be0: 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65  owTrigger(pParse
5bf0: 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20  , TK_DELETE, 0, 
5c00: 54 4b 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c  TK_BEFORE, pTab,
5c10: 20 2d 31 2c 20 6f 6c 64 49 64 78 2c 20 0a 20 20   -1, oldIdx, .  
5c20: 20 20 20 20 20 20 6f 72 63 6f 6e 66 2c 20 65 6e        orconf, en
5c30: 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 73 71  dOfLoop);.    sq
5c40: 6c 69 74 65 43 6f 64 65 52 6f 77 54 72 69 67 67  liteCodeRowTrigg
5c50: 65 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 45  er(pParse, TK_DE
5c60: 4c 45 54 45 2c 20 30 2c 20 54 4b 5f 41 46 54 45  LETE, 0, TK_AFTE
5c70: 52 2c 20 70 54 61 62 2c 20 2d 31 2c 20 6f 6c 64  R, pTab, -1, old
5c80: 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20 6f 72  Idx, .        or
5c90: 63 6f 6e 66 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29  conf, endOfLoop)
5ca0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 56  ;.  }..  sqliteV
5cb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
5cc0: 65 78 74 2c 20 6f 6c 64 49 64 78 2c 20 73 74 61  ext, oldIdx, sta
5cd0: 72 74 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20 73 71  rtOfLoop);..  sq
5ce0: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
5cf0: 61 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f  abel(v, endOfLoo
5d00: 70 29 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64 57  p);.  sqliteEndW
5d10: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
5d20: 61 72 73 65 29 3b 0a 0a 74 72 69 67 67 65 72 5f  arse);..trigger_
5d30: 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
5d40: 65 46 72 65 65 28 61 58 52 65 66 29 3b 0a 20 20  eFree(aXRef);.  
5d50: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
5d60: 6c 65 74 65 28 70 43 68 61 6e 67 65 73 29 3b 0a  lete(pChanges);.
5d70: 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
5d80: 74 65 28 70 57 68 65 72 65 29 3b 0a 20 20 73 71  te(pWhere);.  sq
5d90: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
5da0: 74 65 28 74 68 65 53 65 6c 65 63 74 2e 70 45 4c  te(theSelect.pEL
5db0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 72  ist);.  sqliteSr
5dc0: 63 4c 69 73 74 44 65 6c 65 74 65 28 74 68 65 53  cListDelete(theS
5dd0: 65 6c 65 63 74 2e 70 53 72 63 29 3b 0a 20 20 73  elect.pSrc);.  s
5de0: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
5df0: 74 68 65 53 65 6c 65 63 74 2e 70 57 68 65 72 65  theSelect.pWhere
5e00: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.