/ Hex Artifact Content
Login

Artifact 5ba917fc226b96065108da28186c2efaec53e481:


0000: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  /*.**.** The aut
0010: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0020: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0030: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0040: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0050: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0060: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0070: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0080: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0090: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00a0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00b0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00c0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00d0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00e0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
00f0: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0100: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0110: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 0a 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  *.*.*/.#include 
0170: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0180: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 6c 69  *.** Delete a li
0190: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 54 72 69  nked list of Tri
01a0: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
01b0: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  res..*/.static v
01c0: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
01d0: 54 72 69 67 67 65 72 53 74 65 70 28 54 72 69 67  TriggerStep(Trig
01e0: 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65  gerStep *pTrigge
01f0: 72 53 74 65 70 29 7b 0a 20 20 77 68 69 6c 65 28  rStep){.  while(
0200: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b   pTriggerStep ){
0210: 0a 20 20 20 20 54 72 69 67 67 65 72 53 74 65 70  .    TriggerStep
0220: 20 2a 20 70 54 6d 70 20 3d 20 70 54 72 69 67 67   * pTmp = pTrigg
0230: 65 72 53 74 65 70 3b 0a 20 20 20 20 70 54 72 69  erStep;.    pTri
0240: 67 67 65 72 53 74 65 70 20 3d 20 70 54 72 69 67  ggerStep = pTrig
0250: 67 65 72 53 74 65 70 2d 3e 70 4e 65 78 74 3b 0a  gerStep->pNext;.
0260: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 74  .    if( pTmp->t
0270: 61 72 67 65 74 2e 64 79 6e 20 29 20 73 71 6c 69  arget.dyn ) sqli
0280: 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 54  teFree((char*)pT
0290: 6d 70 2d 3e 74 61 72 67 65 74 2e 7a 29 3b 0a 20  mp->target.z);. 
02a0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
02b0: 65 74 65 28 70 54 6d 70 2d 3e 70 57 68 65 72 65  ete(pTmp->pWhere
02c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  );.    sqliteExp
02d0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6d 70  rListDelete(pTmp
02e0: 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b 0a 20 20  ->pExprList);.  
02f0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
0300: 6c 65 74 65 28 70 54 6d 70 2d 3e 70 53 65 6c 65  lete(pTmp->pSele
0310: 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49  ct);.    sqliteI
0320: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6d 70  dListDelete(pTmp
0330: 2d 3e 70 49 64 4c 69 73 74 29 3b 0a 0a 20 20 20  ->pIdList);..   
0340: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 6d 70   sqliteFree(pTmp
0350: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
0360: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62  This is called b
0370: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65  y the parser whe
0380: 6e 20 69 74 20 73 65 65 73 20 61 20 43 52 45 41  n it sees a CREA
0390: 54 45 20 54 52 49 47 47 45 52 20 73 74 61 74 65  TE TRIGGER state
03a0: 6d 65 6e 74 2e 20 53 65 65 0a 2a 2a 20 63 6f 6d  ment. See.** com
03b0: 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e  ments surroundin
03c0: 67 20 73 74 72 75 63 74 20 54 72 69 67 67 65 72  g struct Trigger
03d0: 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
03e0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
03f0: 6e 20 6f 66 20 0a 2a 2a 20 68 6f 77 20 74 72 69  n of .** how tri
0400: 67 67 65 72 73 20 61 72 65 20 73 74 6f 72 65 64  ggers are stored
0410: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0420: 43 72 65 61 74 65 54 72 69 67 67 65 72 28 0a 20  CreateTrigger(. 
0430: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
0440: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
0450: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
0460: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
0470: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
0480: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
0490: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f     /* The name o
04a0: 66 20 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f  f the trigger */
04b0: 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20 20  .  int tr_tm,   
04c0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
04d0: 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b 5f 41   TK_BEFORE, TK_A
04e0: 46 54 45 52 20 2c 20 54 4b 5f 49 4e 53 54 45 41  FTER , TK_INSTEA
04f0: 44 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  D */.  int op,  
0500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
0510: 65 20 6f 66 20 54 4b 5f 49 4e 53 45 52 54 2c 20  e of TK_INSERT, 
0520: 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f 44 45  TK_UPDATE, TK_DE
0530: 4c 45 54 45 20 2a 2f 0a 20 20 49 64 4c 69 73 74  LETE */.  IdList
0540: 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 2f 2a   *pColumns,   /*
0550: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 69 66 20   column list if 
0560: 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  this is an UPDAT
0570: 45 20 4f 46 20 74 72 69 67 67 65 72 20 2a 2f 0a  E OF trigger */.
0580: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
0590: 61 6d 65 2c 20 20 2f 2a 20 54 68 65 20 6e 61 6d  ame,  /* The nam
05a0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2f 76  e of the table/v
05b0: 69 65 77 20 74 68 65 20 74 72 69 67 67 65 72 20  iew the trigger 
05c0: 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
05d0: 69 6e 74 20 66 6f 72 65 61 63 68 2c 20 20 20 20  int foreach,    
05e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
05f0: 5f 52 4f 57 20 6f 72 20 54 4b 5f 53 54 41 54 45  _ROW or TK_STATE
0600: 4d 45 4e 54 20 2a 2f 0a 20 20 45 78 70 72 20 2a  MENT */.  Expr *
0610: 70 57 68 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a  pWhen,        /*
0620: 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
0630: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
0640: 53 74 65 70 4c 69 73 74 2c 20 2f 2a 20 54 68 65  StepList, /* The
0650: 20 74 72 69 67 67 65 72 65 64 20 70 72 6f 67 72   triggered progr
0660: 61 6d 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  am */.  Token *p
0670: 41 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  All             
0680: 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74 20 64 65  /* Token that de
0690: 73 63 72 69 62 65 73 20 74 68 65 20 63 6f 6d 70  scribes the comp
06a0: 6c 65 74 65 20 43 52 45 41 54 45 20 54 52 49 47  lete CREATE TRIG
06b0: 47 45 52 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  GER */.){.  Trig
06c0: 67 65 72 20 2a 6e 74 3b 0a 20 20 54 61 62 6c 65  ger *nt;.  Table
06d0: 20 20 20 2a 74 61 62 3b 0a 0a 20 20 2f 2a 20 43     *tab;..  /* C
06e0: 68 65 63 6b 20 74 68 61 74 3a 20 0a 20 20 2a 2a  heck that: .  **
06f0: 20 31 2e 20 74 68 65 20 74 72 69 67 67 65 72 20   1. the trigger 
0700: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 61 6c  name does not al
0710: 72 65 61 64 79 20 65 78 69 73 74 2e 0a 20 20 2a  ready exist..  *
0720: 2a 20 32 2e 20 74 68 65 20 74 61 62 6c 65 20 28  * 2. the table (
0730: 6f 72 20 76 69 65 77 29 20 64 6f 65 73 20 65 78  or view) does ex
0740: 69 73 74 2e 0a 20 20 2a 2a 20 33 2e 20 74 68 61  ist..  ** 3. tha
0750: 74 20 77 65 20 61 72 65 20 6e 6f 74 20 74 72 79  t we are not try
0760: 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20 61 20  ing to create a 
0770: 74 72 69 67 67 65 72 20 6f 6e 20 74 68 65 20 73  trigger on the s
0780: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
0790: 6c 65 0a 20 20 2a 2a 20 34 2e 20 54 68 61 74 20  le.  ** 4. That 
07a0: 77 65 20 61 72 65 20 6e 6f 74 20 74 72 79 69 6e  we are not tryin
07b0: 67 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 49  g to create an I
07c0: 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65  NSTEAD OF trigge
07d0: 72 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20  r on a table..  
07e0: 2a 2a 20 35 2e 20 54 68 61 74 20 77 65 20 61 72  ** 5. That we ar
07f0: 65 20 6e 6f 74 20 74 72 79 69 6e 67 20 74 6f 20  e not trying to 
0800: 63 72 65 61 74 65 20 61 20 42 45 46 4f 52 45 20  create a BEFORE 
0810: 6f 72 20 41 46 54 45 52 20 74 72 69 67 67 65 72  or AFTER trigger
0820: 20 6f 6e 20 61 20 76 69 65 77 2e 0a 20 20 2a 2f   on a view..  */
0830: 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 74  .  {.    char *t
0840: 6d 70 5f 73 74 72 20 3d 20 73 71 6c 69 74 65 53  mp_str = sqliteS
0850: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
0860: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
0870: 69 66 28 20 73 71 6c 69 74 65 48 61 73 68 46 69  if( sqliteHashFi
0880: 6e 64 28 26 28 70 50 61 72 73 65 2d 3e 64 62 2d  nd(&(pParse->db-
0890: 3e 74 72 69 67 48 61 73 68 29 2c 20 74 6d 70 5f  >trigHash), tmp_
08a0: 73 74 72 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20  str, pName->n + 
08b0: 31 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  1) ){.      sqli
08c0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
08d0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
08e0: 74 72 69 67 67 65 72 20 22 2c 20 2d 31 2c 0a 20  trigger ", -1,. 
08f0: 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e           pName->
0900: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 22 20 61  z, pName->n, " a
0910: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
0920: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  -1, 0);.      sq
0930: 6c 69 74 65 46 72 65 65 28 74 6d 70 5f 73 74 72  liteFree(tmp_str
0940: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
0950: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67  >nErr++;.      g
0960: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
0970: 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nup;.    }.    s
0980: 71 6c 69 74 65 46 72 65 65 28 74 6d 70 5f 73 74  qliteFree(tmp_st
0990: 72 29 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20  r);.  }.  {.    
09a0: 63 68 61 72 20 2a 74 6d 70 5f 73 74 72 20 3d 20  char *tmp_str = 
09b0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 54  sqliteStrNDup(pT
09c0: 61 62 6c 65 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61  ableName->z, pTa
09d0: 62 6c 65 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  bleName->n);.   
09e0: 20 69 66 28 20 74 6d 70 5f 73 74 72 3d 3d 30 20   if( tmp_str==0 
09f0: 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63  ) goto trigger_c
0a00: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 74 61 62 20  leanup;.    tab 
0a10: 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c  = sqliteFindTabl
0a20: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 74 6d  e(pParse->db, tm
0a30: 70 5f 73 74 72 29 3b 0a 20 20 20 20 73 71 6c 69  p_str);.    sqli
0a40: 74 65 46 72 65 65 28 74 6d 70 5f 73 74 72 29 3b  teFree(tmp_str);
0a50: 0a 20 20 20 20 69 66 28 20 21 74 61 62 20 29 7b  .    if( !tab ){
0a60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
0a70: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
0a80: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
0a90: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 2d 31 2c  ch table: ", -1,
0aa0: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 6c  .          pTabl
0ab0: 65 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c 65  eName->z, pTable
0ac0: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  Name->n, 0);.   
0ad0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
0ae0: 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72  +;.      goto tr
0af0: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
0b00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
0b10: 69 74 65 53 74 72 49 43 6d 70 28 74 61 62 2d 3e  iteStrICmp(tab->
0b20: 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  zName, MASTER_NA
0b30: 4d 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ME)==0 ){.      
0b40: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
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 74 72 69 67 67 65 72 20 6f 6e 20 73 79 73 74   trigger on syst
0b80: 65 6d 20 22 0a 20 20 20 20 20 20 20 20 20 22 74  em ".         "t
0b90: 61 62 6c 65 3a 20 22 20 4d 41 53 54 45 52 5f 4e  able: " MASTER_N
0ba0: 41 4d 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  AME, 0);.      p
0bb0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
0bc0: 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65       goto trigge
0bd0: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  r_cleanup;.    }
0be0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53  .    if( sqliteS
0bf0: 74 72 49 43 6d 70 28 74 61 62 2d 3e 7a 4e 61 6d  trICmp(tab->zNam
0c00: 65 2c 20 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e  e, TEMP_MASTER_N
0c10: 41 4d 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  AME)==0 ){.     
0c20: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
0c30: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
0c40: 67 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74  g, "cannot creat
0c50: 65 20 74 72 69 67 67 65 72 20 6f 6e 20 73 79 73  e trigger on sys
0c60: 74 65 6d 20 22 0a 20 20 20 20 20 20 20 20 20 22  tem ".         "
0c70: 74 61 62 6c 65 3a 20 22 20 54 45 4d 50 5f 4d 41  table: " TEMP_MA
0c80: 53 54 45 52 5f 4e 41 4d 45 2c 20 30 29 3b 0a 20  STER_NAME, 0);. 
0c90: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
0ca0: 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  r++;.      goto 
0cb0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
0cc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74  .    }.    if( t
0cd0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 74  ab->pSelect && t
0ce0: 72 5f 74 6d 20 21 3d 20 54 4b 5f 49 4e 53 54 45  r_tm != TK_INSTE
0cf0: 41 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  AD ){.      sqli
0d00: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
0d10: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
0d20: 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 22 2c  cannot create ",
0d30: 20 2d 31 2c 0a 09 20 20 28 74 72 5f 74 6d 20 3d   -1,..  (tr_tm =
0d40: 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f 22 42 45  = TK_BEFORE)?"BE
0d50: 46 4f 52 45 22 3a 22 41 46 54 45 52 22 2c 20 2d  FORE":"AFTER", -
0d60: 31 2c 20 22 20 74 72 69 67 67 65 72 20 6f 6e 20  1, " trigger on 
0d70: 76 69 65 77 3a 20 22 2c 20 2d 31 0a 20 20 20 20  view: ", -1.    
0d80: 20 20 20 20 20 20 2c 20 70 54 61 62 6c 65 4e 61        , pTableNa
0d90: 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e 61 6d  me->z, pTableNam
0da0: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  e->n, 0);.      
0db0: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
0dc0: 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
0dd0: 69 66 28 20 21 74 61 62 2d 3e 70 53 65 6c 65 63  if( !tab->pSelec
0de0: 74 20 26 26 20 74 72 5f 74 6d 20 3d 3d 20 54 4b  t && tr_tm == TK
0df0: 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20  _INSTEAD ){.    
0e00: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
0e10: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
0e20: 4d 73 67 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65  Msg, "cannot cre
0e30: 61 74 65 20 49 4e 53 54 45 41 44 20 4f 46 22 2c  ate INSTEAD OF",
0e40: 20 2d 31 2c 20 0a 09 20 20 22 20 74 72 69 67 67   -1, ..  " trigg
0e50: 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20 22 2c 20  er on table: ", 
0e60: 2d 31 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e  -1, pTableName->
0e70: 7a 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e  z, pTableName->n
0e80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  , 0);.      goto
0e90: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
0ea0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
0eb0: 66 20 28 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 49  f (tr_tm == TK_I
0ec0: 4e 53 54 45 41 44 29 7b 0a 20 20 20 20 74 72 5f  NSTEAD){.    tr_
0ed0: 74 6d 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 0a  tm = TK_BEFORE;.
0ee0: 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20    }..  /* Build 
0ef0: 74 68 65 20 54 72 69 67 67 65 72 20 6f 62 6a 65  the Trigger obje
0f00: 63 74 20 2a 2f 0a 20 20 6e 74 20 3d 20 28 54 72  ct */.  nt = (Tr
0f10: 69 67 67 65 72 2a 29 73 71 6c 69 74 65 4d 61 6c  igger*)sqliteMal
0f20: 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69 67 67  loc(sizeof(Trigg
0f30: 65 72 29 29 3b 0a 20 20 69 66 28 20 6e 74 3d 3d  er));.  if( nt==
0f40: 30 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72  0 ) goto trigger
0f50: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 6e 74 2d 3e  _cleanup;.  nt->
0f60: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  name = sqliteStr
0f70: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
0f80: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 6e 74 2d 3e  Name->n);.  nt->
0f90: 74 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 53 74  table = sqliteSt
0fa0: 72 4e 44 75 70 28 70 54 61 62 6c 65 4e 61 6d 65  rNDup(pTableName
0fb0: 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d  ->z, pTableName-
0fc0: 3e 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  >n);.  if( sqlit
0fd0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
0fe0: 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63  ) goto trigger_c
0ff0: 6c 65 61 6e 75 70 3b 0a 20 20 6e 74 2d 3e 6f 70  leanup;.  nt->op
1000: 20 3d 20 6f 70 3b 0a 20 20 6e 74 2d 3e 74 72 5f   = op;.  nt->tr_
1010: 74 6d 20 3d 20 74 72 5f 74 6d 3b 0a 20 20 6e 74  tm = tr_tm;.  nt
1020: 2d 3e 70 57 68 65 6e 20 3d 20 73 71 6c 69 74 65  ->pWhen = sqlite
1030: 45 78 70 72 44 75 70 28 70 57 68 65 6e 29 3b 0a  ExprDup(pWhen);.
1040: 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
1050: 74 65 28 70 57 68 65 6e 29 3b 0a 20 20 6e 74 2d  te(pWhen);.  nt-
1060: 3e 70 43 6f 6c 75 6d 6e 73 20 3d 20 73 71 6c 69  >pColumns = sqli
1070: 74 65 49 64 4c 69 73 74 44 75 70 28 70 43 6f 6c  teIdListDup(pCol
1080: 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 49  umns);.  sqliteI
1090: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 43 6f 6c  dListDelete(pCol
10a0: 75 6d 6e 73 29 3b 0a 20 20 6e 74 2d 3e 66 6f 72  umns);.  nt->for
10b0: 65 61 63 68 20 3d 20 66 6f 72 65 61 63 68 3b 0a  each = foreach;.
10c0: 20 20 6e 74 2d 3e 73 74 65 70 5f 6c 69 73 74 20    nt->step_list 
10d0: 3d 20 70 53 74 65 70 4c 69 73 74 3b 0a 0a 20 20  = pStepList;..  
10e0: 2f 2a 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  /* if we are not
10f0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 61   initializing, a
1100: 6e 64 20 74 68 69 73 20 74 72 69 67 67 65 72 20  nd this trigger 
1110: 69 73 20 6e 6f 74 20 6f 6e 20 61 20 54 45 4d 50  is not on a TEMP
1120: 20 74 61 62 6c 65 2c 20 0a 20 20 2a 2a 20 62 75   table, .  ** bu
1130: 69 6c 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ild the sqlite_m
1140: 61 73 74 65 72 20 65 6e 74 72 79 0a 20 20 2a 2f  aster entry.  */
1150: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
1160: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
1170: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 69 6e  static VdbeOp in
1180: 73 65 72 74 54 72 69 67 5b 5d 20 3d 20 7b 0a 20  sertTrig[] = {. 
1190: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 77 52 65 63       { OP_NewRec
11a0: 6e 6f 2c 20 20 20 30 2c 20 30 2c 20 20 30 20 20  no,   0, 0,  0  
11b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
11c0: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
11d0: 20 20 30 2c 20 30 2c 20 20 22 74 72 69 67 67 65    0, 0,  "trigge
11e0: 72 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  r"  },.      { O
11f0: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c  P_String,     0,
1200: 20 30 2c 20 20 30 20 20 20 20 20 20 20 20 20 20   0,  0          
1210: 7d 2c 20 20 2f 2a 20 32 3a 20 74 72 69 67 67 65  },  /* 2: trigge
1220: 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  r name */.      
1230: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
1240: 20 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20   0, 0,  0       
1250: 20 20 20 7d 2c 20 20 2f 2a 20 33 3a 20 74 61 62     },  /* 3: tab
1260: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  le name */.     
1270: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
1280: 20 20 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20    0, 0,  0      
1290: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f      },.      { O
12a0: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c  P_String,     0,
12b0: 20 30 2c 20 20 30 20 20 20 20 20 20 20 20 20 20   0,  0          
12c0: 7d 2c 20 20 2f 2a 20 35 3a 20 53 51 4c 20 2a 2f  },  /* 5: SQL */
12d0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 61 6b 65  .      { OP_Make
12e0: 52 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20 20 30  Record, 5, 0,  0
12f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1300: 20 20 20 7b 20 4f 50 5f 50 75 74 49 6e 74 4b 65     { OP_PutIntKe
1310: 79 2c 20 20 30 2c 20 30 2c 20 20 30 20 20 20 20  y,  0, 0,  0    
1320: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a        },.    };.
1330: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
1340: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20    Vdbe *v;..    
1350: 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  /* Make an entry
1360: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
1370: 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
1380: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74     v = sqliteGet
1390: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13a0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
13b0: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
13c0: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67  p;.    sqliteBeg
13d0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
13e0: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a  (pParse, 0, 0);.
13f0: 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61      sqliteOpenMa
1400: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 74 61 62  sterTable(v, tab
1410: 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 61  ->isTemp);.    a
1420: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
1430: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
1440: 61 79 53 69 7a 65 28 69 6e 73 65 72 74 54 72 69  aySize(insertTri
1450: 67 29 2c 20 69 6e 73 65 72 74 54 72 69 67 29 3b  g), insertTrig);
1460: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
1470: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
1480: 20 74 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20 54   tab->isTemp ? T
1490: 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 20  EMP_MASTER_NAME 
14a0: 3a 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20  : MASTER_NAME,. 
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 20 20 20 20 50 33 5f 53 54 41 54 49 43 29        P3_STATIC)
14d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
14e0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
14f0: 2b 32 2c 20 6e 74 2d 3e 6e 61 6d 65 2c 20 30 29  +2, nt->name, 0)
1500: 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ; .    sqliteVdb
1510: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
1520: 72 2b 33 2c 20 6e 74 2d 3e 74 61 62 6c 65 2c 20  r+3, nt->table, 
1530: 30 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 56  0); .    sqliteV
1540: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
1550: 64 64 72 2b 35 2c 20 70 41 6c 6c 2d 3e 7a 2c 20  ddr+5, pAll->z, 
1560: 70 41 6c 6c 2d 3e 6e 29 3b 0a 20 20 20 20 69 66  pAll->n);.    if
1570: 28 20 21 74 61 62 2d 3e 69 73 54 65 6d 70 20 29  ( !tab->isTemp )
1580: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  {.      sqliteCh
1590: 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
15a0: 65 2d 3e 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d  e->db, v);.    }
15b0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
15c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
15d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
15e0: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
15f0: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
1600: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  }..  if( !pParse
1610: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1620: 20 2f 2a 20 53 74 69 63 6b 20 69 74 20 69 6e 20   /* Stick it in 
1630: 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 20 2a  the hash-table *
1640: 2f 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  /.    sqliteHash
1650: 49 6e 73 65 72 74 28 26 28 70 50 61 72 73 65 2d  Insert(&(pParse-
1660: 3e 64 62 2d 3e 74 72 69 67 48 61 73 68 29 2c 20  >db->trigHash), 
1670: 6e 74 2d 3e 6e 61 6d 65 2c 20 70 4e 61 6d 65 2d  nt->name, pName-
1680: 3e 6e 20 2b 20 31 2c 20 6e 74 29 3b 0a 0a 20 20  >n + 1, nt);..  
1690: 20 20 2f 2a 20 41 74 74 61 63 68 20 69 74 20 74    /* Attach it t
16a0: 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  o the table obje
16b0: 63 74 20 2a 2f 0a 20 20 20 20 6e 74 2d 3e 70 4e  ct */.    nt->pN
16c0: 65 78 74 20 3d 20 74 61 62 2d 3e 70 54 72 69 67  ext = tab->pTrig
16d0: 67 65 72 3b 0a 20 20 20 20 74 61 62 2d 3e 70 54  ger;.    tab->pT
16e0: 72 69 67 67 65 72 20 3d 20 6e 74 3b 0a 20 20 20  rigger = nt;.   
16f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
1700: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1710: 28 6e 74 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  (nt->name);.    
1720: 73 71 6c 69 74 65 46 72 65 65 28 6e 74 2d 3e 74  sqliteFree(nt->t
1730: 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  able);.    sqlit
1740: 65 46 72 65 65 28 6e 74 29 3b 0a 20 20 7d 0a 0a  eFree(nt);.  }..
1750: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a  trigger_cleanup:
1760: 0a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74  ..  sqliteIdList
1770: 44 65 6c 65 74 65 28 70 43 6f 6c 75 6d 6e 73 29  Delete(pColumns)
1780: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 44 65  ;.  sqliteExprDe
1790: 6c 65 74 65 28 70 57 68 65 6e 29 3b 0a 20 20 73  lete(pWhen);.  s
17a0: 71 6c 69 74 65 44 65 6c 65 74 65 54 72 69 67 67  qliteDeleteTrigg
17b0: 65 72 53 74 65 70 28 70 53 74 65 70 4c 69 73 74  erStep(pStepList
17c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
17d0: 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 63   a copy of all c
17e0: 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 74 68 65  omponents of the
17f0: 20 67 69 76 65 6e 20 74 72 69 67 67 65 72 20 73   given trigger s
1800: 74 65 70 2e 20 20 54 68 69 73 20 68 61 73 0a 2a  tep.  This has.*
1810: 2a 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  * the effect of 
1820: 63 6f 70 79 69 6e 67 20 61 6c 6c 20 45 78 70 72  copying all Expr
1830: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
1840: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
1850: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
1860: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 41 73  iteMalloc().  As
1870: 20 69 6e 69 74 69 61 6c 6c 79 20 63 72 65 61 74   initially creat
1880: 65 64 2c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  ed, the Expr.tok
1890: 65 6e 2e 7a 20 76 61 6c 75 65 73 0a 2a 2a 20 61  en.z values.** a
18a0: 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ll point to the 
18b0: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 74 68 61  input string tha
18c0: 74 20 77 61 73 20 66 65 64 20 74 6f 20 74 68 65  t was fed to the
18d0: 20 70 61 72 73 65 72 2e 20 20 42 75 74 20 74 68   parser.  But th
18e0: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
18f0: 65 70 68 65 6d 65 72 61 6c 20 2d 20 69 74 20 77  ephemeral - it w
1900: 69 6c 6c 20 67 6f 20 61 77 61 79 20 61 73 20 73  ill go away as s
1910: 6f 6f 6e 20 61 73 20 74 68 65 20 73 71 6c 69 74  oon as the sqlit
1920: 65 5f 65 78 65 63 28 29 0a 2a 2a 20 63 61 6c 6c  e_exec().** call
1930: 20 74 68 61 74 20 73 74 61 72 74 65 64 20 74 68   that started th
1940: 65 20 70 61 72 73 65 72 20 65 78 69 74 73 2e 20  e parser exits. 
1950: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
1960: 6b 65 73 20 61 20 70 65 72 73 69 73 74 65 6e 74  kes a persistent
1970: 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20  .** copy of all 
1980: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
1990: 20 73 74 72 69 6e 67 73 20 73 6f 20 74 68 61 74   strings so that
19a0: 20 74 68 65 20 54 72 69 67 67 65 72 53 74 65 70   the TriggerStep
19b0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 69   structure.** wi
19c0: 6c 6c 20 62 65 20 76 61 6c 69 64 20 65 76 65 6e  ll be valid even
19d0: 20 61 66 74 65 72 20 74 68 65 20 73 71 6c 69 74   after the sqlit
19e0: 65 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  e_exec() call re
19f0: 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
1a00: 20 76 6f 69 64 20 73 71 6c 69 74 65 50 65 72 73   void sqlitePers
1a10: 69 73 74 54 72 69 67 67 65 72 53 74 65 70 28 54  istTriggerStep(T
1a20: 72 69 67 67 65 72 53 74 65 70 20 2a 70 29 7b 0a  riggerStep *p){.
1a30: 20 20 69 66 28 20 70 2d 3e 74 61 72 67 65 74 2e    if( p->target.
1a40: 7a 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61 72 67  z ){.    p->targ
1a50: 65 74 2e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72  et.z = sqliteStr
1a60: 4e 44 75 70 28 70 2d 3e 74 61 72 67 65 74 2e 7a  NDup(p->target.z
1a70: 2c 20 70 2d 3e 74 61 72 67 65 74 2e 6e 29 3b 0a  , p->target.n);.
1a80: 20 20 20 20 70 2d 3e 74 61 72 67 65 74 2e 64 79      p->target.dy
1a90: 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 1;.  }.  if(
1aa0: 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20   p->pSelect ){. 
1ab0: 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20     Select *pNew 
1ac0: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75  = sqliteSelectDu
1ad0: 70 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  p(p->pSelect);. 
1ae0: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
1af0: 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74  elete(p->pSelect
1b00: 29 3b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65 63  );.    p->pSelec
1b10: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
1b20: 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
1b30: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20  .    Expr *pNew 
1b40: 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  = sqliteExprDup(
1b50: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
1b60: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
1b70: 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  (p->pWhere);.   
1b80: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65   p->pWhere = pNe
1b90: 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  w;.  }.  if( p->
1ba0: 70 45 78 70 72 4c 69 73 74 20 29 7b 0a 20 20 20  pExprList ){.   
1bb0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
1bc0: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
1bd0: 44 75 70 28 70 2d 3e 70 45 78 70 72 4c 69 73 74  Dup(p->pExprList
1be0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  );.    sqliteExp
1bf0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
1c00: 45 78 70 72 4c 69 73 74 29 3b 0a 20 20 20 20 70  ExprList);.    p
1c10: 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 70 4e  ->pExprList = pN
1c20: 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ew;.  }.  if( p-
1c30: 3e 70 49 64 4c 69 73 74 20 29 7b 0a 20 20 20 20  >pIdList ){.    
1c40: 49 64 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 73  IdList *pNew = s
1c50: 71 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28 70  qliteIdListDup(p
1c60: 2d 3e 70 49 64 4c 69 73 74 29 3b 0a 20 20 20 20  ->pIdList);.    
1c70: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
1c80: 74 65 28 70 2d 3e 70 49 64 4c 69 73 74 29 3b 0a  te(p->pIdList);.
1c90: 20 20 20 20 70 2d 3e 70 49 64 4c 69 73 74 20 3d      p->pIdList =
1ca0: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
1cb0: 0a 2a 2a 20 54 75 72 6e 20 61 20 53 45 4c 45 43  .** Turn a SELEC
1cc0: 54 20 73 74 61 74 65 6d 65 6e 74 20 28 74 68 61  T statement (tha
1cd0: 74 20 74 68 65 20 70 53 65 6c 65 63 74 20 70 61  t the pSelect pa
1ce0: 72 61 6d 65 74 65 72 20 70 6f 69 6e 74 73 20 74  rameter points t
1cf0: 6f 29 20 69 6e 74 6f 0a 2a 2a 20 61 20 74 72 69  o) into.** a tri
1d00: 67 67 65 72 20 73 74 65 70 2e 20 20 52 65 74 75  gger step.  Retu
1d10: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1d20: 61 20 54 72 69 67 67 65 72 53 74 65 70 20 73 74  a TriggerStep st
1d30: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
1d40: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
1d50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1d60: 6e 20 69 74 20 66 69 6e 64 73 20 61 20 53 45 4c  n it finds a SEL
1d70: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1d80: 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20 54 52  .** body of a TR
1d90: 49 47 47 45 52 2e 20 20 0a 2a 2f 0a 54 72 69 67  IGGER.  .*/.Trig
1da0: 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 54  gerStep *sqliteT
1db0: 72 69 67 67 65 72 53 65 6c 65 63 74 53 74 65 70  riggerSelectStep
1dc0: 28 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74  (Select *pSelect
1dd0: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
1de0: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 20 3d   *pTriggerStep =
1df0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
1e00: 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70  zeof(TriggerStep
1e10: 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67  ));.  if( pTrigg
1e20: 65 72 53 74 65 70 3d 3d 30 20 29 20 72 65 74 75  erStep==0 ) retu
1e30: 72 6e 20 30 3b 0a 0a 20 20 70 54 72 69 67 67 65  rn 0;..  pTrigge
1e40: 72 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53  rStep->op = TK_S
1e50: 45 4c 45 43 54 3b 0a 20 20 70 54 72 69 67 67 65  ELECT;.  pTrigge
1e60: 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d  rStep->pSelect =
1e70: 20 70 53 65 6c 65 63 74 3b 0a 20 20 70 54 72 69   pSelect;.  pTri
1e80: 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66  ggerStep->orconf
1e90: 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20   = OE_Default;. 
1ea0: 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54 72   sqlitePersistTr
1eb0: 69 67 67 65 72 53 74 65 70 28 70 54 72 69 67 67  iggerStep(pTrigg
1ec0: 65 72 53 74 65 70 29 3b 0a 0a 20 20 72 65 74 75  erStep);..  retu
1ed0: 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b  rn pTriggerStep;
1ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 69 6c 64 20  .}../*.** Build 
1ef0: 61 20 74 72 69 67 67 65 72 20 73 74 65 70 20 6f  a trigger step o
1f00: 75 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20  ut of an INSERT 
1f10: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
1f20: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
1f30: 74 6f 20 74 68 65 20 6e 65 77 20 74 72 69 67 67  to the new trigg
1f40: 65 72 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  er step..**.** T
1f50: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
1f60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1f70: 6e 20 69 74 20 73 65 65 73 20 61 6e 20 49 4e 53  n it sees an INS
1f80: 45 52 54 20 69 6e 73 69 64 65 20 74 68 65 0a 2a  ERT inside the.*
1f90: 2a 20 62 6f 64 79 20 6f 66 20 61 20 74 72 69 67  * body of a trig
1fa0: 67 65 72 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53  ger..*/.TriggerS
1fb0: 74 65 70 20 2a 73 71 6c 69 74 65 54 72 69 67 67  tep *sqliteTrigg
1fc0: 65 72 49 6e 73 65 72 74 53 74 65 70 28 0a 20 20  erInsertStep(.  
1fd0: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
1fe0: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
1ff0: 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  he table into wh
2000: 69 63 68 20 77 65 20 69 6e 73 65 72 74 20 2a 2f  ich we insert */
2010: 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75  .  IdList *pColu
2020: 6d 6e 2c 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  mn,    /* List o
2030: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 54 61  f columns in pTa
2040: 62 6c 65 4e 61 6d 65 20 74 6f 20 69 6e 73 65 72  bleName to inser
2050: 74 20 69 6e 74 6f 20 2a 2f 0a 20 20 45 78 70 72  t into */.  Expr
2060: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
2070: 2f 2a 20 54 68 65 20 56 41 4c 55 45 20 63 6c 61  /* The VALUE cla
2080: 75 73 65 3a 20 61 20 6c 69 73 74 20 6f 66 20 76  use: a list of v
2090: 61 6c 75 65 73 20 74 6f 20 62 65 20 69 6e 73 65  alues to be inse
20a0: 72 74 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  rted */.  Select
20b0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 2f 2a   *pSelect,    /*
20c0: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
20d0: 65 6e 74 20 74 68 61 74 20 73 75 70 70 6c 69 65  ent that supplie
20e0: 73 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  s values */.  in
20f0: 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20  t orconf        
2100: 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63    /* The conflic
2110: 74 20 61 6c 67 6f 72 69 74 68 6d 20 28 4f 45 5f  t algorithm (OE_
2120: 41 62 6f 72 74 2c 20 4f 45 5f 52 65 70 6c 61 63  Abort, OE_Replac
2130: 65 2c 20 65 74 63 2e 29 20 2a 2f 0a 29 7b 0a 20  e, etc.) */.){. 
2140: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54   TriggerStep *pT
2150: 72 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c  riggerStep = sql
2160: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
2170: 28 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a  (TriggerStep));.
2180: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
2190: 65 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ep==0 ) return 0
21a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 70 45 4c 69  ;..  assert(pELi
21b0: 73 74 20 3d 3d 20 30 20 7c 7c 20 70 53 65 6c 65  st == 0 || pSele
21c0: 63 74 20 3d 3d 20 30 29 3b 0a 20 20 61 73 73 65  ct == 0);.  asse
21d0: 72 74 28 70 45 4c 69 73 74 20 21 3d 20 30 20 7c  rt(pEList != 0 |
21e0: 7c 20 70 53 65 6c 65 63 74 20 21 3d 20 30 29 3b  | pSelect != 0);
21f0: 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ..  pTriggerStep
2200: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 53 45 52 54  ->op = TK_INSERT
2210: 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ;.  pTriggerStep
2220: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ->pSelect = pSel
2230: 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53  ect;.  pTriggerS
2240: 74 65 70 2d 3e 74 61 72 67 65 74 20 20 3d 20 2a  tep->target  = *
2250: 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 70 54  pTableName;.  pT
2260: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c  riggerStep->pIdL
2270: 69 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20  ist = pColumn;. 
2280: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
2290: 45 78 70 72 4c 69 73 74 20 3d 20 70 45 4c 69 73  ExprList = pELis
22a0: 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  t;.  pTriggerSte
22b0: 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f  p->orconf = orco
22c0: 6e 66 3b 0a 20 20 73 71 6c 69 74 65 50 65 72 73  nf;.  sqlitePers
22d0: 69 73 74 54 72 69 67 67 65 72 53 74 65 70 28 70  istTriggerStep(p
22e0: 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a 0a 20  TriggerStep);.. 
22f0: 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72   return pTrigger
2300: 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Step;.}../*.** C
2310: 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69 67 67  onstruct a trigg
2320: 65 72 20 73 74 65 70 20 74 68 61 74 20 69 6d 70  er step that imp
2330: 6c 65 6d 65 6e 74 73 20 61 6e 20 55 50 44 41 54  lements an UPDAT
2340: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  E statement and 
2350: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
2360: 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67  ter to that trig
2370: 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 70  ger step.  The p
2380: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
2390: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74   routine when it
23a0: 0a 2a 2a 20 73 65 65 73 20 61 6e 20 55 50 44 41  .** sees an UPDA
23b0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73  TE statement ins
23c0: 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20  ide the body of 
23d0: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  a CREATE TRIGGER
23e0: 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70  ..*/.TriggerStep
23f0: 20 2a 73 71 6c 69 74 65 54 72 69 67 67 65 72 55   *sqliteTriggerU
2400: 70 64 61 74 65 53 74 65 70 28 0a 20 20 54 6f 6b  pdateStep(.  Tok
2410: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20  en *pTableName, 
2420: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2430: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 75 70 64   table to be upd
2440: 61 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ated */.  ExprLi
2450: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f  st *pEList,    /
2460: 2a 20 54 68 65 20 53 45 54 20 63 6c 61 75 73 65  * The SET clause
2470: 3a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  : list of column
2480: 20 61 6e 64 20 6e 65 77 20 76 61 6c 75 65 73 20   and new values 
2490: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
24a0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
24b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
24c0: 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20  .  int orconf   
24d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
24e0: 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68  onflict algorith
24f0: 6d 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45  m. (OE_Abort, OE
2500: 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 20 2a 2f  _Ignore, etc) */
2510: 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65  .){.  TriggerSte
2520: 70 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 20  p *pTriggerStep 
2530: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  = sqliteMalloc(s
2540: 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 65  izeof(TriggerSte
2550: 70 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67  p));.  if( pTrig
2560: 67 65 72 53 74 65 70 3d 3d 30 20 29 20 72 65 74  gerStep==0 ) ret
2570: 75 72 6e 20 30 3b 0a 0a 20 20 70 54 72 69 67 67  urn 0;..  pTrigg
2580: 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f  erStep->op = TK_
2590: 55 50 44 41 54 45 3b 0a 20 20 70 54 72 69 67 67  UPDATE;.  pTrigg
25a0: 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74 20 20  erStep->target  
25b0: 3d 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 20  = *pTableName;. 
25c0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
25d0: 45 78 70 72 4c 69 73 74 20 3d 20 70 45 4c 69 73  ExprList = pELis
25e0: 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  t;.  pTriggerSte
25f0: 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
2600: 72 65 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  re;.  pTriggerSt
2610: 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63  ep->orconf = orc
2620: 6f 6e 66 3b 0a 20 20 73 71 6c 69 74 65 50 65 72  onf;.  sqlitePer
2630: 73 69 73 74 54 72 69 67 67 65 72 53 74 65 70 28  sistTriggerStep(
2640: 70 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a 0a  pTriggerStep);..
2650: 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65    return pTrigge
2660: 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rStep;.}../*.** 
2670: 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69 67  Construct a trig
2680: 67 65 72 20 73 74 65 70 20 74 68 61 74 20 69 6d  ger step that im
2690: 70 6c 65 6d 65 6e 74 73 20 61 20 44 45 4c 45 54  plements a DELET
26a0: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  E statement and 
26b0: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
26c0: 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67  ter to that trig
26d0: 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 70  ger step.  The p
26e0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
26f0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74   routine when it
2700: 0a 2a 2a 20 73 65 65 73 20 61 20 44 45 4c 45 54  .** sees a DELET
2710: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69  E statement insi
2720: 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  de the body of a
2730: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 2e   CREATE TRIGGER.
2740: 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20  .*/.TriggerStep 
2750: 2a 73 71 6c 69 74 65 54 72 69 67 67 65 72 44 65  *sqliteTriggerDe
2760: 6c 65 74 65 53 74 65 70 28 54 6f 6b 65 6e 20 2a  leteStep(Token *
2770: 70 54 61 62 6c 65 4e 61 6d 65 2c 20 45 78 70 72  pTableName, Expr
2780: 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 54 72 69   *pWhere){.  Tri
2790: 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67  ggerStep *pTrigg
27a0: 65 72 53 74 65 70 20 3d 20 73 71 6c 69 74 65 4d  erStep = sqliteM
27b0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69  alloc(sizeof(Tri
27c0: 67 67 65 72 53 74 65 70 29 29 3b 0a 20 20 69 66  ggerStep));.  if
27d0: 28 20 70 54 72 69 67 67 65 72 53 74 65 70 3d 3d  ( pTriggerStep==
27e0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
27f0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f   pTriggerStep->o
2800: 70 20 3d 20 54 4b 5f 44 45 4c 45 54 45 3b 0a 20  p = TK_DELETE;. 
2810: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 74   pTriggerStep->t
2820: 61 72 67 65 74 20 20 3d 20 2a 70 54 61 62 6c 65  arget  = *pTable
2830: 4e 61 6d 65 3b 0a 20 20 70 54 72 69 67 67 65 72  Name;.  pTrigger
2840: 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d 20 70  Step->pWhere = p
2850: 57 68 65 72 65 3b 0a 20 20 70 54 72 69 67 67 65  Where;.  pTrigge
2860: 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20  rStep->orconf = 
2870: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 73 71  OE_Default;.  sq
2880: 6c 69 74 65 50 65 72 73 69 73 74 54 72 69 67 67  litePersistTrigg
2890: 65 72 53 74 65 70 28 70 54 72 69 67 67 65 72 53  erStep(pTriggerS
28a0: 74 65 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  tep);..  return 
28b0: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a  pTriggerStep;.}.
28c0: 0a 2f 2a 20 0a 2a 2a 20 52 65 63 75 72 73 69 76  ./* .** Recursiv
28d0: 65 6c 79 20 64 65 6c 65 74 65 20 61 20 54 72 69  ely delete a Tri
28e0: 67 67 65 72 20 73 74 72 75 63 74 75 72 65 0a 2a  gger structure.*
28f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c  /.void sqliteDel
2900: 65 74 65 54 72 69 67 67 65 72 28 54 72 69 67 67  eteTrigger(Trigg
2910: 65 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20  er *pTrigger){. 
2920: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 72 69   sqliteDeleteTri
2930: 67 67 65 72 53 74 65 70 28 70 54 72 69 67 67 65  ggerStep(pTrigge
2940: 72 2d 3e 73 74 65 70 5f 6c 69 73 74 29 3b 0a 20  r->step_list);. 
2950: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 72 69   sqliteFree(pTri
2960: 67 67 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 73  gger->name);.  s
2970: 71 6c 69 74 65 46 72 65 65 28 70 54 72 69 67 67  qliteFree(pTrigg
2980: 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 73 71  er->table);.  sq
2990: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
29a0: 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b  Trigger->pWhen);
29b0: 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44  .  sqliteIdListD
29c0: 65 6c 65 74 65 28 70 54 72 69 67 67 65 72 2d 3e  elete(pTrigger->
29d0: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73 71 6c  pColumns);.  sql
29e0: 69 74 65 46 72 65 65 28 70 54 72 69 67 67 65 72  iteFree(pTrigger
29f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73  );.}../*. * This
2a00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2a10: 6c 65 64 20 74 6f 20 64 72 6f 70 20 61 20 74 72  led to drop a tr
2a20: 69 67 67 65 72 20 66 72 6f 6d 20 74 68 65 20 64  igger from the d
2a30: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
2a40: 0a 20 2a 0a 20 2a 20 54 68 69 73 20 6d 61 79 20  . *. * This may 
2a50: 62 65 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74  be called direct
2a60: 6c 79 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73  ly from the pars
2a70: 65 72 2c 20 6f 72 20 66 72 6f 6d 20 77 69 74 68  er, or from with
2a80: 69 6e 20 0a 20 2a 20 73 71 6c 69 74 65 44 72 6f  in . * sqliteDro
2a90: 70 54 61 62 6c 65 28 29 2e 20 49 6e 20 74 68 65  pTable(). In the
2aa0: 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
2ab0: 20 22 6e 65 73 74 65 64 22 20 61 72 67 75 6d 65   "nested" argume
2ac0: 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 2a 0a 20  nt is true.. *. 
2ad0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
2ae0: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2af0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 72  ot delete the tr
2b00: 69 67 67 65 72 20 65 6e 74 69 72 65 6c 79 2e 20  igger entirely. 
2b10: 49 6e 73 74 65 61 64 20 69 74 0a 20 2a 20 72 65  Instead it. * re
2b20: 6d 6f 76 65 73 20 69 74 20 66 72 6f 6d 20 74 68  moves it from th
2b30: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
2b40: 61 20 61 6e 64 20 70 6c 61 63 65 73 20 69 74 20  a and places it 
2b50: 69 6e 20 74 68 65 20 74 72 69 67 44 72 6f 70 20  in the trigDrop 
2b60: 68 61 73 68 20 0a 20 2a 20 74 61 62 6c 65 2e 20  hash . * table. 
2b70: 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  This is so that 
2b80: 74 68 65 20 74 72 69 67 67 65 72 20 63 61 6e 20  the trigger can 
2b90: 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 74 6f  be restored into
2ba0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2bb0: 68 65 6d 61 0a 20 2a 20 69 66 20 74 68 65 20 74  hema. * if the t
2bc0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
2bd0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 2a 2f 0a 76  lled back.. */.v
2be0: 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 72  oid sqliteDropTr
2bf0: 69 67 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  igger(Parse *pPa
2c00: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
2c10: 65 2c 20 69 6e 74 20 6e 65 73 74 65 64 29 7b 0a  e, int nested){.
2c20: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
2c30: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
2c40: 65 72 3b 0a 20 20 54 61 62 6c 65 20 20 20 2a 70  er;.  Table   *p
2c50: 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76  Table;.  Vdbe *v
2c60: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  ;..  zName = sql
2c70: 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65  iteStrNDup(pName
2c80: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
2c90: 0a 20 20 2f 2a 20 65 6e 73 75 72 65 20 74 68 61  .  /* ensure tha
2ca0: 74 20 74 68 65 20 74 72 69 67 67 65 72 20 62 65  t the trigger be
2cb0: 69 6e 67 20 64 72 6f 70 70 65 64 20 65 78 69 73  ing dropped exis
2cc0: 74 73 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72  ts */.  pTrigger
2cd0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e   = sqliteHashFin
2ce0: 64 28 26 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  d(&(pParse->db->
2cf0: 74 72 69 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65  trigHash), zName
2d00: 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 31 29 3b  , pName->n + 1);
2d10: 20 0a 20 20 69 66 28 20 21 70 54 72 69 67 67 65   .  if( !pTrigge
2d20: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  r ){.    sqliteS
2d30: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
2d40: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
2d50: 73 75 63 68 20 74 72 69 67 67 65 72 3a 20 22 2c  such trigger: ",
2d60: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 7a 4e 61   -1,.        zNa
2d70: 6d 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  me, -1, 0);.    
2d80: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
2d90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2da0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 20 2a 20 49 66   }..  /*.   * If
2db0: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20   this is not an 
2dc0: 22 65 78 70 6c 61 69 6e 22 2c 20 74 68 65 6e 20  "explain", then 
2dd0: 64 65 6c 65 74 65 20 74 68 65 20 74 72 69 67 67  delete the trigg
2de0: 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  er structure..  
2df0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
2e00: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
2e10: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
2e20: 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  eFindTable(pPars
2e30: 65 2d 3e 64 62 2c 20 70 54 72 69 67 67 65 72 2d  e->db, pTrigger-
2e40: 3e 74 61 62 6c 65 29 3b 0a 20 20 20 20 61 73 73  >table);.    ass
2e50: 65 72 74 28 70 54 61 62 6c 65 29 3b 0a 20 20 20  ert(pTable);.   
2e60: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 54 72   if( pTable->pTr
2e70: 69 67 67 65 72 20 3d 3d 20 70 54 72 69 67 67 65  igger == pTrigge
2e80: 72 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  r ){.      pTabl
2e90: 65 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54  e->pTrigger = pT
2ea0: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
2eb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ec0: 54 72 69 67 67 65 72 20 2a 63 63 20 3d 20 70 54  Trigger *cc = pT
2ed0: 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a  able->pTrigger;.
2ee0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 63 20        while( cc 
2ef0: 29 7b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){ .        if( 
2f00: 63 63 2d 3e 70 4e 65 78 74 20 3d 3d 20 70 54 72  cc->pNext == pTr
2f10: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20  igger ){.       
2f20: 20 20 20 63 63 2d 3e 70 4e 65 78 74 20 3d 20 63     cc->pNext = c
2f30: 63 2d 3e 70 4e 65 78 74 2d 3e 70 4e 65 78 74 3b  c->pNext->pNext;
2f40: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2f50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f60: 20 20 20 20 63 63 20 3d 20 63 63 2d 3e 70 4e 65      cc = cc->pNe
2f70: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
2f80: 20 20 61 73 73 65 72 74 28 63 63 29 3b 0a 20 20    assert(cc);.  
2f90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 48 61    }.    sqliteHa
2fa0: 73 68 49 6e 73 65 72 74 28 26 28 70 50 61 72 73  shInsert(&(pPars
2fb0: 65 2d 3e 64 62 2d 3e 74 72 69 67 48 61 73 68 29  e->db->trigHash)
2fc0: 2c 20 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  , zName, pName->
2fd0: 6e 20 2b 20 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20  n + 1, NULL);.  
2fe0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 72    sqliteDeleteTr
2ff0: 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b  igger(pTrigger);
3000: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
3010: 61 74 65 20 63 6f 64 65 20 74 6f 20 64 65 73 74  ate code to dest
3020: 72 6f 79 20 74 68 65 20 64 61 74 61 62 61 73 65  roy the database
3030: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 74   record of the t
3040: 72 69 67 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  rigger..  */.  i
3050: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 26 26 20  f( pTable!=0 && 
3060: 21 6e 65 73 74 65 64 20 26 26 20 28 76 20 3d 20  !nested && (v = 
3070: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
3080: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
3090: 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 73   int base;.    s
30a0: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f  tatic VdbeOp dro
30b0: 70 54 72 69 67 67 65 72 5b 5d 20 3d 20 7b 0a 20  pTrigger[] = {. 
30c0: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
30d0: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29  ,     0, ADDR(8)
30e0: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
30f0: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c  P_String,     0,
3100: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
3110: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 1 */.      { O
3120: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c  P_MemStore,   1,
3130: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   1,        0},. 
3140: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
3150: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
3160: 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20     0}, /* 3 */. 
3170: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
3180: 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20  ,     0, 1,     
3190: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
31a0: 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c  P_Ne,         0,
31b0: 20 41 44 44 52 28 37 29 2c 20 20 30 7d 2c 0a 20   ADDR(7),  0},. 
31c0: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
31d0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
31e0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
31f0: 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c  P_Next,       0,
3200: 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f   ADDR(3),  0}, /
3210: 2a 20 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a 0a 20  * 7 */.    };.. 
3220: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
3230: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
3240: 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rse, 0, 0);.    
3250: 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72  sqliteOpenMaster
3260: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 6c 65 2d  Table(v, pTable-
3270: 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 62 61  >isTemp);.    ba
3280: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
3290: 64 64 4f 70 4c 69 73 74 28 76 2c 20 20 41 72 72  ddOpList(v,  Arr
32a0: 61 79 53 69 7a 65 28 64 72 6f 70 54 72 69 67 67  aySize(dropTrigg
32b0: 65 72 29 2c 20 64 72 6f 70 54 72 69 67 67 65 72  er), dropTrigger
32c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
32d0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
32e0: 65 2b 31 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  e+1, zName, 0);.
32f0: 20 20 20 20 69 66 28 20 21 70 54 61 62 6c 65 2d      if( !pTable-
3300: 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  >isTemp ){.     
3310: 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f   sqliteChangeCoo
3320: 6b 69 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  kie(pParse->db, 
3330: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
3340: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3350: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
3360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  ;.    sqliteEndW
3370: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
3380: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  arse);.  }..  sq
3390: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
33a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74  .}../*.** pEList
33b0: 20 69 73 20 74 68 65 20 53 45 54 20 63 6c 61 75   is the SET clau
33c0: 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20  se of an UPDATE 
33d0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 45 61 63 68  statement.  Each
33e0: 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 45 4c   entry.** in pEL
33f0: 69 73 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ist is of the fo
3400: 72 6d 61 74 20 3c 69 64 3e 3d 3c 65 78 70 72 3e  rmat <id>=<expr>
3410: 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  .  If any of the
3420: 20 65 6e 74 72 69 65 73 0a 2a 2a 20 69 6e 20 70   entries.** in p
3430: 45 4c 69 73 74 20 68 61 76 65 20 61 6e 20 3c 69  EList have an <i
3440: 64 3e 20 77 68 69 63 68 20 6d 61 74 63 68 65 73  d> which matches
3450: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 69   an identifier i
3460: 6e 20 70 49 64 4c 69 73 74 2c 0a 2a 2a 20 74 68  n pIdList,.** th
3470: 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  en return TRUE. 
3480: 20 49 66 20 70 49 64 4c 69 73 74 3d 3d 4e 55 4c   If pIdList==NUL
3490: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  L, then it is co
34a0: 6e 73 69 64 65 72 65 64 20 61 0a 2a 2a 20 77 69  nsidered a.** wi
34b0: 6c 64 63 61 72 64 20 74 68 61 74 20 6d 61 74 63  ldcard that matc
34c0: 68 65 73 20 61 6e 79 74 68 69 6e 67 2e 20 20 4c  hes anything.  L
34d0: 69 6b 65 77 69 73 65 20 69 66 20 70 45 4c 69 73  ikewise if pELis
34e0: 74 3d 3d 4e 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20  t==NULL then.** 
34f0: 69 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68  it matches anyth
3500: 69 6e 67 20 73 6f 20 61 6c 77 61 79 73 20 72 65  ing so always re
3510: 74 75 72 6e 20 74 72 75 65 2e 20 20 52 65 74 75  turn true.  Retu
3520: 72 6e 20 66 61 6c 73 65 20 6f 6e 6c 79 0a 2a 2a  rn false only.**
3530: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
3540: 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  match..*/.static
3550: 20 69 6e 74 20 63 68 65 63 6b 43 6f 6c 75 6d 6e   int checkColumn
3560: 4f 76 65 72 4c 61 70 28 49 64 4c 69 73 74 20 2a  OverLap(IdList *
3570: 70 49 64 4c 69 73 74 2c 20 45 78 70 72 4c 69 73  pIdList, ExprLis
3580: 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e  t *pEList){.  in
3590: 74 20 65 3b 0a 20 20 69 66 28 20 21 70 49 64 4c  t e;.  if( !pIdL
35a0: 69 73 74 20 7c 7c 20 21 70 45 4c 69 73 74 20 29  ist || !pEList )
35b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
35c0: 28 65 3d 30 3b 20 65 3c 70 45 4c 69 73 74 2d 3e  (e=0; e<pEList->
35d0: 6e 45 78 70 72 3b 20 65 2b 2b 29 7b 0a 20 20 20  nExpr; e++){.   
35e0: 20 69 66 28 20 73 71 6c 69 74 65 49 64 4c 69 73   if( sqliteIdLis
35f0: 74 49 6e 64 65 78 28 70 49 64 4c 69 73 74 2c 20  tIndex(pIdList, 
3600: 70 45 4c 69 73 74 2d 3e 61 5b 65 5d 2e 7a 4e 61  pEList->a[e].zNa
3610: 6d 65 29 3e 3d 30 20 29 20 72 65 74 75 72 6e 20  me)>=0 ) return 
3620: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
3630: 30 3b 20 0a 7d 0a 0a 2f 2a 20 41 20 67 6c 6f 62  0; .}../* A glob
3640: 61 6c 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  al variable that
3650: 20 69 73 20 54 52 55 45 20 69 66 20 77 65 20 73   is TRUE if we s
3660: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 65 74  hould always set
3670: 20 75 70 20 74 65 6d 70 20 74 61 62 6c 65 73 20   up temp tables 
3680: 66 6f 72 0a 20 2a 20 66 6f 72 20 74 72 69 67 67  for. * for trigg
3690: 65 72 73 2c 20 65 76 65 6e 20 69 66 20 74 68 65  ers, even if the
36a0: 72 65 20 61 72 65 20 6e 6f 20 74 72 69 67 67 65  re are no trigge
36b0: 72 73 20 74 6f 20 63 6f 64 65 2e 20 54 68 69 73  rs to code. This
36c0: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
36d0: 20 0a 20 2a 20 68 6f 77 20 6d 75 63 68 20 6f 76   . * how much ov
36e0: 65 72 68 65 61 64 20 74 68 65 20 74 72 69 67 67  erhead the trigg
36f0: 65 72 73 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  ers algorithm is
3700: 20 63 61 75 73 69 6e 67 2e 0a 20 2a 0a 20 2a 20   causing.. *. * 
3710: 54 68 69 73 20 66 6c 61 67 20 63 61 6e 20 62 65  This flag can be
3720: 20 73 65 74 20 6f 72 20 63 6c 65 61 72 65 64 20   set or cleared 
3730: 75 73 69 6e 67 20 74 68 65 20 22 74 72 69 67 67  using the "trigg
3740: 65 72 5f 6f 76 65 72 68 65 61 64 5f 74 65 73 74  er_overhead_test
3750: 22 20 70 72 61 67 6d 61 2e 0a 20 2a 20 54 68 65  " pragma.. * The
3760: 20 70 72 61 67 6d 61 20 69 73 20 6e 6f 74 20 64   pragma is not d
3770: 6f 63 75 6d 65 6e 74 65 64 20 73 69 6e 63 65 20  ocumented since 
3780: 69 74 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  it is not really
3790: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 74   part of the int
37a0: 65 72 66 61 63 65 0a 20 2a 20 74 6f 20 53 51 4c  erface. * to SQL
37b0: 69 74 65 2c 20 6a 75 73 74 20 74 68 65 20 74 65  ite, just the te
37c0: 73 74 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f  st procedure..*/
37d0: 0a 69 6e 74 20 61 6c 77 61 79 73 5f 63 6f 64 65  .int always_code
37e0: 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d  _trigger_setup =
37f0: 20 30 3b 0a 0a 2f 2a 0a 20 2a 20 52 65 74 75 72   0;../*. * Retur
3800: 6e 73 20 74 72 75 65 20 69 66 20 61 20 74 72 69  ns true if a tri
3810: 67 67 65 72 20 6d 61 74 63 68 69 6e 67 20 6f 70  gger matching op
3820: 2c 20 74 72 5f 74 6d 20 61 6e 64 20 66 6f 72 65  , tr_tm and fore
3830: 61 63 68 20 74 68 61 74 20 69 73 20 4e 4f 54 20  ach that is NOT 
3840: 61 6c 72 65 61 64 79 0a 20 2a 20 6f 6e 20 74 68  already. * on th
3850: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 73 20  e Parse objects 
3860: 74 72 69 67 67 65 72 2d 73 74 61 63 6b 20 28 74  trigger-stack (t
3870: 6f 20 70 72 65 76 65 6e 74 20 72 65 63 75 72 73  o prevent recurs
3880: 69 76 65 20 74 72 69 67 67 65 72 20 66 69 72 69  ive trigger firi
3890: 6e 67 29 20 69 73 0a 20 2a 20 66 6f 75 6e 64 20  ng) is. * found 
38a0: 69 6e 20 74 68 65 20 6c 69 73 74 20 73 70 65 63  in the list spec
38b0: 69 66 69 65 64 20 61 73 20 70 54 72 69 67 67 65  ified as pTrigge
38c0: 72 2e 0a 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  r.. */.int sqlit
38d0: 65 54 72 69 67 67 65 72 73 45 78 69 73 74 28 0a  eTriggersExist(.
38e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
38f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
3900: 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 72  d to check for r
3910: 65 63 75 72 73 69 76 65 20 74 72 69 67 67 65 72  ecursive trigger
3920: 73 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a  s */.  Trigger *
3930: 70 54 72 69 67 67 65 72 2c 20 20 20 20 20 20 2f  pTrigger,      /
3940: 2a 20 41 20 6c 69 73 74 20 6f 66 20 74 72 69 67  * A list of trig
3950: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
3960: 77 69 74 68 20 61 20 74 61 62 6c 65 20 2a 2f 0a  with a table */.
3970: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 65            /* one
3990: 20 6f 66 20 54 4b 5f 44 45 4c 45 54 45 2c 20 54   of TK_DELETE, T
39a0: 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50 44  K_INSERT, TK_UPD
39b0: 41 54 45 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f  ATE */.  int tr_
39c0: 74 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tm,             
39d0: 20 2f 2a 20 6f 6e 65 20 6f 66 20 54 4b 5f 42 45   /* one of TK_BE
39e0: 46 4f 52 45 2c 20 54 4b 5f 41 46 54 45 52 20 2a  FORE, TK_AFTER *
39f0: 2f 0a 20 20 69 6e 74 20 66 6f 72 65 61 63 68 2c  /.  int foreach,
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
3a10: 6e 65 20 6f 66 20 54 4b 5f 52 4f 57 20 6f 72 20  ne of TK_ROW or 
3a20: 54 4b 5f 53 54 41 54 45 4d 45 4e 54 20 2a 2f 0a  TK_STATEMENT */.
3a30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61    ExprList *pCha
3a40: 6e 67 65 73 20 20 20 20 20 20 2f 2a 20 43 6f 6c  nges      /* Col
3a50: 75 6d 6e 73 20 74 68 61 74 20 63 68 61 6e 67 65  umns that change
3a60: 20 69 6e 20 61 6e 20 55 50 44 41 54 45 20 73 74   in an UPDATE st
3a70: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
3a80: 54 72 69 67 67 65 72 20 2a 20 70 54 72 69 67 67  Trigger * pTrigg
3a90: 65 72 43 75 72 73 6f 72 3b 0a 0a 20 20 69 66 28  erCursor;..  if(
3aa0: 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72 69   always_code_tri
3ab0: 67 67 65 72 5f 73 65 74 75 70 20 29 7b 0a 20 20  gger_setup ){.  
3ac0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
3ad0: 0a 20 20 70 54 72 69 67 67 65 72 43 75 72 73 6f  .  pTriggerCurso
3ae0: 72 20 3d 20 70 54 72 69 67 67 65 72 3b 0a 20 20  r = pTrigger;.  
3af0: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 43  while( pTriggerC
3b00: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  ursor ){.    if(
3b10: 20 70 54 72 69 67 67 65 72 43 75 72 73 6f 72 2d   pTriggerCursor-
3b20: 3e 6f 70 20 3d 3d 20 6f 70 20 26 26 20 0a 09 70  >op == op && ..p
3b30: 54 72 69 67 67 65 72 43 75 72 73 6f 72 2d 3e 74  TriggerCursor->t
3b40: 72 5f 74 6d 20 3d 3d 20 74 72 5f 74 6d 20 26 26  r_tm == tr_tm &&
3b50: 20 0a 09 70 54 72 69 67 67 65 72 43 75 72 73 6f   ..pTriggerCurso
3b60: 72 2d 3e 66 6f 72 65 61 63 68 20 3d 3d 20 66 6f  r->foreach == fo
3b70: 72 65 61 63 68 20 26 26 0a 09 63 68 65 63 6b 43  reach &&..checkC
3b80: 6f 6c 75 6d 6e 4f 76 65 72 4c 61 70 28 70 54 72  olumnOverLap(pTr
3b90: 69 67 67 65 72 43 75 72 73 6f 72 2d 3e 70 43 6f  iggerCursor->pCo
3ba0: 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67 65 73 29  lumns, pChanges)
3bb0: 20 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65   ){.      Trigge
3bc0: 72 53 74 61 63 6b 20 2a 20 73 73 3b 0a 20 20 20  rStack * ss;.   
3bd0: 20 20 20 73 73 20 3d 20 70 50 61 72 73 65 2d 3e     ss = pParse->
3be0: 74 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20  trigStack;.     
3bf0: 20 77 68 69 6c 65 28 20 73 73 20 26 26 20 73 73   while( ss && ss
3c00: 2d 3e 70 54 72 69 67 67 65 72 20 21 3d 20 70 54  ->pTrigger != pT
3c10: 72 69 67 67 65 72 20 29 7b 0a 09 73 73 20 3d 20  rigger ){..ss = 
3c20: 73 73 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ss->pNext;.     
3c30: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 73   }.      if( !ss
3c40: 20 29 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20   )return 1;.    
3c50: 7d 0a 20 20 20 20 70 54 72 69 67 67 65 72 43 75  }.    pTriggerCu
3c60: 72 73 6f 72 20 3d 20 70 54 72 69 67 67 65 72 43  rsor = pTriggerC
3c70: 75 72 73 6f 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  ursor->pNext;.  
3c80: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
3c90: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
3ca0: 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 7a   VDBE code for z
3cb0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 74 61 74  ero or more stat
3cc0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 20 74 68  ements inside th
3cd0: 65 20 62 6f 64 79 20 6f 66 20 61 0a 2a 2a 20 74  e body of a.** t
3ce0: 72 69 67 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61  rigger.  .*/.sta
3cf0: 74 69 63 20 69 6e 74 20 63 6f 64 65 54 72 69 67  tic int codeTrig
3d00: 67 65 72 50 72 6f 67 72 61 6d 28 0a 20 20 50 61  gerProgram(.  Pa
3d10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3d20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
3d30: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
3d40: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
3d50: 70 53 74 65 70 4c 69 73 74 2c 20 20 20 2f 2a 20  pStepList,   /* 
3d60: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 6d 65 6e  List of statemen
3d70: 74 73 20 69 6e 73 69 64 65 20 74 68 65 20 74 72  ts inside the tr
3d80: 69 67 67 65 72 20 62 6f 64 79 20 2a 2f 0a 20 20  igger body */.  
3d90: 69 6e 74 20 6f 72 63 6f 6e 66 69 6e 20 20 20 20  int orconfin    
3da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
3db0: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e  flict algorithm.
3dc0: 20 28 4f 45 5f 41 62 6f 72 74 2c 20 65 74 63 29   (OE_Abort, etc)
3dd0: 20 2a 2f 20 20 0a 29 7b 0a 20 20 54 72 69 67 67   */  .){.  Trigg
3de0: 65 72 53 74 65 70 20 2a 20 70 54 72 69 67 67 65  erStep * pTrigge
3df0: 72 53 74 65 70 20 3d 20 70 53 74 65 70 4c 69 73  rStep = pStepLis
3e00: 74 3b 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 3b  t;.  int orconf;
3e10: 0a 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67  ..  while( pTrig
3e20: 67 65 72 53 74 65 70 20 29 7b 0a 20 20 20 20 69  gerStep ){.    i
3e30: 6e 74 20 73 61 76 65 4e 54 61 62 20 3d 20 70 50  nt saveNTab = pP
3e40: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
3e50: 6f 72 63 6f 6e 66 20 3d 20 28 6f 72 63 6f 6e 66  orconf = (orconf
3e60: 69 6e 20 3d 3d 20 4f 45 5f 44 65 66 61 75 6c 74  in == OE_Default
3e70: 29 3f 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  )?pTriggerStep->
3e80: 6f 72 63 6f 6e 66 3a 6f 72 63 6f 6e 66 69 6e 3b  orconf:orconfin;
3e90: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72 69  .    pParse->tri
3ea0: 67 53 74 61 63 6b 2d 3e 6f 72 63 6f 6e 66 20 3d  gStack->orconf =
3eb0: 20 6f 72 63 6f 6e 66 3b 0a 20 20 20 20 73 77 69   orconf;.    swi
3ec0: 74 63 68 28 20 70 54 72 69 67 67 65 72 53 74 65  tch( pTriggerSte
3ed0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63  p->op ){.      c
3ee0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
3ef0: 0a 09 53 65 6c 65 63 74 20 2a 20 73 73 20 3d 20  ..Select * ss = 
3f00: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28  sqliteSelectDup(
3f10: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53  pTriggerStep->pS
3f20: 65 6c 65 63 74 29 3b 09 09 20 20 0a 09 61 73 73  elect);..  ..ass
3f30: 65 72 74 28 73 73 29 3b 0a 09 61 73 73 65 72 74  ert(ss);..assert
3f40: 28 73 73 2d 3e 70 53 72 63 29 3b 0a 09 73 71 6c  (ss->pSrc);..sql
3f50: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
3f60: 2c 20 73 73 2c 20 53 52 54 5f 44 69 73 63 61 72  , ss, SRT_Discar
3f70: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d, 0, 0, 0, 0);.
3f80: 09 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c  .sqliteSelectDel
3f90: 65 74 65 28 73 73 29 3b 0a 09 62 72 65 61 6b 3b  ete(ss);..break;
3fa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3fb0: 61 73 65 20 54 4b 5f 55 50 44 41 54 45 3a 20 7b  ase TK_UPDATE: {
3fc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
3fd0: 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d  dbeAddOp(pParse-
3fe0: 3e 70 56 64 62 65 2c 20 4f 50 5f 4c 69 73 74 50  >pVdbe, OP_ListP
3ff0: 75 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ush, 0, 0);.    
4000: 20 20 20 20 73 71 6c 69 74 65 55 70 64 61 74 65      sqliteUpdate
4010: 28 70 50 61 72 73 65 2c 20 26 70 54 72 69 67 67  (pParse, &pTrigg
4020: 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74 2c 20  erStep->target, 
4030: 0a 09 09 73 71 6c 69 74 65 45 78 70 72 4c 69 73  ...sqliteExprLis
4040: 74 44 75 70 28 70 54 72 69 67 67 65 72 53 74 65  tDup(pTriggerSte
4050: 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 2c 20 0a  p->pExprList), .
4060: 09 09 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  ..sqliteExprDup(
4070: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57  pTriggerStep->pW
4080: 68 65 72 65 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a  here), orconf);.
4090: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
40a0: 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e  beAddOp(pParse->
40b0: 70 56 64 62 65 2c 20 4f 50 5f 4c 69 73 74 50 6f  pVdbe, OP_ListPo
40c0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
40d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
40e0: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49  .      case TK_I
40f0: 4e 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 20  NSERT: {.       
4100: 20 73 71 6c 69 74 65 49 6e 73 65 72 74 28 70 50   sqliteInsert(pP
4110: 61 72 73 65 2c 20 26 70 54 72 69 67 67 65 72 53  arse, &pTriggerS
4120: 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 0a 20 20  tep->target, .  
4130: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
4140: 4c 69 73 74 44 75 70 28 70 54 72 69 67 67 65 72  ListDup(pTrigger
4150: 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 29  Step->pExprList)
4160: 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  , .        sqlit
4170: 65 53 65 6c 65 63 74 44 75 70 28 70 54 72 69 67  eSelectDup(pTrig
4180: 67 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74  gerStep->pSelect
4190: 29 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ), .        sqli
41a0: 74 65 49 64 4c 69 73 74 44 75 70 28 70 54 72 69  teIdListDup(pTri
41b0: 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c 69 73  ggerStep->pIdLis
41c0: 74 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 20  t), orconf);.   
41d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
41e0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54    }.      case T
41f0: 4b 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20  K_DELETE: {.    
4200: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4210: 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62  dOp(pParse->pVdb
4220: 65 2c 20 4f 50 5f 4c 69 73 74 50 75 73 68 2c 20  e, OP_ListPush, 
4230: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
4240: 71 6c 69 74 65 44 65 6c 65 74 65 46 72 6f 6d 28  qliteDeleteFrom(
4250: 70 50 61 72 73 65 2c 20 26 70 54 72 69 67 67 65  pParse, &pTrigge
4260: 72 53 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 0a  rStep->target, .
4270: 09 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44  .    sqliteExprD
4280: 75 70 28 70 54 72 69 67 67 65 72 53 74 65 70 2d  up(pTriggerStep-
4290: 3e 70 57 68 65 72 65 29 29 3b 0a 20 20 20 20 20  >pWhere));.     
42a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
42b0: 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  Op(pParse->pVdbe
42c0: 2c 20 4f 50 5f 4c 69 73 74 50 6f 70 2c 20 30 2c  , OP_ListPop, 0,
42d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
42e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
42f0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
4300: 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
4310: 20 20 7d 20 0a 20 20 20 20 70 50 61 72 73 65 2d    } .    pParse-
4320: 3e 6e 54 61 62 20 3d 20 73 61 76 65 4e 54 61 62  >nTab = saveNTab
4330: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
4340: 65 70 20 3d 20 70 54 72 69 67 67 65 72 53 74 65  ep = pTriggerSte
4350: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20  p->pNext;.  }.. 
4360: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4370: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
4380: 65 64 20 74 6f 20 63 6f 64 65 20 46 4f 52 20 45  ed to code FOR E
4390: 41 43 48 20 52 4f 57 20 74 72 69 67 67 65 72 73  ACH ROW triggers
43a0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
43b0: 20 63 6f 64 65 20 74 68 61 74 20 74 68 69 73 20   code that this 
43c0: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
43d0: 65 73 20 69 73 20 65 78 65 63 75 74 65 64 2c 20  es is executed, 
43e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  the following .*
43f0: 2a 20 6d 75 73 74 20 62 65 20 74 72 75 65 3a 0a  * must be true:.
4400: 2a 2a 0a 2a 2a 20 31 2e 20 4e 6f 20 63 75 72 73  **.** 1. No curs
4410: 6f 72 73 20 6d 61 79 20 62 65 20 6f 70 65 6e 20  ors may be open 
4420: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
4430: 62 61 73 65 2e 20 20 28 42 75 74 20 6e 65 77 49  base.  (But newI
4440: 64 78 20 61 6e 64 20 6f 6c 64 49 64 78 0a 2a 2a  dx and oldIdx.**
4450: 20 20 20 20 63 61 6e 20 62 65 20 69 6e 64 69 63      can be indic
4460: 65 73 20 6f 66 20 63 75 72 73 6f 72 73 20 69 6e  es of cursors in
4470: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
4480: 73 2e 20 20 53 65 65 20 62 65 6c 6f 77 2e 29 0a  s.  See below.).
4490: 2a 2a 0a 2a 2a 20 32 2e 20 49 66 20 74 68 65 20  **.** 2. If the 
44a0: 74 72 69 67 67 65 72 73 20 62 65 69 6e 67 20 63  triggers being c
44b0: 6f 64 65 64 20 61 72 65 20 4f 4e 20 49 4e 53 45  oded are ON INSE
44c0: 52 54 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20  RT or ON UPDATE 
44d0: 74 72 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a  triggers, then.*
44e0: 2a 20 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79  *    a temporary
44f0: 20 76 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e   vdbe cursor (in
4500: 64 65 78 20 6e 65 77 49 64 78 29 20 6d 75 73 74  dex newIdx) must
4510: 20 62 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69   be open and poi
4520: 6e 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61  nting at.**    a
4530: 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
4540: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62  values to be sub
4550: 73 74 69 74 75 74 65 64 20 66 6f 72 20 6e 65 77  stituted for new
4560: 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  .* expressions i
4570: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67  n the.**    trig
4580: 67 65 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a  ger program(s)..
4590: 2a 2a 0a 2a 2a 20 33 2e 20 49 66 20 74 68 65 20  **.** 3. If the 
45a0: 74 72 69 67 67 65 72 73 20 62 65 69 6e 67 20 63  triggers being c
45b0: 6f 64 65 64 20 61 72 65 20 4f 4e 20 44 45 4c 45  oded are ON DELE
45c0: 54 45 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20  TE or ON UPDATE 
45d0: 74 72 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a  triggers, then.*
45e0: 2a 20 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79  *    a temporary
45f0: 20 76 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e   vdbe cursor (in
4600: 64 65 78 20 6f 6c 64 49 64 78 29 20 6d 75 73 74  dex oldIdx) must
4610: 20 62 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69   be open and poi
4620: 6e 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61  nting at.**    a
4630: 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
4640: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62  values to be sub
4650: 73 74 69 74 75 74 65 64 20 66 6f 72 20 6f 6c 64  stituted for old
4660: 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  .* expressions i
4670: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67  n the.**    trig
4680: 67 65 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a  ger program(s)..
4690: 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
46a0: 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 0a  CodeRowTrigger(.
46b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
46c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
46d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
46e0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
46f0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55    /* One of TK_U
4700: 50 44 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54  PDATE, TK_INSERT
4710: 2c 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20  , TK_DELETE */. 
4720: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
4730: 67 65 73 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73  ges,  /* Changes
4740: 20 6c 69 73 74 20 66 6f 72 20 61 6e 79 20 55 50   list for any UP
4750: 44 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 73  DATE OF triggers
4760: 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c   */.  int tr_tm,
4770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
4780: 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c 20  e of TK_BEFORE, 
4790: 54 4b 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54 61  TK_AFTER */.  Ta
47a0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
47b0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
47c0: 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 73  to code triggers
47d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
47e0: 65 77 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  ewIdx,          
47f0: 2f 2a 20 54 68 65 20 69 6e 64 69 63 65 20 6f 66  /* The indice of
4800: 20 74 68 65 20 22 6e 65 77 22 20 72 6f 77 20 74   the "new" row t
4810: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e  o access */.  in
4820: 74 20 6f 6c 64 49 64 78 2c 20 20 20 20 20 20 20  t oldIdx,       
4830: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 69 63 65     /* The indice
4840: 20 6f 66 20 74 68 65 20 22 6f 6c 64 22 20 72 6f   of the "old" ro
4850: 77 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20  w to access */. 
4860: 20 69 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20 20   int orconf,    
4870: 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46        /* ON CONF
4880: 4c 49 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 20  LICT policy */. 
4890: 20 69 6e 74 20 69 67 6e 6f 72 65 4a 75 6d 70 20   int ignoreJump 
48a0: 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
48b0: 74 69 6f 6e 20 74 6f 20 6a 75 6d 70 20 74 6f 20  tion to jump to 
48c0: 66 6f 72 20 52 41 49 53 45 28 49 47 4e 4f 52 45  for RAISE(IGNORE
48d0: 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65  ) */.){.  Trigge
48e0: 72 20 2a 20 70 54 72 69 67 67 65 72 3b 0a 20 20  r * pTrigger;.  
48f0: 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a 20 70  TriggerStack * p
4900: 54 72 69 67 67 65 72 53 74 61 63 6b 3b 0a 0a 20  TriggerStack;.. 
4910: 20 61 73 73 65 72 74 28 6f 70 20 3d 3d 20 54 4b   assert(op == TK
4920: 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 20 3d 3d  _UPDATE || op ==
4930: 20 54 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70   TK_INSERT || op
4940: 20 3d 3d 20 54 4b 5f 44 45 4c 45 54 45 29 3b 0a   == TK_DELETE);.
4950: 20 20 61 73 73 65 72 74 28 74 72 5f 74 6d 20 3d    assert(tr_tm =
4960: 3d 20 54 4b 5f 42 45 46 4f 52 45 20 7c 7c 20 74  = TK_BEFORE || t
4970: 72 5f 74 6d 20 3d 3d 20 54 4b 5f 41 46 54 45 52  r_tm == TK_AFTER
4980: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 6e 65 77  );..  assert(new
4990: 49 64 78 20 21 3d 20 2d 31 20 7c 7c 20 6f 6c 64  Idx != -1 || old
49a0: 49 64 78 20 21 3d 20 2d 31 29 3b 0a 0a 20 20 70  Idx != -1);..  p
49b0: 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e  Trigger = pTab->
49c0: 70 54 72 69 67 67 65 72 3b 0a 20 20 77 68 69 6c  pTrigger;.  whil
49d0: 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
49e0: 20 20 20 69 6e 74 20 66 69 72 65 5f 74 68 69 73     int fire_this
49f0: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 64 65   = 0;..    /* de
4a00: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
4a10: 77 65 20 73 68 6f 75 6c 64 20 63 6f 64 65 20 74  we should code t
4a20: 68 69 73 20 74 72 69 67 67 65 72 20 2a 2f 0a 20  his trigger */. 
4a30: 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72 2d     if( pTrigger-
4a40: 3e 6f 70 20 3d 3d 20 6f 70 20 26 26 20 70 54 72  >op == op && pTr
4a50: 69 67 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 3d 20  igger->tr_tm == 
4a60: 74 72 5f 74 6d 20 26 26 20 0a 20 20 20 20 20 20  tr_tm && .      
4a70: 20 20 70 54 72 69 67 67 65 72 2d 3e 66 6f 72 65    pTrigger->fore
4a80: 61 63 68 20 3d 3d 20 54 4b 5f 52 4f 57 20 29 7b  ach == TK_ROW ){
4a90: 0a 20 20 20 20 20 20 66 69 72 65 5f 74 68 69 73  .      fire_this
4aa0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 72 69   = 1;.      pTri
4ab0: 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72  ggerStack = pPar
4ac0: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20  se->trigStack;. 
4ad0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69       while( pTri
4ae0: 67 67 65 72 53 74 61 63 6b 20 29 7b 0a 20 20 20  ggerStack ){.   
4af0: 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65       if( pTrigge
4b00: 72 53 74 61 63 6b 2d 3e 70 54 72 69 67 67 65 72  rStack->pTrigger
4b10: 20 3d 3d 20 70 54 72 69 67 67 65 72 20 29 7b 0a   == pTrigger ){.
4b20: 09 20 20 66 69 72 65 5f 74 68 69 73 20 3d 20 30  .  fire_this = 0
4b30: 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20 70 54 72  ;..}.        pTr
4b40: 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 54 72  iggerStack = pTr
4b50: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 4e 65 78  iggerStack->pNex
4b60: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
4b70: 20 69 66 28 20 6f 70 20 3d 3d 20 54 4b 5f 55 50   if( op == TK_UP
4b80: 44 41 54 45 20 26 26 20 70 54 72 69 67 67 65 72  DATE && pTrigger
4b90: 2d 3e 70 43 6f 6c 75 6d 6e 73 20 26 26 0a 20 20  ->pColumns &&.  
4ba0: 20 20 20 20 20 20 20 20 21 63 68 65 63 6b 43 6f          !checkCo
4bb0: 6c 75 6d 6e 4f 76 65 72 4c 61 70 28 70 54 72 69  lumnOverLap(pTri
4bc0: 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20  gger->pColumns, 
4bd0: 70 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20  pChanges) ){.   
4be0: 20 20 20 20 20 66 69 72 65 5f 74 68 69 73 20 3d       fire_this =
4bf0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4c00: 7d 0a 0a 20 20 20 20 69 66 28 20 66 69 72 65 5f  }..    if( fire_
4c10: 74 68 69 73 20 26 26 20 28 70 54 72 69 67 67 65  this && (pTrigge
4c20: 72 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 4d  rStack = sqliteM
4c30: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69  alloc(sizeof(Tri
4c40: 67 67 65 72 53 74 61 63 6b 29 29 29 21 3d 30 20  ggerStack)))!=0 
4c50: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64  ){.      int end
4c60: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 53  Trigger;.      S
4c70: 72 63 4c 69 73 74 20 64 75 6d 6d 79 54 61 62 6c  rcList dummyTabl
4c80: 69 73 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ist;.      Expr 
4c90: 2a 20 77 68 65 6e 45 78 70 72 3b 0a 0a 20 20 20  * whenExpr;..   
4ca0: 20 20 20 64 75 6d 6d 79 54 61 62 6c 69 73 74 2e     dummyTablist.
4cb0: 6e 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nSrc = 0;.      
4cc0: 64 75 6d 6d 79 54 61 62 6c 69 73 74 2e 61 20 3d  dummyTablist.a =
4cd0: 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 50 75   0;..      /* Pu
4ce0: 73 68 20 61 6e 20 65 6e 74 72 79 20 6f 6e 20 74  sh an entry on t
4cf0: 6f 20 74 68 65 20 74 72 69 67 67 65 72 20 73 74  o the trigger st
4d00: 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 70 54 72  ack */.      pTr
4d10: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 72 69  iggerStack->pTri
4d20: 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 3b  gger = pTrigger;
4d30: 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 53  .      pTriggerS
4d40: 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 3d 20 6e  tack->newIdx = n
4d50: 65 77 49 64 78 3b 0a 20 20 20 20 20 20 70 54 72  ewIdx;.      pTr
4d60: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
4d70: 64 78 20 3d 20 6f 6c 64 49 64 78 3b 0a 20 20 20  dx = oldIdx;.   
4d80: 20 20 20 70 54 72 69 67 67 65 72 53 74 61 63 6b     pTriggerStack
4d90: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
4da0: 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74 61       pTriggerSta
4db0: 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 72  ck->pNext = pPar
4dc0: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20  se->trigStack;. 
4dd0: 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74 61       pTriggerSta
4de0: 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 20 3d  ck->ignoreJump =
4df0: 20 69 67 6e 6f 72 65 4a 75 6d 70 3b 0a 20 20 20   ignoreJump;.   
4e00: 20 20 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53     pParse->trigS
4e10: 74 61 63 6b 20 3d 20 70 54 72 69 67 67 65 72 53  tack = pTriggerS
4e20: 74 61 63 6b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  tack;..      /* 
4e30: 63 6f 64 65 20 74 68 65 20 57 48 45 4e 20 63 6c  code the WHEN cl
4e40: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 65 6e  ause */.      en
4e50: 64 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  dTrigger = sqlit
4e60: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  eVdbeMakeLabel(p
4e70: 50 61 72 73 65 2d 3e 70 56 64 62 65 29 3b 0a 20  Parse->pVdbe);. 
4e80: 20 20 20 20 20 77 68 65 6e 45 78 70 72 20 3d 20       whenExpr = 
4e90: 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 54  sqliteExprDup(pT
4ea0: 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b 0a  rigger->pWhen);.
4eb0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
4ec0: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
4ed0: 50 61 72 73 65 2c 20 30 2c 20 26 64 75 6d 6d 79  Parse, 0, &dummy
4ee0: 54 61 62 6c 69 73 74 2c 20 30 2c 20 77 68 65 6e  Tablist, 0, when
4ef0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
4f00: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
4f10: 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69  ck = pParse->tri
4f20: 67 53 74 61 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20  gStack->pNext;. 
4f30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
4f40: 65 28 70 54 72 69 67 67 65 72 53 74 61 63 6b 29  e(pTriggerStack)
4f50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4f60: 45 78 70 72 44 65 6c 65 74 65 28 77 68 65 6e 45  ExprDelete(whenE
4f70: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  xpr);.        re
4f80: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
4f90: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
4fa0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
4fb0: 77 68 65 6e 45 78 70 72 2c 20 65 6e 64 54 72 69  whenExpr, endTri
4fc0: 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  gger, 1);.      
4fd0: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
4fe0: 28 77 68 65 6e 45 78 70 72 29 3b 0a 0a 20 20 20  (whenExpr);..   
4ff0: 20 20 20 63 6f 64 65 54 72 69 67 67 65 72 50 72     codeTriggerPr
5000: 6f 67 72 61 6d 28 70 50 61 72 73 65 2c 20 70 54  ogram(pParse, pT
5010: 72 69 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69 73  rigger->step_lis
5020: 74 2c 20 6f 72 63 6f 6e 66 29 3b 20 0a 0a 20 20  t, orconf); ..  
5030: 20 20 20 20 2f 2a 20 50 6f 70 20 74 68 65 20 65      /* Pop the e
5040: 6e 74 72 79 20 6f 66 66 20 74 68 65 20 74 72 69  ntry off the tri
5050: 67 67 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20  gger stack */.  
5060: 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72 69 67      pParse->trig
5070: 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e  Stack = pParse->
5080: 74 72 69 67 53 74 61 63 6b 2d 3e 70 4e 65 78 74  trigStack->pNext
5090: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
50a0: 65 65 28 70 54 72 69 67 67 65 72 53 74 61 63 6b  ee(pTriggerStack
50b0: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
50c0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
50d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
50e0: 65 6e 64 54 72 69 67 67 65 72 29 3b 0a 20 20 20  endTrigger);.   
50f0: 20 7d 0a 20 20 20 20 70 54 72 69 67 67 65 72 20   }.    pTrigger 
5100: 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
5110: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
5120: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 54 68 69   0;.}../*. * Thi
5130: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
5140: 6c 6c 65 64 20 74 6f 20 63 6f 64 65 20 4f 4e 20  lled to code ON 
5150: 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 44 45  UPDATE and ON DE
5160: 4c 45 54 45 20 74 72 69 67 67 65 72 73 20 6f 6e  LETE triggers on
5170: 20 0a 20 2a 20 76 69 65 77 73 2e 20 0a 20 2a 0a   . * views. . *.
5180: 20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   * This function
5190: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
51a0: 61 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  a pointed at by 
51b0: 74 68 65 20 70 57 68 65 72 65 20 61 6e 64 20 70  the pWhere and p
51c0: 43 68 61 6e 67 65 73 0a 20 2a 20 61 72 67 75 6d  Changes. * argum
51d0: 65 6e 74 73 20 62 65 66 6f 72 65 20 69 74 20 63  ents before it c
51e0: 6f 6d 70 6c 65 74 65 73 2e 0a 20 2a 2f 0a 76 6f  ompletes.. */.vo
51f0: 69 64 20 73 71 6c 69 74 65 56 69 65 77 54 72 69  id sqliteViewTri
5200: 67 67 65 72 73 28 0a 20 20 50 61 72 73 65 20 2a  ggers(.  Parse *
5210: 70 50 61 72 73 65 2c 20 0a 20 20 54 61 62 6c 65  pParse, .  Table
5220: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
5230: 2f 2a 20 54 68 65 20 76 69 65 77 20 74 6f 20 63  /* The view to c
5240: 6f 64 65 20 74 72 69 67 67 65 72 73 20 6f 6e 20  ode triggers on 
5250: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
5260: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
5270: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
5280: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
5290: 61 75 73 69 6e 67 20 74 72 69 67 67 65 72 73 2a  ausing triggers*
52a0: 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 2c 20  /.  int orconf, 
52b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
52c0: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69  ON CONFLICT poli
52d0: 63 79 20 73 70 65 63 69 66 69 65 64 20 61 73 20  cy specified as 
52e0: 70 61 72 74 20 6f 66 20 74 68 65 0a 09 09 09 20  part of the.... 
52f0: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 75 73 69   statement causi
5300: 6e 67 20 74 68 65 73 65 20 74 72 69 67 67 65 72  ng these trigger
5310: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
5320: 2a 70 43 68 61 6e 67 65 73 20 20 20 2f 2a 20 49  *pChanges   /* I
5330: 66 20 74 68 69 73 20 69 73 20 61 6e 20 73 74 61  f this is an sta
5340: 74 65 6d 65 6e 74 20 63 61 75 73 69 6e 67 20 74  tement causing t
5350: 72 69 67 67 65 72 73 20 74 6f 20 66 69 72 65 0a  riggers to fire.
5360: 09 09 09 20 20 69 73 20 61 6e 20 55 50 44 41 54  ...  is an UPDAT
5370: 45 2c 20 74 68 65 6e 20 74 68 69 73 20 6c 69 73  E, then this lis
5380: 74 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6c 75  t holds the colu
5390: 6d 6e 73 0a 09 09 09 20 20 74 6f 20 75 70 64 61  mns....  to upda
53a0: 74 65 20 61 6e 64 20 74 68 65 20 65 78 70 72 65  te and the expre
53b0: 73 73 69 6f 6e 73 20 74 6f 20 75 70 64 61 74 65  ssions to update
53c0: 20 74 68 65 6d 20 74 6f 2e 0a 09 09 09 20 20 53   them to.....  S
53d0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20  ee comments for 
53e0: 73 71 6c 69 74 65 55 70 64 61 74 65 28 29 2e 20  sqliteUpdate(). 
53f0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 49  */.){.  int oldI
5400: 64 78 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e  dx = -1;.  int n
5410: 65 77 49 64 78 20 3d 20 2d 31 3b 0a 20 20 69 6e  ewIdx = -1;.  in
5420: 74 20 2a 61 58 52 65 66 20 3d 20 30 3b 20 20 20  t *aXRef = 0;   
5430: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
5440: 74 20 65 6e 64 4f 66 4c 6f 6f 70 3b 0a 20 20 69  t endOfLoop;.  i
5450: 6e 74 20 73 74 61 72 74 4f 66 4c 6f 6f 70 3b 0a  nt startOfLoop;.
5460: 20 20 53 65 6c 65 63 74 20 74 68 65 53 65 6c 65    Select theSele
5470: 63 74 3b 0a 20 20 54 6f 6b 65 6e 20 74 62 6c 4e  ct;.  Token tblN
5480: 61 6d 65 54 6f 6b 65 6e 3b 0a 0a 20 20 61 73 73  ameToken;..  ass
5490: 65 72 74 28 70 54 61 62 2d 3e 70 53 65 6c 65 63  ert(pTab->pSelec
54a0: 74 29 3b 0a 0a 20 20 74 62 6c 4e 61 6d 65 54 6f  t);..  tblNameTo
54b0: 6b 65 6e 2e 7a 20 3d 20 70 54 61 62 2d 3e 7a 4e  ken.z = pTab->zN
54c0: 61 6d 65 3b 0a 20 20 74 62 6c 4e 61 6d 65 54 6f  ame;.  tblNameTo
54d0: 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70  ken.n = strlen(p
54e0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
54f0: 74 68 65 53 65 6c 65 63 74 2e 69 73 44 69 73 74  theSelect.isDist
5500: 69 6e 63 74 20 3d 20 30 3b 0a 20 20 74 68 65 53  inct = 0;.  theS
5510: 65 6c 65 63 74 2e 70 45 4c 69 73 74 20 3d 20 73  elect.pEList = s
5520: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
5530: 65 6e 64 28 30 2c 20 73 71 6c 69 74 65 45 78 70  end(0, sqliteExp
5540: 72 28 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20  r(TK_ALL, 0, 0, 
5550: 30 29 2c 20 30 29 3b 0a 20 20 74 68 65 53 65 6c  0), 0);.  theSel
5560: 65 63 74 2e 70 53 72 63 20 20 20 3d 20 73 71 6c  ect.pSrc   = sql
5570: 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64  iteSrcListAppend
5580: 28 30 2c 20 26 74 62 6c 4e 61 6d 65 54 6f 6b 65  (0, &tblNameToke
5590: 6e 29 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e  n);.  theSelect.
55a0: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
55b0: 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
55c0: 20 20 74 68 65 53 65 6c 65 63 74 2e 70 47 72 6f    theSelect.pGro
55d0: 75 70 42 79 20 3d 20 30 3b 0a 20 20 74 68 65 53  upBy = 0;.  theS
55e0: 65 6c 65 63 74 2e 70 48 61 76 69 6e 67 20 3d 20  elect.pHaving = 
55f0: 30 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 70  0;.  theSelect.p
5600: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 74  OrderBy = 0;.  t
5610: 68 65 53 65 6c 65 63 74 2e 6f 70 20 3d 20 54 4b  heSelect.op = TK
5620: 5f 53 45 4c 45 43 54 3b 20 2f 2a 20 3f 3f 20 2a  _SELECT; /* ?? *
5630: 2f 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 70 50  /.  theSelect.pP
5640: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 74 68 65 53  rior = 0;.  theS
5650: 65 6c 65 63 74 2e 6e 4c 69 6d 69 74 20 3d 20 2d  elect.nLimit = -
5660: 31 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 6e  1;.  theSelect.n
5670: 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 74  Offset = -1;.  t
5680: 68 65 53 65 6c 65 63 74 2e 7a 53 65 6c 65 63 74  heSelect.zSelect
5690: 20 3d 20 30 3b 0a 20 20 74 68 65 53 65 6c 65 63   = 0;.  theSelec
56a0: 74 2e 62 61 73 65 20 3d 20 30 3b 0a 0a 20 20 76  t.base = 0;..  v
56b0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
56c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
56d0: 72 74 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 42  rt(v);.  sqliteB
56e0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
56f0: 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 30 29  on(pParse, 1, 0)
5700: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
5710: 20 74 65 6d 70 20 74 61 62 6c 65 73 20 2a 2f 0a   temp tables */.
5720: 20 20 6f 6c 64 49 64 78 20 3d 20 70 50 61 72 73    oldIdx = pPars
5730: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
5740: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5750: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 6f 6c 64  OP_OpenTemp, old
5760: 49 64 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  Idx, 0);.  if( p
5770: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 6e  Changes ){.    n
5780: 65 77 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ewIdx = pParse->
5790: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nTab++;.    sqli
57a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
57b0: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 6e 65 77 49  P_OpenTemp, newI
57c0: 64 78 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  dx, 0);.  }..  /
57d0: 2a 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20 76  * Snapshot the v
57e0: 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  iew */.  if( sql
57f0: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
5800: 2c 20 26 74 68 65 53 65 6c 65 63 74 2c 20 53 52  , &theSelect, SR
5810: 54 5f 54 61 62 6c 65 2c 20 6f 6c 64 49 64 78 2c  T_Table, oldIdx,
5820: 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20   0, 0, 0) ){.   
5830: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
5840: 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eanup;.  }..  /*
5850: 20 6c 6f 6f 70 20 74 68 72 75 20 74 68 65 20 76   loop thru the v
5860: 69 65 77 20 73 6e 61 70 73 68 6f 74 2c 20 65 78  iew snapshot, ex
5870: 65 63 75 74 69 6e 67 20 74 72 69 67 67 65 72 73  ecuting triggers
5880: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 2a 2f   for each row */
5890: 0a 20 20 65 6e 64 4f 66 4c 6f 6f 70 20 3d 20 73  .  endOfLoop = s
58a0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
58b0: 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 56  el(v);.  sqliteV
58c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
58d0: 65 77 69 6e 64 2c 20 6f 6c 64 49 64 78 2c 20 65  ewind, oldIdx, e
58e0: 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20 2f 2a  ndOfLoop);..  /*
58f0: 20 4c 6f 6f 70 20 74 68 72 75 20 74 68 65 20 76   Loop thru the v
5900: 69 65 77 20 73 6e 61 70 73 68 6f 74 2c 20 65 78  iew snapshot, ex
5910: 65 63 75 74 69 6e 67 20 74 72 69 67 67 65 72 73  ecuting triggers
5920: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 2a 2f   for each row */
5930: 0a 20 20 73 74 61 72 74 4f 66 4c 6f 6f 70 20 3d  .  startOfLoop =
5940: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
5950: 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a  ntAddr(v);..  /*
5960: 20 42 75 69 6c 64 20 74 68 65 20 75 70 64 61 74   Build the updat
5970: 65 64 20 72 6f 77 20 69 66 20 72 65 71 75 69 72  ed row if requir
5980: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 43 68 61  ed */.  if( pCha
5990: 6e 67 65 73 20 29 7b 0a 20 20 20 20 69 6e 74 20  nges ){.    int 
59a0: 69 69 3b 0a 0a 20 20 20 20 61 58 52 65 66 20 3d  ii;..    aXRef =
59b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
59c0: 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 70 54 61  izeof(int) * pTa
59d0: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 69  b->nCol );.    i
59e0: 66 28 20 61 58 52 65 66 3d 3d 30 20 29 20 67 6f  f( aXRef==0 ) go
59f0: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
5a00: 75 70 3b 0a 20 20 20 20 66 6f 72 28 69 69 20 3d  up;.    for(ii =
5a10: 20 30 3b 20 69 69 20 3c 20 70 54 61 62 2d 3e 6e   0; ii < pTab->n
5a20: 43 6f 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Col; ii++){.    
5a30: 20 20 61 58 52 65 66 5b 69 69 5d 20 3d 20 2d 31    aXRef[ii] = -1
5a40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
5a50: 28 69 69 3d 30 3b 20 69 69 3c 70 43 68 61 6e 67  (ii=0; ii<pChang
5a60: 65 73 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  es->nExpr; ii++)
5a70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a  {.      int jj;.
5a80: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5a90: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
5aa0: 50 61 72 73 65 2c 20 6f 6c 64 49 64 78 2c 20 74  Parse, oldIdx, t
5ab0: 68 65 53 65 6c 65 63 74 2e 70 53 72 63 20 2c 20  heSelect.pSrc , 
5ac0: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
5ad0: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 69 5d 2e  pChanges->a[ii].
5ae0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
5af0: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
5b00: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a  leanup;.      }.
5b10: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
5b20: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
5b30: 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69  e, pChanges->a[i
5b40: 69 5d 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 20  i].pExpr, 0, 0) 
5b50: 29 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74  ).        goto t
5b60: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
5b70: 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
5b80: 20 6a 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20   jj<pTab->nCol; 
5b90: 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
5ba0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
5bb0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 6a 5d 2e  (pTab->aCol[jj].
5bc0: 7a 4e 61 6d 65 2c 20 70 43 68 61 6e 67 65 73 2d  zName, pChanges-
5bd0: 3e 61 5b 69 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  >a[ii].zName)==0
5be0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 58   ){.          aX
5bf0: 52 65 66 5b 6a 6a 5d 20 3d 20 69 69 3b 0a 20 20  Ref[jj] = ii;.  
5c00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5c10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5c20: 0a 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 70  .      if( jj>=p
5c30: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
5c40: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
5c50: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
5c60: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
5c70: 63 6f 6c 75 6d 6e 3a 20 22 2c 20 0a 20 20 20 20  column: ", .    
5c80: 20 20 20 20 20 20 20 20 70 43 68 61 6e 67 65 73          pChanges
5c90: 2d 3e 61 5b 69 69 5d 2e 7a 4e 61 6d 65 2c 20 30  ->a[ii].zName, 0
5ca0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
5cb0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5cc0: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
5cd0: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
5ce0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
5cf0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5d00: 50 5f 49 6e 74 65 67 65 72 2c 20 31 33 2c 20 30  P_Integer, 13, 0
5d10: 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 20 3d  );..    for(ii =
5d20: 20 30 3b 20 69 69 3c 70 54 61 62 2d 3e 6e 43 6f   0; ii<pTab->nCo
5d30: 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  l; ii++){.      
5d40: 69 66 28 20 61 58 52 65 66 5b 69 69 5d 20 3c 20  if( aXRef[ii] < 
5d50: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 73 71  0 ){ .        sq
5d60: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5d70: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 6f 6c 64 49   OP_Column, oldI
5d80: 64 78 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d  dx, ii);.      }
5d90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5da0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
5db0: 72 73 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61  rse, pChanges->a
5dc0: 5b 61 58 52 65 66 5b 69 69 5d 5d 2e 70 45 78 70  [aXRef[ii]].pExp
5dd0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
5de0: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  }..    sqliteVdb
5df0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
5e00: 65 52 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e 6e  eRecord, pTab->n
5e10: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Col, 0);.    sql
5e20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5e30: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 6e 65  OP_PutIntKey, ne
5e40: 77 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71  wIdx, 0);.    sq
5e50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5e60: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 6e 65 77 49   OP_Rewind, newI
5e70: 64 78 2c 20 30 29 3b 0a 0a 20 20 20 20 73 71 6c  dx, 0);..    sql
5e80: 69 74 65 43 6f 64 65 52 6f 77 54 72 69 67 67 65  iteCodeRowTrigge
5e90: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 55 50 44  r(pParse, TK_UPD
5ea0: 41 54 45 2c 20 70 43 68 61 6e 67 65 73 2c 20 54  ATE, pChanges, T
5eb0: 4b 5f 42 45 46 4f 52 45 2c 20 0a 20 20 20 20 20  K_BEFORE, .     
5ec0: 20 20 20 70 54 61 62 2c 20 6e 65 77 49 64 78 2c     pTab, newIdx,
5ed0: 20 6f 6c 64 49 64 78 2c 20 6f 72 63 6f 6e 66 2c   oldIdx, orconf,
5ee0: 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20   endOfLoop);.   
5ef0: 20 73 71 6c 69 74 65 43 6f 64 65 52 6f 77 54 72   sqliteCodeRowTr
5f00: 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 54 4b  igger(pParse, TK
5f10: 5f 55 50 44 41 54 45 2c 20 70 43 68 61 6e 67 65  _UPDATE, pChange
5f20: 73 2c 20 54 4b 5f 41 46 54 45 52 2c 20 0a 20 20  s, TK_AFTER, .  
5f30: 20 20 20 20 20 20 70 54 61 62 2c 20 6e 65 77 49        pTab, newI
5f40: 64 78 2c 20 6f 6c 64 49 64 78 2c 20 6f 72 63 6f  dx, oldIdx, orco
5f50: 6e 66 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a  nf, endOfLoop);.
5f60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
5f70: 69 74 65 43 6f 64 65 52 6f 77 54 72 69 67 67 65  iteCodeRowTrigge
5f80: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 45 4c  r(pParse, TK_DEL
5f90: 45 54 45 2c 20 30 2c 20 54 4b 5f 42 45 46 4f 52  ETE, 0, TK_BEFOR
5fa0: 45 2c 20 70 54 61 62 2c 20 2d 31 2c 20 6f 6c 64  E, pTab, -1, old
5fb0: 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20 6f 72  Idx, .        or
5fc0: 63 6f 6e 66 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29  conf, endOfLoop)
5fd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 64 65  ;.    sqliteCode
5fe0: 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73  RowTrigger(pPars
5ff0: 65 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c  e, TK_DELETE, 0,
6000: 20 54 4b 5f 41 46 54 45 52 2c 20 70 54 61 62 2c   TK_AFTER, pTab,
6010: 20 2d 31 2c 20 6f 6c 64 49 64 78 2c 20 0a 20 20   -1, oldIdx, .  
6020: 20 20 20 20 20 20 6f 72 63 6f 6e 66 2c 20 65 6e        orconf, en
6030: 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 7d 0a 0a 20  dOfLoop);.  }.. 
6040: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6050: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 6f 6c 64  (v, OP_Next, old
6060: 49 64 78 2c 20 73 74 61 72 74 4f 66 4c 6f 6f 70  Idx, startOfLoop
6070: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 56 64 62 65  );..  sqliteVdbe
6080: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
6090: 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 73 71  endOfLoop);.  sq
60a0: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
60b0: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 0a  ation(pParse);..
60c0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a  trigger_cleanup:
60d0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 61 58  .  sqliteFree(aX
60e0: 52 65 66 29 3b 0a 20 20 73 71 6c 69 74 65 45 78  Ref);.  sqliteEx
60f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 43 68  prListDelete(pCh
6100: 61 6e 67 65 73 29 3b 0a 20 20 73 71 6c 69 74 65  anges);.  sqlite
6110: 45 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72  ExprDelete(pWher
6120: 65 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  e);.  sqliteExpr
6130: 4c 69 73 74 44 65 6c 65 74 65 28 74 68 65 53 65  ListDelete(theSe
6140: 6c 65 63 74 2e 70 45 4c 69 73 74 29 3b 0a 20 20  lect.pEList);.  
6150: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c  sqliteSrcListDel
6160: 65 74 65 28 74 68 65 53 65 6c 65 63 74 2e 70 53  ete(theSelect.pS
6170: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  rc);.  sqliteExp
6180: 72 44 65 6c 65 74 65 28 74 68 65 53 65 6c 65 63  rDelete(theSelec
6190: 74 2e 70 57 68 65 72 65 29 3b 0a 20 20 72 65 74  t.pWhere);.  ret
61a0: 75 72 6e 3b 0a 7d 0a                             urn;.}.