/ Hex Artifact Content
Login

Artifact 1e751f8d5ceeb328d26bf1ccfb2de50653670d49:


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 2a 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  *.**.**.** $Id: 
0170: 74 72 69 67 67 65 72 2e 63 2c 76 20 31 2e 31 32  trigger.c,v 1.12
0180: 36 20 32 30 30 38 2f 30 35 2f 31 36 20 30 34 3a  6 2008/05/16 04:
0190: 35 31 3a 35 35 20 64 61 6e 69 65 6c 6b 31 39 37  51:55 danielk197
01a0: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
01b0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
01c0: 22 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  "..#ifndef SQLIT
01d0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f  E_OMIT_TRIGGER./
01e0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 6c 69  *.** Delete a li
01f0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 54 72 69  nked list of Tri
0200: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
0210: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0220: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
0230: 72 53 74 65 70 28 54 72 69 67 67 65 72 53 74 65  rStep(TriggerSte
0240: 70 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 29  p *pTriggerStep)
0250: 7b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67  {.  while( pTrig
0260: 67 65 72 53 74 65 70 20 29 7b 0a 20 20 20 20 54  gerStep ){.    T
0270: 72 69 67 67 65 72 53 74 65 70 20 2a 20 70 54 6d  riggerStep * pTm
0280: 70 20 3d 20 70 54 72 69 67 67 65 72 53 74 65 70  p = pTriggerStep
0290: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
02a0: 65 70 20 3d 20 70 54 72 69 67 67 65 72 53 74 65  ep = pTriggerSte
02b0: 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 69  p->pNext;..    i
02c0: 66 28 20 70 54 6d 70 2d 3e 74 61 72 67 65 74 2e  f( pTmp->target.
02d0: 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72  dyn ) sqlite3_fr
02e0: 65 65 28 28 63 68 61 72 2a 29 70 54 6d 70 2d 3e  ee((char*)pTmp->
02f0: 74 61 72 67 65 74 2e 7a 29 3b 0a 20 20 20 20 73  target.z);.    s
0300: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0310: 28 70 54 6d 70 2d 3e 70 57 68 65 72 65 29 3b 0a  (pTmp->pWhere);.
0320: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
0330: 69 73 74 44 65 6c 65 74 65 28 70 54 6d 70 2d 3e  istDelete(pTmp->
0340: 70 45 78 70 72 4c 69 73 74 29 3b 0a 20 20 20 20  pExprList);.    
0350: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
0360: 65 74 65 28 70 54 6d 70 2d 3e 70 53 65 6c 65 63  ete(pTmp->pSelec
0370: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  t);.    sqlite3I
0380: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6d 70  dListDelete(pTmp
0390: 2d 3e 70 49 64 4c 69 73 74 29 3b 0a 0a 20 20 20  ->pIdList);..   
03a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
03b0: 6d 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  mp);.  }.}../*.*
03c0: 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
03d0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
03e0: 68 65 6e 20 69 74 20 73 65 65 73 20 61 20 43 52  hen it sees a CR
03f0: 45 41 54 45 20 54 52 49 47 47 45 52 20 73 74 61  EATE TRIGGER sta
0400: 74 65 6d 65 6e 74 0a 2a 2a 20 75 70 20 74 6f 20  tement.** up to 
0410: 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 74 68 65  the point of the
0420: 20 42 45 47 49 4e 20 62 65 66 6f 72 65 20 74 68   BEGIN before th
0430: 65 20 74 72 69 67 67 65 72 20 61 63 74 69 6f 6e  e trigger action
0440: 73 2e 20 20 41 20 54 72 69 67 67 65 72 0a 2a 2a  s.  A Trigger.**
0450: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 67 65   structure is ge
0460: 6e 65 72 61 74 65 64 20 62 61 73 65 64 20 6f 6e  nerated based on
0470: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
0480: 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 64 20 73   available and s
0490: 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 50 61 72  tored.** in pPar
04a0: 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 2e  se->pNewTrigger.
04b0: 20 20 41 66 74 65 72 20 74 68 65 20 74 72 69 67    After the trig
04c0: 67 65 72 20 61 63 74 69 6f 6e 73 20 68 61 76 65  ger actions have
04d0: 20 62 65 65 6e 20 70 61 72 73 65 64 2c 20 74 68   been parsed, th
04e0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 69  e.** sqlite3Fini
04f0: 73 68 54 72 69 67 67 65 72 28 29 20 66 75 6e 63  shTrigger() func
0500: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
0510: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 74  o complete the t
0520: 72 69 67 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 72  rigger.** constr
0530: 75 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 0a  uction process..
0540: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
0550: 65 67 69 6e 54 72 69 67 67 65 72 28 0a 20 20 50  eginTrigger(.  P
0560: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
0570: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
0580: 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 43  context of the C
0590: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 73 74  REATE TRIGGER st
05a0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
05b0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
05c0: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   /* The name of 
05d0: 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a 20  the trigger */. 
05e0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
05f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65       /* The name
0600: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
0610: 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20  */.  int tr_tm, 
0620: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
0630: 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b  of TK_BEFORE, TK
0640: 5f 41 46 54 45 52 2c 20 54 4b 5f 49 4e 53 54 45  _AFTER, TK_INSTE
0650: 41 44 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  AD */.  int op, 
0660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
0670: 6e 65 20 6f 66 20 54 4b 5f 49 4e 53 45 52 54 2c  ne of TK_INSERT,
0680: 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f 44   TK_UPDATE, TK_D
0690: 45 4c 45 54 45 20 2a 2f 0a 20 20 49 64 4c 69 73  ELETE */.  IdLis
06a0: 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 2f  t *pColumns,   /
06b0: 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 69 66  * column list if
06c0: 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41   this is an UPDA
06d0: 54 45 20 4f 46 20 74 72 69 67 67 65 72 20 2a 2f  TE OF trigger */
06e0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
06f0: 6c 65 4e 61 6d 65 2c 2f 2a 20 54 68 65 20 6e 61  leName,/* The na
0700: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2f  me of the table/
0710: 76 69 65 77 20 74 68 65 20 74 72 69 67 67 65 72  view the trigger
0720: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
0730: 20 45 78 70 72 20 2a 70 57 68 65 6e 2c 20 20 20   Expr *pWhen,   
0740: 20 20 20 20 20 2f 2a 20 57 48 45 4e 20 63 6c 61       /* WHEN cla
0750: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  use */.  int isT
0760: 65 6d 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  emp,         /* 
0770: 54 72 75 65 20 69 66 20 74 68 65 20 54 45 4d 50  True if the TEMP
0780: 4f 52 41 52 59 20 6b 65 79 77 6f 72 64 20 69 73  ORARY keyword is
0790: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
07a0: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20  t noErr         
07b0: 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72    /* Suppress er
07c0: 72 6f 72 73 20 69 66 20 74 68 65 20 74 72 69 67  rors if the trig
07d0: 67 65 72 20 61 6c 72 65 61 64 79 20 65 78 69 73  ger already exis
07e0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  ts */.){.  Trigg
07f0: 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20 30  er *pTrigger = 0
0800: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
0810: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
0820: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61   0;        /* Na
0830: 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  me of the trigge
0840: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
0850: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0860: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
0870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0880: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 73 74  e database to st
0890: 6f 72 65 20 74 68 65 20 74 72 69 67 67 65 72 20  ore the trigger 
08a0: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
08b0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
08c0: 2f 2a 20 54 68 65 20 75 6e 71 75 61 6c 69 66 69  /* The unqualifi
08d0: 65 64 20 64 62 20 6e 61 6d 65 20 2a 2f 0a 20 20  ed db name */.  
08e0: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
08f0: 69 6e 74 20 69 54 61 62 44 62 3b 0a 0a 20 20 61  int iTabDb;..  a
0900: 73 73 65 72 74 28 20 70 4e 61 6d 65 31 21 3d 30  ssert( pName1!=0
0910: 20 29 3b 20 20 20 2f 2a 20 70 4e 61 6d 65 31 2d   );   /* pName1-
0920: 3e 7a 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  >z might be NULL
0930: 2c 20 62 75 74 20 6e 6f 74 20 70 4e 61 6d 65 31  , but not pName1
0940: 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 61 73 73   itself */.  ass
0950: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29  ert( pName2!=0 )
0960: 3b 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29  ;.  if( isTemp )
0970: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 54 45 4d 50  {.    /* If TEMP
0980: 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20   was specified, 
0990: 74 68 65 6e 20 74 68 65 20 74 72 69 67 67 65 72  then the trigger
09a0: 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65   name may not be
09b0: 20 71 75 61 6c 69 66 69 65 64 2e 20 2a 2f 0a 20   qualified. */. 
09c0: 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e     if( pName2->n
09d0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
09e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
09f0: 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74  se, "temporary t
0a00: 72 69 67 67 65 72 20 6d 61 79 20 6e 6f 74 20 68  rigger may not h
0a10: 61 76 65 20 71 75 61 6c 69 66 69 65 64 20 6e 61  ave qualified na
0a20: 6d 65 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  me");.      goto
0a30: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
0a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 44 62 20  ;.    }.    iDb 
0a50: 3d 20 31 3b 0a 20 20 20 20 70 4e 61 6d 65 20 3d  = 1;.    pName =
0a60: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73 65   pName1;.  }else
0a70: 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
0a80: 6f 75 74 20 74 68 65 20 64 62 20 74 68 61 74 20  out the db that 
0a90: 74 68 65 20 74 68 65 20 74 72 69 67 67 65 72 20  the the trigger 
0aa0: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
0ab0: 69 6e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  in */.    iDb = 
0ac0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
0ad0: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
0ae0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
0af0: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
0b00: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
0b10: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
0b20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
0b30: 20 49 66 20 74 68 65 20 74 72 69 67 67 65 72 20   If the trigger 
0b40: 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69  name was unquali
0b50: 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 74 61  fied, and the ta
0b60: 62 6c 65 20 69 73 20 61 20 74 65 6d 70 20 74 61  ble is a temp ta
0b70: 62 6c 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 73  ble,.  ** then s
0b80: 65 74 20 69 44 62 20 74 6f 20 31 20 74 6f 20 63  et iDb to 1 to c
0b90: 72 65 61 74 65 20 74 68 65 20 74 72 69 67 67 65  reate the trigge
0ba0: 72 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  r in the tempora
0bb0: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ry database..  *
0bc0: 2a 20 49 66 20 73 71 6c 69 74 65 33 53 72 63 4c  * If sqlite3SrcL
0bd0: 69 73 74 4c 6f 6f 6b 75 70 28 29 20 72 65 74 75  istLookup() retu
0be0: 72 6e 73 20 30 2c 20 69 6e 64 69 63 61 74 69 6e  rns 0, indicatin
0bf0: 67 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73  g the table does
0c00: 20 6e 6f 74 0a 20 20 2a 2a 20 65 78 69 73 74 2c   not.  ** exist,
0c10: 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 63 61   the error is ca
0c20: 75 67 68 74 20 62 79 20 74 68 65 20 62 6c 6f 63  ught by the bloc
0c30: 6b 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  k below..  */.  
0c40: 69 66 28 20 21 70 54 61 62 6c 65 4e 61 6d 65 20  if( !pTableName 
0c50: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
0c60: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
0c70: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
0c80: 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71  .  }.  pTab = sq
0c90: 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
0ca0: 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  up(pParse, pTabl
0cb0: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e  eName);.  if( pN
0cc0: 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
0cd0: 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  ab && pTab->pSch
0ce0: 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
0cf0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69  pSchema ){.    i
0d00: 44 62 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  Db = 1;.  }..  /
0d10: 2a 20 45 6e 73 75 72 65 20 74 68 65 20 74 61 62  * Ensure the tab
0d20: 6c 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20  le name matches 
0d30: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 61 6e  database name an
0d40: 64 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  d that the table
0d50: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28   exists */.  if(
0d60: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0d70: 64 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72  d ) goto trigger
0d80: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 61 73 73 65  _cleanup;.  asse
0d90: 72 74 28 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e  rt( pTableName->
0da0: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
0db0: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
0dc0: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
0dd0: 44 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20 70  Db, "trigger", p
0de0: 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20  Name) && .      
0df0: 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
0e00: 74 28 26 73 46 69 78 2c 20 70 54 61 62 6c 65 4e  t(&sFix, pTableN
0e10: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
0e20: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
0e30: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73  ;.  }.  pTab = s
0e40: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
0e50: 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62  kup(pParse, pTab
0e60: 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  leName);.  if( !
0e70: 70 54 61 62 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pTab ){.    /* T
0e80: 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  he table does no
0e90: 74 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20  t exist. */.    
0ea0: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
0eb0: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20  anup;.  }.  if( 
0ec0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
0ed0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
0ee0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
0ef0: 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74 72  cannot create tr
0f00: 69 67 67 65 72 73 20 6f 6e 20 76 69 72 74 75 61  iggers on virtua
0f10: 6c 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  l tables");.    
0f20: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
0f30: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
0f40: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 74  Check that the t
0f50: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 6e  rigger name is n
0f60: 6f 74 20 72 65 73 65 72 76 65 64 20 61 6e 64 20  ot reserved and 
0f70: 74 68 61 74 20 6e 6f 20 74 72 69 67 67 65 72 20  that no trigger 
0f80: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 70 65 63  of the.  ** spec
0f90: 69 66 69 65 64 20 6e 61 6d 65 20 65 78 69 73 74  ified name exist
0fa0: 73 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  s */.  zName = s
0fb0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
0fc0: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
0fd0: 20 20 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20    if( !zName || 
0fe0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
0ff0: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
1000: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
1010: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69   ){.    goto tri
1020: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
1030: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 48  }.  if( sqlite3H
1040: 61 73 68 46 69 6e 64 28 26 28 64 62 2d 3e 61 44  ashFind(&(db->aD
1050: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
1060: 74 72 69 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65  trigHash), zName
1070: 2c 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 20  ,strlen(zName)) 
1080: 29 7b 0a 20 20 20 20 69 66 28 20 21 6e 6f 45 72  ){.    if( !noEr
1090: 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
10a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10b0: 65 2c 20 22 74 72 69 67 67 65 72 20 25 54 20 61  e, "trigger %T a
10c0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
10d0: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pName);.    }.  
10e0: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
10f0: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  leanup;.  }..  /
1100: 2a 20 44 6f 20 6e 6f 74 20 63 72 65 61 74 65 20  * Do not create 
1110: 61 20 74 72 69 67 67 65 72 20 6f 6e 20 61 20 73  a trigger on a s
1120: 79 73 74 65 6d 20 74 61 62 6c 65 20 2a 2f 0a 20  ystem table */. 
1130: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
1140: 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
1150: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
1160: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1170: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1180: 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65  , "cannot create
1190: 20 74 72 69 67 67 65 72 20 6f 6e 20 73 79 73 74   trigger on syst
11a0: 65 6d 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  em table");.    
11b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
11c0: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
11d0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
11e0: 20 2f 2a 20 49 4e 53 54 45 41 44 20 6f 66 20 74   /* INSTEAD of t
11f0: 72 69 67 67 65 72 73 20 61 72 65 20 6f 6e 6c 79  riggers are only
1200: 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 76   for views and v
1210: 69 65 77 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  iews only suppor
1220: 74 20 49 4e 53 54 45 41 44 0a 20 20 2a 2a 20 6f  t INSTEAD.  ** o
1230: 66 20 74 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f  f triggers..  */
1240: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
1250: 6c 65 63 74 20 26 26 20 74 72 5f 74 6d 21 3d 54  lect && tr_tm!=T
1260: 4b 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20  K_INSTEAD ){.   
1270: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1280: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
1290: 20 63 72 65 61 74 65 20 25 73 20 74 72 69 67 67   create %s trigg
12a0: 65 72 20 6f 6e 20 76 69 65 77 3a 20 25 53 22 2c  er on view: %S",
12b0: 20 0a 20 20 20 20 20 20 20 20 28 74 72 5f 74 6d   .        (tr_tm
12c0: 20 3d 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f 22   == TK_BEFORE)?"
12d0: 42 45 46 4f 52 45 22 3a 22 41 46 54 45 52 22 2c  BEFORE":"AFTER",
12e0: 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b   pTableName, 0);
12f0: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
1300: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  r_cleanup;.  }. 
1310: 20 69 66 28 20 21 70 54 61 62 2d 3e 70 53 65 6c   if( !pTab->pSel
1320: 65 63 74 20 26 26 20 74 72 5f 74 6d 3d 3d 54 4b  ect && tr_tm==TK
1330: 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20  _INSTEAD ){.    
1340: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1350: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
1360: 63 72 65 61 74 65 20 49 4e 53 54 45 41 44 20 4f  create INSTEAD O
1370: 46 22 0a 20 20 20 20 20 20 20 20 22 20 74 72 69  F".        " tri
1380: 67 67 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20 25  gger on table: %
1390: 53 22 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20  S", pTableName, 
13a0: 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69  0);.    goto tri
13b0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
13c0: 7d 0a 20 20 69 54 61 62 44 62 20 3d 20 73 71 6c  }.  iTabDb = sql
13d0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
13e0: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
13f0: 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
1400: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1410: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
1420: 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
1430: 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45  TE_CREATE_TRIGGE
1440: 52 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  R;.    const cha
1450: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
1460: 5b 69 54 61 62 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  [iTabDb].zName;.
1470: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1480: 7a 44 62 54 72 69 67 20 3d 20 69 73 54 65 6d 70  zDbTrig = isTemp
1490: 20 3f 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e   ? db->aDb[1].zN
14a0: 61 6d 65 20 3a 20 7a 44 62 3b 0a 20 20 20 20 69  ame : zDb;.    i
14b0: 66 28 20 69 54 61 62 44 62 3d 3d 31 20 7c 7c 20  f( iTabDb==1 || 
14c0: 69 73 54 65 6d 70 20 29 20 63 6f 64 65 20 3d 20  isTemp ) code = 
14d0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
14e0: 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20  MP_TRIGGER;.    
14f0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1500: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
1510: 65 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  e, zName, pTab->
1520: 7a 4e 61 6d 65 2c 20 7a 44 62 54 72 69 67 29 20  zName, zDbTrig) 
1530: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72  ){.      goto tr
1540: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
1550: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
1560: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1570: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
1580: 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
1590: 45 28 69 54 61 62 44 62 29 2c 30 2c 7a 44 62 29  E(iTabDb),0,zDb)
15a0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72  ){.      goto tr
15b0: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
15c0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
15d0: 0a 20 20 2f 2a 20 49 4e 53 54 45 41 44 20 4f 46  .  /* INSTEAD OF
15e0: 20 74 72 69 67 67 65 72 73 20 63 61 6e 20 6f 6e   triggers can on
15f0: 6c 79 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65  ly appear on vie
1600: 77 73 20 61 6e 64 20 42 45 46 4f 52 45 20 74 72  ws and BEFORE tr
1610: 69 67 67 65 72 73 0a 20 20 2a 2a 20 63 61 6e 6e  iggers.  ** cann
1620: 6f 74 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65  ot appear on vie
1630: 77 73 2e 20 20 53 6f 20 77 65 20 6d 69 67 68 74  ws.  So we might
1640: 20 61 73 20 77 65 6c 6c 20 74 72 61 6e 73 6c 61   as well transla
1650: 74 65 20 65 76 65 72 79 0a 20 20 2a 2a 20 49 4e  te every.  ** IN
1660: 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65 72  STEAD OF trigger
1670: 20 69 6e 74 6f 20 61 20 42 45 46 4f 52 45 20 74   into a BEFORE t
1680: 72 69 67 67 65 72 2e 20 20 49 74 20 73 69 6d 70  rigger.  It simp
1690: 6c 69 66 69 65 73 20 63 6f 64 65 0a 20 20 2a 2a  lifies code.  **
16a0: 20 65 6c 73 65 77 68 65 72 65 2e 0a 20 20 2a 2f   elsewhere..  */
16b0: 0a 20 20 69 66 20 28 74 72 5f 74 6d 20 3d 3d 20  .  if (tr_tm == 
16c0: 54 4b 5f 49 4e 53 54 45 41 44 29 7b 0a 20 20 20  TK_INSTEAD){.   
16d0: 20 74 72 5f 74 6d 20 3d 20 54 4b 5f 42 45 46 4f   tr_tm = TK_BEFO
16e0: 52 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75  RE;.  }..  /* Bu
16f0: 69 6c 64 20 74 68 65 20 54 72 69 67 67 65 72 20  ild the Trigger 
1700: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 54 72 69  object */.  pTri
1710: 67 67 65 72 20 3d 20 28 54 72 69 67 67 65 72 2a  gger = (Trigger*
1720: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1730: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1740: 54 72 69 67 67 65 72 29 29 3b 0a 20 20 69 66 28  Trigger));.  if(
1750: 20 70 54 72 69 67 67 65 72 3d 3d 30 20 29 20 67   pTrigger==0 ) g
1760: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
1770: 6e 75 70 3b 0a 20 20 70 54 72 69 67 67 65 72 2d  nup;.  pTrigger-
1780: 3e 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  >name = zName;. 
1790: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54   zName = 0;.  pT
17a0: 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 20 3d 20  rigger->table = 
17b0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
17c0: 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e  db, pTableName->
17d0: 61 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 70  a[0].zName);.  p
17e0: 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
17f0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1800: 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 72 69 67  pSchema;.  pTrig
1810: 67 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20  ger->pTabSchema 
1820: 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b  = pTab->pSchema;
1830: 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 20  .  pTrigger->op 
1840: 3d 20 6f 70 3b 0a 20 20 70 54 72 69 67 67 65 72  = op;.  pTrigger
1850: 2d 3e 74 72 5f 74 6d 20 3d 20 74 72 5f 74 6d 3d  ->tr_tm = tr_tm=
1860: 3d 54 4b 5f 42 45 46 4f 52 45 20 3f 20 54 52 49  =TK_BEFORE ? TRI
1870: 47 47 45 52 5f 42 45 46 4f 52 45 20 3a 20 54 52  GGER_BEFORE : TR
1880: 49 47 47 45 52 5f 41 46 54 45 52 3b 0a 20 20 70  IGGER_AFTER;.  p
1890: 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 20 3d  Trigger->pWhen =
18a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
18b0: 64 62 2c 20 70 57 68 65 6e 29 3b 0a 20 20 70 54  db, pWhen);.  pT
18c0: 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73  rigger->pColumns
18d0: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
18e0: 44 75 70 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73  Dup(db, pColumns
18f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 6f 6b 65  );.  sqlite3Toke
1900: 6e 43 6f 70 79 28 64 62 2c 20 26 70 54 72 69 67  nCopy(db, &pTrig
1910: 67 65 72 2d 3e 6e 61 6d 65 54 6f 6b 65 6e 2c 70  ger->nameToken,p
1920: 4e 61 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Name);.  assert(
1930: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69   pParse->pNewTri
1940: 67 67 65 72 3d 3d 30 20 29 3b 0a 20 20 70 50 61  gger==0 );.  pPa
1950: 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72  rse->pNewTrigger
1960: 20 3d 20 70 54 72 69 67 67 65 72 3b 0a 0a 74 72   = pTrigger;..tr
1970: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20  igger_cleanup:. 
1980: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
1990: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ame);.  sqlite3S
19a0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61  rcListDelete(pTa
19b0: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  bleName);.  sqli
19c0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
19d0: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73 71 6c  pColumns);.  sql
19e0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
19f0: 57 68 65 6e 29 3b 0a 20 20 69 66 28 20 21 70 50  When);.  if( !pP
1a00: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
1a10: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1a20: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 70 54  DeleteTrigger(pT
1a30: 72 69 67 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  rigger);.  }else
1a40: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1a50: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
1a60: 72 3d 3d 70 54 72 69 67 67 65 72 20 29 3b 0a 20  r==pTrigger );. 
1a70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
1a80: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1a90: 65 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20  ed after all of 
1aa0: 74 68 65 20 74 72 69 67 67 65 72 20 61 63 74 69  the trigger acti
1ab0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 70 61  ons have been pa
1ac0: 72 73 65 64 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  rsed.** in order
1ad0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
1ae0: 20 70 72 6f 63 65 73 73 20 6f 66 20 62 75 69 6c   process of buil
1af0: 64 69 6e 67 20 74 68 65 20 74 72 69 67 67 65 72  ding the trigger
1b00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b10: 33 46 69 6e 69 73 68 54 72 69 67 67 65 72 28 0a  3FinishTrigger(.
1b20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1b40: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
1b50: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 53   TriggerStep *pS
1b60: 74 65 70 4c 69 73 74 2c 20 2f 2a 20 54 68 65 20  tepList, /* The 
1b70: 74 72 69 67 67 65 72 65 64 20 70 72 6f 67 72 61  triggered progra
1b80: 6d 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41  m */.  Token *pA
1b90: 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ll             /
1ba0: 2a 20 54 6f 6b 65 6e 20 74 68 61 74 20 64 65 73  * Token that des
1bb0: 63 72 69 62 65 73 20 74 68 65 20 63 6f 6d 70 6c  cribes the compl
1bc0: 65 74 65 20 43 52 45 41 54 45 20 54 52 49 47 47  ete CREATE TRIGG
1bd0: 45 52 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  ER */.){.  Trigg
1be0: 65 72 20 2a 70 54 72 69 67 20 3d 20 30 3b 20 20  er *pTrig = 0;  
1bf0: 20 20 20 2f 2a 20 54 68 65 20 74 72 69 67 67 65     /* The trigge
1c00: 72 20 77 68 6f 73 65 20 63 6f 6e 73 74 72 75 63  r whose construc
1c10: 74 69 6f 6e 20 69 73 20 66 69 6e 69 73 68 69 6e  tion is finishin
1c20: 67 20 75 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g up */.  sqlite
1c30: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1c40: 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
1c50: 62 61 73 65 20 2a 2f 0a 20 20 44 62 46 69 78 65  base */.  DbFixe
1c60: 72 20 73 46 69 78 3b 0a 20 20 69 6e 74 20 69 44  r sFix;.  int iD
1c70: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1c80: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1c90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1ca0: 74 72 69 67 67 65 72 20 2a 2f 0a 0a 20 20 70 54  trigger */..  pT
1cb0: 72 69 67 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  rig = pParse->pN
1cc0: 65 77 54 72 69 67 67 65 72 3b 0a 20 20 70 50 61  ewTrigger;.  pPa
1cd0: 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72  rse->pNewTrigger
1ce0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72   = 0;.  if( pPar
1cf0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 21 70 54 72  se->nErr || !pTr
1d00: 69 67 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65  ig ) goto trigge
1d10: 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b  rfinish_cleanup;
1d20: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
1d30: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
1d40: 61 72 73 65 2d 3e 64 62 2c 20 70 54 72 69 67 2d  arse->db, pTrig-
1d50: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 70 54 72  >pSchema);.  pTr
1d60: 69 67 2d 3e 73 74 65 70 5f 6c 69 73 74 20 3d 20  ig->step_list = 
1d70: 70 53 74 65 70 4c 69 73 74 3b 0a 20 20 77 68 69  pStepList;.  whi
1d80: 6c 65 28 20 70 53 74 65 70 4c 69 73 74 20 29 7b  le( pStepList ){
1d90: 0a 20 20 20 20 70 53 74 65 70 4c 69 73 74 2d 3e  .    pStepList->
1da0: 70 54 72 69 67 20 3d 20 70 54 72 69 67 3b 0a 20  pTrig = pTrig;. 
1db0: 20 20 20 70 53 74 65 70 4c 69 73 74 20 3d 20 70     pStepList = p
1dc0: 53 74 65 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  StepList->pNext;
1dd0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1de0: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
1df0: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74   pParse, iDb, "t
1e00: 72 69 67 67 65 72 22 2c 20 26 70 54 72 69 67 2d  rigger", &pTrig-
1e10: 3e 6e 61 6d 65 54 6f 6b 65 6e 29 20 0a 20 20 20  >nameToken) .   
1e20: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1e30: 33 46 69 78 54 72 69 67 67 65 72 53 74 65 70 28  3FixTriggerStep(
1e40: 26 73 46 69 78 2c 20 70 54 72 69 67 2d 3e 73 74  &sFix, pTrig->st
1e50: 65 70 5f 6c 69 73 74 29 20 29 7b 0a 20 20 20 20  ep_list) ){.    
1e60: 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69  goto triggerfini
1e70: 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  sh_cleanup;.  }.
1e80: 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 72 65 20  .  /* if we are 
1e90: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
1ea0: 2c 20 61 6e 64 20 74 68 69 73 20 74 72 69 67 67  , and this trigg
1eb0: 65 72 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 54  er is not on a T
1ec0: 45 4d 50 20 74 61 62 6c 65 2c 20 0a 20 20 2a 2a  EMP table, .  **
1ed0: 20 62 75 69 6c 64 20 74 68 65 20 73 71 6c 69 74   build the sqlit
1ee0: 65 5f 6d 61 73 74 65 72 20 65 6e 74 72 79 0a 20  e_master entry. 
1ef0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
1f00: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
1f10: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
1f20: 72 20 2a 7a 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  r *z;..    /* Ma
1f30: 6b 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ke an entry in t
1f40: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1f50: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 76 20   table */.    v 
1f60: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1f70: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
1f80: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72  ( v==0 ) goto tr
1f90: 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61  iggerfinish_clea
1fa0: 6e 75 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nup;.    sqlite3
1fb0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1fc0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
1fd0: 44 62 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  Db);.    z = sql
1fe0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
1ff0: 2c 20 28 63 68 61 72 2a 29 70 41 6c 6c 2d 3e 7a  , (char*)pAll->z
2000: 2c 20 70 41 6c 6c 2d 3e 6e 29 3b 0a 20 20 20 20  , pAll->n);.    
2010: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
2020: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
2030: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
2040: 51 2e 25 73 20 56 41 4c 55 45 53 28 27 74 72 69  Q.%s VALUES('tri
2050: 67 67 65 72 27 2c 25 51 2c 25 51 2c 30 2c 27 43  gger',%Q,%Q,0,'C
2060: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 25 71  REATE TRIGGER %q
2070: 27 29 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  ')",.       db->
2080: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
2090: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
20a0: 29 2c 20 70 54 72 69 67 2d 3e 6e 61 6d 65 2c 0a  ), pTrig->name,.
20b0: 20 20 20 20 20 20 20 70 54 72 69 67 2d 3e 74 61         pTrig->ta
20c0: 62 6c 65 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  ble, z);.    sql
20d0: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
20e0: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
20f0: 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
2100: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
2110: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2120: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
2130: 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33 4d  , 0, 0, sqlite3M
2140: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
2150: 64 62 2c 20 22 74 79 70 65 3d 27 74 72 69 67 67  db, "type='trigg
2160: 65 72 27 20 41 4e 44 20 6e 61 6d 65 3d 27 25 71  er' AND name='%q
2170: 27 22 2c 20 70 54 72 69 67 2d 3e 6e 61 6d 65 29  '", pTrig->name)
2180: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20  , P4_DYNAMIC.   
2190: 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64   );.  }..  if( d
21a0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
21b0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 54      int n;.    T
21c0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
21d0: 54 72 69 67 67 65 72 20 2a 70 44 65 6c 3b 0a 20  Trigger *pDel;. 
21e0: 20 20 20 70 44 65 6c 20 3d 20 73 71 6c 69 74 65     pDel = sqlite
21f0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
2200: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
2210: 61 2d 3e 74 72 69 67 48 61 73 68 2c 20 0a 20 20  a->trigHash, .  
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 70 54 72 69 67 2d 3e 6e 61 6d 65 2c 20     pTrig->name, 
2240: 73 74 72 6c 65 6e 28 70 54 72 69 67 2d 3e 6e 61  strlen(pTrig->na
2250: 6d 65 29 2c 20 70 54 72 69 67 29 3b 0a 20 20 20  me), pTrig);.   
2260: 20 69 66 28 20 70 44 65 6c 20 29 7b 0a 20 20 20   if( pDel ){.   
2270: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 6c 3d     assert( pDel=
2280: 3d 70 54 72 69 67 20 29 3b 0a 20 20 20 20 20 20  =pTrig );.      
2290: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
22b0: 20 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63   triggerfinish_c
22c0: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
22d0: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 72    n = strlen(pTr
22e0: 69 67 2d 3e 74 61 62 6c 65 29 20 2b 20 31 3b 0a  ig->table) + 1;.
22f0: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
2300: 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 72 69  e3HashFind(&pTri
2310: 67 2d 3e 70 54 61 62 53 63 68 65 6d 61 2d 3e 74  g->pTabSchema->t
2320: 62 6c 48 61 73 68 2c 20 70 54 72 69 67 2d 3e 74  blHash, pTrig->t
2330: 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 61 73  able, n);.    as
2340: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
2350: 0a 20 20 20 20 70 54 72 69 67 2d 3e 70 4e 65 78  .    pTrig->pNex
2360: 74 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67  t = pTab->pTrigg
2370: 65 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 54  er;.    pTab->pT
2380: 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 3b 0a  rigger = pTrig;.
2390: 20 20 20 20 70 54 72 69 67 20 3d 20 30 3b 0a 20      pTrig = 0;. 
23a0: 20 7d 0a 0a 74 72 69 67 67 65 72 66 69 6e 69 73   }..triggerfinis
23b0: 68 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  h_cleanup:.  sql
23c0: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
23d0: 72 28 70 54 72 69 67 29 3b 0a 20 20 61 73 73 65  r(pTrig);.  asse
23e0: 72 74 28 20 21 70 50 61 72 73 65 2d 3e 70 4e 65  rt( !pParse->pNe
23f0: 77 54 72 69 67 67 65 72 20 29 3b 0a 20 20 73 71  wTrigger );.  sq
2400: 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67  lite3DeleteTrigg
2410: 65 72 53 74 65 70 28 70 53 74 65 70 4c 69 73 74  erStep(pStepList
2420: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
2430: 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 63   a copy of all c
2440: 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 74 68 65  omponents of the
2450: 20 67 69 76 65 6e 20 74 72 69 67 67 65 72 20 73   given trigger s
2460: 74 65 70 2e 20 20 54 68 69 73 20 68 61 73 0a 2a  tep.  This has.*
2470: 2a 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  * the effect of 
2480: 63 6f 70 79 69 6e 67 20 61 6c 6c 20 45 78 70 72  copying all Expr
2490: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
24a0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
24b0: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
24c0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20  ite3_malloc().  
24d0: 41 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 72 65  As initially cre
24e0: 61 74 65 64 2c 20 74 68 65 20 45 78 70 72 2e 74  ated, the Expr.t
24f0: 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 0a 2a 2a  oken.z values.**
2500: 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68   all point to th
2510: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 74  e input string t
2520: 68 61 74 20 77 61 73 20 66 65 64 20 74 6f 20 74  hat was fed to t
2530: 68 65 20 70 61 72 73 65 72 2e 20 20 42 75 74 20  he parser.  But 
2540: 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69  that.** string i
2550: 73 20 65 70 68 65 6d 65 72 61 6c 20 2d 20 69 74  s ephemeral - it
2560: 20 77 69 6c 6c 20 67 6f 20 61 77 61 79 20 61 73   will go away as
2570: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 73 71 6c   soon as the sql
2580: 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 63  ite3_exec().** c
2590: 61 6c 6c 20 74 68 61 74 20 73 74 61 72 74 65 64  all that started
25a0: 20 74 68 65 20 70 61 72 73 65 72 20 65 78 69 74   the parser exit
25b0: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
25c0: 20 6d 61 6b 65 73 20 61 20 70 65 72 73 69 73 74   makes a persist
25d0: 65 6e 74 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 61  ent.** copy of a
25e0: 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
25f0: 6e 2e 7a 20 73 74 72 69 6e 67 73 20 73 6f 20 74  n.z strings so t
2600: 68 61 74 20 74 68 65 20 54 72 69 67 67 65 72 53  hat the TriggerS
2610: 74 65 70 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  tep structure.**
2620: 20 77 69 6c 6c 20 62 65 20 76 61 6c 69 64 20 65   will be valid e
2630: 76 65 6e 20 61 66 74 65 72 20 74 68 65 20 73 71  ven after the sq
2640: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
2650: 6c 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74  l returns..*/.st
2660: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2670: 50 65 72 73 69 73 74 54 72 69 67 67 65 72 53 74  PersistTriggerSt
2680: 65 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ep(sqlite3 *db, 
2690: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 29 7b  TriggerStep *p){
26a0: 0a 20 20 69 66 28 20 70 2d 3e 74 61 72 67 65 74  .  if( p->target
26b0: 2e 7a 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61 72  .z ){.    p->tar
26c0: 67 65 74 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c  get.z = (u8*)sql
26d0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
26e0: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 74 61 72 67  , (char*)p->targ
26f0: 65 74 2e 7a 2c 20 70 2d 3e 74 61 72 67 65 74 2e  et.z, p->target.
2700: 6e 29 3b 0a 20 20 20 20 70 2d 3e 74 61 72 67 65  n);.    p->targe
2710: 74 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20  t.dyn = 1;.  }. 
2720: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20   if( p->pSelect 
2730: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
2740: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  New = sqlite3Sel
2750: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  ectDup(db, p->pS
2760: 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
2770: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2780: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  p->pSelect);.   
2790: 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 4e   p->pSelect = pN
27a0: 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ew;.  }.  if( p-
27b0: 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 45  >pWhere ){.    E
27c0: 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
27d0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
27e0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  ->pWhere);.    s
27f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2800: 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  (p->pWhere);.   
2810: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65   p->pWhere = pNe
2820: 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  w;.  }.  if( p->
2830: 70 45 78 70 72 4c 69 73 74 20 29 7b 0a 20 20 20  pExprList ){.   
2840: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
2850: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2860: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 78 70  tDup(db, p->pExp
2870: 72 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  rList);.    sqli
2880: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2890: 65 28 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b  e(p->pExprList);
28a0: 0a 20 20 20 20 70 2d 3e 70 45 78 70 72 4c 69 73  .    p->pExprLis
28b0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
28c0: 69 66 28 20 70 2d 3e 70 49 64 4c 69 73 74 20 29  if( p->pIdList )
28d0: 7b 0a 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4e  {.    IdList *pN
28e0: 65 77 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ew = sqlite3IdLi
28f0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 49 64  stDup(db, p->pId
2900: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
2910: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
2920: 2d 3e 70 49 64 4c 69 73 74 29 3b 0a 20 20 20 20  ->pIdList);.    
2930: 70 2d 3e 70 49 64 4c 69 73 74 20 3d 20 70 4e 65  p->pIdList = pNe
2940: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
2950: 54 75 72 6e 20 61 20 53 45 4c 45 43 54 20 73 74  Turn a SELECT st
2960: 61 74 65 6d 65 6e 74 20 28 74 68 61 74 20 74 68  atement (that th
2970: 65 20 70 53 65 6c 65 63 74 20 70 61 72 61 6d 65  e pSelect parame
2980: 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 29 20 69  ter points to) i
2990: 6e 74 6f 0a 2a 2a 20 61 20 74 72 69 67 67 65 72  nto.** a trigger
29a0: 20 73 74 65 70 2e 20 20 52 65 74 75 72 6e 20 61   step.  Return a
29b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 72   pointer to a Tr
29c0: 69 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74  iggerStep struct
29d0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ure..**.** The p
29e0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
29f0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74   routine when it
2a00: 20 66 69 6e 64 73 20 61 20 53 45 4c 45 43 54 20   finds a SELECT 
2a10: 73 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20  statement in.** 
2a20: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
2a30: 52 2e 20 20 0a 2a 2f 0a 54 72 69 67 67 65 72 53  R.  .*/.TriggerS
2a40: 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67  tep *sqlite3Trig
2a50: 67 65 72 53 65 6c 65 63 74 53 74 65 70 28 73 71  gerSelectStep(sq
2a60: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
2a70: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
2a80: 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72 69  riggerStep *pTri
2a90: 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69 74  ggerStep = sqlit
2aa0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
2ab0: 62 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65  b, sizeof(Trigge
2ac0: 72 53 74 65 70 29 29 3b 0a 20 20 69 66 28 20 70  rStep));.  if( p
2ad0: 54 72 69 67 67 65 72 53 74 65 70 3d 3d 30 20 29  TriggerStep==0 )
2ae0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   {.    sqlite3Se
2af0: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
2b00: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ct);.    return 
2b10: 30 3b 0a 20 20 7d 0a 0a 20 20 70 54 72 69 67 67  0;.  }..  pTrigg
2b20: 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f  erStep->op = TK_
2b30: 53 45 4c 45 43 54 3b 0a 20 20 70 54 72 69 67 67  SELECT;.  pTrigg
2b40: 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20  erStep->pSelect 
2b50: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 70 54 72  = pSelect;.  pTr
2b60: 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e  iggerStep->orcon
2b70: 66 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  f = OE_Default;.
2b80: 20 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54    sqlitePersistT
2b90: 72 69 67 67 65 72 53 74 65 70 28 64 62 2c 20 70  riggerStep(db, p
2ba0: 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a 0a 20  TriggerStep);.. 
2bb0: 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72   return pTrigger
2bc0: 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  Step;.}../*.** B
2bd0: 75 69 6c 64 20 61 20 74 72 69 67 67 65 72 20 73  uild a trigger s
2be0: 74 65 70 20 6f 75 74 20 6f 66 20 61 6e 20 49 4e  tep out of an IN
2bf0: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  SERT statement. 
2c00: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
2c10: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 77 20  r.** to the new 
2c20: 74 72 69 67 67 65 72 20 73 74 65 70 2e 0a 2a 2a  trigger step..**
2c30: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
2c40: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
2c50: 65 20 77 68 65 6e 20 69 74 20 73 65 65 73 20 61  e when it sees a
2c60: 6e 20 49 4e 53 45 52 54 20 69 6e 73 69 64 65 20  n INSERT inside 
2c70: 74 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61  the.** body of a
2c80: 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72 69   trigger..*/.Tri
2c90: 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65  ggerStep *sqlite
2ca0: 33 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74  3TriggerInsertSt
2cb0: 65 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ep(.  sqlite3 *d
2cc0: 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  b,        /* The
2cd0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2ce0: 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
2cf0: 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 2f 2a  *pTableName,  /*
2d00: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2d10: 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  le into which we
2d20: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 49 64 4c   insert */.  IdL
2d30: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20  ist *pColumn,   
2d40: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
2d50: 6d 6e 73 20 69 6e 20 70 54 61 62 6c 65 4e 61 6d  mns in pTableNam
2d60: 65 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  e to insert into
2d70: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2d80: 70 45 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  pEList,   /* The
2d90: 20 56 41 4c 55 45 20 63 6c 61 75 73 65 3a 20 61   VALUE clause: a
2da0: 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   list of values 
2db0: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a  to be inserted *
2dc0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
2dd0: 65 63 74 2c 20 20 20 20 2f 2a 20 41 20 53 45 4c  ect,    /* A SEL
2de0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
2df0: 61 74 20 73 75 70 70 6c 69 65 73 20 76 61 6c 75  at supplies valu
2e00: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f  es */.  int orco
2e10: 6e 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  nf          /* T
2e20: 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  he conflict algo
2e30: 72 69 74 68 6d 20 28 4f 45 5f 41 62 6f 72 74 2c  rithm (OE_Abort,
2e40: 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 65 74 63   OE_Replace, etc
2e50: 2e 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  .) */.){.  Trigg
2e60: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72  erStep *pTrigger
2e70: 53 74 65 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  Step;..  assert(
2e80: 70 45 4c 69 73 74 20 3d 3d 20 30 20 7c 7c 20 70  pEList == 0 || p
2e90: 53 65 6c 65 63 74 20 3d 3d 20 30 29 3b 0a 20 20  Select == 0);.  
2ea0: 61 73 73 65 72 74 28 70 45 4c 69 73 74 20 21 3d  assert(pEList !=
2eb0: 20 30 20 7c 7c 20 70 53 65 6c 65 63 74 20 21 3d   0 || pSelect !=
2ec0: 20 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63   0 || db->malloc
2ed0: 46 61 69 6c 65 64 29 3b 0a 0a 20 20 70 54 72 69  Failed);..  pTri
2ee0: 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69 74  ggerStep = sqlit
2ef0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
2f00: 62 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65  b, sizeof(Trigge
2f10: 72 53 74 65 70 29 29 3b 0a 20 20 69 66 28 20 70  rStep));.  if( p
2f20: 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20  TriggerStep ){. 
2f30: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
2f40: 3e 6f 70 20 3d 20 54 4b 5f 49 4e 53 45 52 54 3b  >op = TK_INSERT;
2f50: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
2f60: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65  p->pSelect = pSe
2f70: 6c 65 63 74 3b 0a 20 20 20 20 70 54 72 69 67 67  lect;.    pTrigg
2f80: 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74 20 20  erStep->target  
2f90: 3d 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 20  = *pTableName;. 
2fa0: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
2fb0: 3e 70 49 64 4c 69 73 74 20 3d 20 70 43 6f 6c 75  >pIdList = pColu
2fc0: 6d 6e 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  mn;.    pTrigger
2fd0: 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 20  Step->pExprList 
2fe0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 54  = pEList;.    pT
2ff0: 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f  riggerStep->orco
3000: 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 20  nf = orconf;.   
3010: 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54 72   sqlitePersistTr
3020: 69 67 67 65 72 53 74 65 70 28 64 62 2c 20 70 54  iggerStep(db, pT
3030: 72 69 67 67 65 72 53 74 65 70 29 3b 0a 20 20 7d  riggerStep);.  }
3040: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
3050: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 43  3IdListDelete(pC
3060: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69  olumn);.    sqli
3070: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
3080: 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  e(pEList);.    s
3090: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
30a0: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  te(pSelect);.  }
30b0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67  ..  return pTrig
30c0: 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  gerStep;.}../*.*
30d0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72  * Construct a tr
30e0: 69 67 67 65 72 20 73 74 65 70 20 74 68 61 74 20  igger step that 
30f0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 55 50  implements an UP
3100: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61  DATE statement a
3110: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70  nd return.** a p
3120: 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 74  ointer to that t
3130: 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 54 68  rigger step.  Th
3140: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
3150: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3160: 20 69 74 0a 2a 2a 20 73 65 65 73 20 61 6e 20 55   it.** sees an U
3170: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
3180: 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79 20  inside the body 
3190: 6f 66 20 61 20 43 52 45 41 54 45 20 54 52 49 47  of a CREATE TRIG
31a0: 47 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53  GER..*/.TriggerS
31b0: 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67  tep *sqlite3Trig
31c0: 67 65 72 55 70 64 61 74 65 53 74 65 70 28 0a 20  gerUpdateStep(. 
31d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
31e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
31f0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
3200: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
3210: 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  bleName,   /* Na
3220: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
3230: 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f  to be updated */
3240: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
3250: 69 73 74 2c 20 20 20 20 2f 2a 20 54 68 65 20 53  ist,    /* The S
3260: 45 54 20 63 6c 61 75 73 65 3a 20 6c 69 73 74 20  ET clause: list 
3270: 6f 66 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 6e 65  of column and ne
3280: 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 45 78  w values */.  Ex
3290: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
32a0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
32b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
32c0: 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20  orconf          
32d0: 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74   /* The conflict
32e0: 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45 5f   algorithm. (OE_
32f0: 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
3300: 2c 20 65 74 63 29 20 2a 2f 0a 29 7b 0a 20 20 54  , etc) */.){.  T
3310: 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72 69  riggerStep *pTri
3320: 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69 74  ggerStep = sqlit
3330: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
3340: 62 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65  b, sizeof(Trigge
3350: 72 53 74 65 70 29 29 3b 0a 20 20 69 66 28 20 70  rStep));.  if( p
3360: 54 72 69 67 67 65 72 53 74 65 70 3d 3d 30 20 29  TriggerStep==0 )
3370: 7b 0a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  {.     sqlite3Ex
3380: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c  prListDelete(pEL
3390: 69 73 74 29 3b 0a 20 20 20 20 20 73 71 6c 69 74  ist);.     sqlit
33a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 57 68  e3ExprDelete(pWh
33b0: 65 72 65 29 3b 0a 20 20 20 20 20 72 65 74 75 72  ere);.     retur
33c0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 54 72 69  n 0;.  }..  pTri
33d0: 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 54  ggerStep->op = T
33e0: 4b 5f 55 50 44 41 54 45 3b 0a 20 20 70 54 72 69  K_UPDATE;.  pTri
33f0: 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74  ggerStep->target
3400: 20 20 3d 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b    = *pTableName;
3410: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
3420: 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 70 45 4c  >pExprList = pEL
3430: 69 73 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53  ist;.  pTriggerS
3440: 74 65 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  tep->pWhere = pW
3450: 68 65 72 65 3b 0a 20 20 70 54 72 69 67 67 65 72  here;.  pTrigger
3460: 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f  Step->orconf = o
3470: 72 63 6f 6e 66 3b 0a 20 20 73 71 6c 69 74 65 50  rconf;.  sqliteP
3480: 65 72 73 69 73 74 54 72 69 67 67 65 72 53 74 65  ersistTriggerSte
3490: 70 28 64 62 2c 20 70 54 72 69 67 67 65 72 53 74  p(db, pTriggerSt
34a0: 65 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  ep);..  return p
34b0: 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a  TriggerStep;.}..
34c0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
34d0: 61 20 74 72 69 67 67 65 72 20 73 74 65 70 20 74  a trigger step t
34e0: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  hat implements a
34f0: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
3500: 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  t and return.** 
3510: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61  a pointer to tha
3520: 74 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20  t trigger step. 
3530: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
3540: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
3550: 68 65 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20 61  hen it.** sees a
3560: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
3570: 74 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64  t inside the bod
3580: 79 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 52  y of a CREATE TR
3590: 49 47 47 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65  IGGER..*/.Trigge
35a0: 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72  rStep *sqlite3Tr
35b0: 69 67 67 65 72 44 65 6c 65 74 65 53 74 65 70 28  iggerDeleteStep(
35c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
35d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
35e0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
35f0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  n */.  Token *pT
3600: 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 20 2f  ableName,      /
3610: 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  * The table from
3620: 20 77 68 69 63 68 20 72 6f 77 73 20 61 72 65 20   which rows are 
3630: 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 45 78 70  deleted */.  Exp
3640: 72 20 2a 70 57 68 65 72 65 20 20 20 20 20 20 20  r *pWhere       
3650: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
3660: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20  E clause */.){. 
3670: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54   TriggerStep *pT
3680: 72 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c  riggerStep = sql
3690: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
36a0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72 69 67  (db, sizeof(Trig
36b0: 67 65 72 53 74 65 70 29 29 3b 0a 20 20 69 66 28  gerStep));.  if(
36c0: 20 70 54 72 69 67 67 65 72 53 74 65 70 3d 3d 30   pTriggerStep==0
36d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
36e0: 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72 65  xprDelete(pWhere
36f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
3700: 0a 20 20 7d 0a 0a 20 20 70 54 72 69 67 67 65 72  .  }..  pTrigger
3710: 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 44 45  Step->op = TK_DE
3720: 4c 45 54 45 3b 0a 20 20 70 54 72 69 67 67 65 72  LETE;.  pTrigger
3730: 53 74 65 70 2d 3e 74 61 72 67 65 74 20 20 3d 20  Step->target  = 
3740: 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 70  *pTableName;.  p
3750: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57 68  TriggerStep->pWh
3760: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
3770: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 72  pTriggerStep->or
3780: 63 6f 6e 66 20 3d 20 4f 45 5f 44 65 66 61 75 6c  conf = OE_Defaul
3790: 74 3b 0a 20 20 73 71 6c 69 74 65 50 65 72 73 69  t;.  sqlitePersi
37a0: 73 74 54 72 69 67 67 65 72 53 74 65 70 28 64 62  stTriggerStep(db
37b0: 2c 20 70 54 72 69 67 67 65 72 53 74 65 70 29 3b  , pTriggerStep);
37c0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67  ..  return pTrig
37d0: 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a  gerStep;.}../* .
37e0: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64  ** Recursively d
37f0: 65 6c 65 74 65 20 61 20 54 72 69 67 67 65 72 20  elete a Trigger 
3800: 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 76 6f 69  structure.*/.voi
3810: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  d sqlite3DeleteT
3820: 72 69 67 67 65 72 28 54 72 69 67 67 65 72 20 2a  rigger(Trigger *
3830: 70 54 72 69 67 67 65 72 29 7b 0a 20 20 69 66 28  pTrigger){.  if(
3840: 20 70 54 72 69 67 67 65 72 3d 3d 30 20 29 20 72   pTrigger==0 ) r
3850: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
3860: 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65  DeleteTriggerSte
3870: 70 28 70 54 72 69 67 67 65 72 2d 3e 73 74 65 70  p(pTrigger->step
3880: 5f 6c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  _list);.  sqlite
3890: 33 5f 66 72 65 65 28 70 54 72 69 67 67 65 72 2d  3_free(pTrigger-
38a0: 3e 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  >name);.  sqlite
38b0: 33 5f 66 72 65 65 28 70 54 72 69 67 67 65 72 2d  3_free(pTrigger-
38c0: 3e 74 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  >table);.  sqlit
38d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 54 72  e3ExprDelete(pTr
38e0: 69 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b 0a 20  igger->pWhen);. 
38f0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
3900: 6c 65 74 65 28 70 54 72 69 67 67 65 72 2d 3e 70  lete(pTrigger->p
3910: 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 69 66 28 20  Columns);.  if( 
3920: 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 54 6f  pTrigger->nameTo
3930: 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  ken.dyn ) sqlite
3940: 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 54  3_free((char*)pT
3950: 72 69 67 67 65 72 2d 3e 6e 61 6d 65 54 6f 6b 65  rigger->nameToke
3960: 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  n.z);.  sqlite3_
3970: 66 72 65 65 28 70 54 72 69 67 67 65 72 29 3b 0a  free(pTrigger);.
3980: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3990: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
39a0: 20 74 6f 20 64 72 6f 70 20 61 20 74 72 69 67 67   to drop a trigg
39b0: 65 72 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  er from the data
39c0: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 0a 2a 2a  base schema. .**
39d0: 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20 62 65 20  .** This may be 
39e0: 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20  called directly 
39f0: 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 20  from the parser 
3a00: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 69 64  and therefore id
3a10: 65 6e 74 69 66 69 65 73 0a 2a 2a 20 74 68 65 20  entifies.** the 
3a20: 74 72 69 67 67 65 72 20 62 79 20 6e 61 6d 65 2e  trigger by name.
3a30: 20 20 54 68 65 20 73 71 6c 69 74 65 33 44 72 6f    The sqlite3Dro
3a40: 70 54 72 69 67 67 65 72 50 74 72 28 29 20 72 6f  pTriggerPtr() ro
3a50: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 0a 2a  utine does the.*
3a60: 2a 20 73 61 6d 65 20 6a 6f 62 20 61 73 20 74 68  * same job as th
3a70: 69 73 20 72 6f 75 74 69 6e 65 20 65 78 63 65 70  is routine excep
3a80: 74 20 69 74 20 74 61 6b 65 73 20 61 20 70 6f 69  t it takes a poi
3a90: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 72 69 67  nter to the trig
3aa0: 67 65 72 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  ger.** instead o
3ab0: 66 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61  f the trigger na
3ac0: 6d 65 2e 0a 2a 2a 2f 0a 76 6f 69 64 20 73 71 6c  me..**/.void sql
3ad0: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28  ite3DropTrigger(
3ae0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
3af0: 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
3b00: 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 72 69  nt noErr){.  Tri
3b10: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d  gger *pTrigger =
3b20: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63   0;.  int i;.  c
3b30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
3b40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
3b50: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  ame;.  int nName
3b60: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
3b70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
3b80: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
3b90: 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 64 72 6f  ailed ) goto dro
3ba0: 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  p_trigger_cleanu
3bb0: 70 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  p;.  if( SQLITE_
3bc0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
3bd0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
3be0: 0a 20 20 20 20 67 6f 74 6f 20 64 72 6f 70 5f 74  .    goto drop_t
3bf0: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
3c00: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
3c10: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
3c20: 0a 20 20 7a 44 62 20 3d 20 70 4e 61 6d 65 2d 3e  .  zDb = pName->
3c30: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a  a[0].zDatabase;.
3c40: 20 20 7a 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 2d    zName = pName-
3c50: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 6e  >a[0].zName;.  n
3c60: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
3c70: 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  ame);.  for(i=OM
3c80: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
3c90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3ca0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
3cb0: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
3cc0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
3cd0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
3ce0: 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74  zDb && sqlite3St
3cf0: 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 6a 5d  rICmp(db->aDb[j]
3d00: 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 20 63  .zName, zDb) ) c
3d10: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 54 72  ontinue;.    pTr
3d20: 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 48  igger = sqlite3H
3d30: 61 73 68 46 69 6e 64 28 26 28 64 62 2d 3e 61 44  ashFind(&(db->aD
3d40: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72  b[j].pSchema->tr
3d50: 69 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65 2c 20  igHash), zName, 
3d60: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  nName);.    if( 
3d70: 70 54 72 69 67 67 65 72 20 29 20 62 72 65 61 6b  pTrigger ) break
3d80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 54 72  ;.  }.  if( !pTr
3d90: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 69 66 28  igger ){.    if(
3da0: 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20   !noErr ){.     
3db0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3dc0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
3dd0: 68 20 74 72 69 67 67 65 72 3a 20 25 53 22 2c 20  h trigger: %S", 
3de0: 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pName, 0);.    }
3df0: 0a 20 20 20 20 67 6f 74 6f 20 64 72 6f 70 5f 74  .    goto drop_t
3e00: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
3e10: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 72 6f    }.  sqlite3Dro
3e20: 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
3e30: 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 0a  se, pTrigger);..
3e40: 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65  drop_trigger_cle
3e50: 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53  anup:.  sqlite3S
3e60: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61  rcListDelete(pNa
3e70: 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  me);.}../*.** Re
3e80: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
3e90: 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
3ea0: 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 74 61  cture for the ta
3eb0: 62 6c 65 20 74 68 61 74 20 61 20 74 72 69 67 67  ble that a trigg
3ec0: 65 72 0a 2a 2a 20 69 73 20 73 65 74 20 6f 6e 2e  er.** is set on.
3ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
3ee0: 20 2a 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72   *tableOfTrigger
3ef0: 28 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67  (Trigger *pTrigg
3f00: 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 73  er){.  int n = s
3f10: 74 72 6c 65 6e 28 70 54 72 69 67 67 65 72 2d 3e  trlen(pTrigger->
3f20: 74 61 62 6c 65 29 20 2b 20 31 3b 0a 20 20 72 65  table) + 1;.  re
3f30: 74 75 72 6e 20 73 71 6c 69 74 65 33 48 61 73 68  turn sqlite3Hash
3f40: 46 69 6e 64 28 26 70 54 72 69 67 67 65 72 2d 3e  Find(&pTrigger->
3f50: 70 54 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48  pTabSchema->tblH
3f60: 61 73 68 2c 20 70 54 72 69 67 67 65 72 2d 3e 74  ash, pTrigger->t
3f70: 61 62 6c 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a  able, n);.}.../*
3f80: 0a 2a 2a 20 44 72 6f 70 20 61 20 74 72 69 67 67  .** Drop a trigg
3f90: 65 72 20 67 69 76 65 6e 20 61 20 70 6f 69 6e 74  er given a point
3fa0: 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67 67  er to that trigg
3fb0: 65 72 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  er. .*/.void sql
3fc0: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
3fd0: 74 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  tr(Parse *pParse
3fe0: 2c 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67  , Trigger *pTrig
3ff0: 67 65 72 29 7b 0a 20 20 54 61 62 6c 65 20 20 20  ger){.  Table   
4000: 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20  *pTable;.  Vdbe 
4010: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
4020: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4030: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 44    int iDb;..  iD
4040: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
4050: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
4060: 3e 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70  >db, pTrigger->p
4070: 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
4080: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
4090: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 70 54  <db->nDb );.  pT
40a0: 61 62 6c 65 20 3d 20 74 61 62 6c 65 4f 66 54 72  able = tableOfTr
40b0: 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b  igger(pTrigger);
40c0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
40d0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
40e0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 3d 3d  Table->pSchema==
40f0: 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
4100: 61 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 23  a || iDb==1 );.#
4110: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4120: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
4130: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
4140: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
4150: 54 52 49 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e  TRIGGER;.    con
4160: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
4170: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
4180: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
4190: 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
41a0: 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
41b0: 20 69 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f   if( iDb==1 ) co
41c0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
41d0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20  _TEMP_TRIGGER;. 
41e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
41f0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
4200: 63 6f 64 65 2c 20 70 54 72 69 67 67 65 72 2d 3e  code, pTrigger->
4210: 6e 61 6d 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  name, pTable->zN
4220: 61 6d 65 2c 20 7a 44 62 29 20 7c 7c 0a 20 20 20  ame, zDb) ||.   
4230: 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68     sqlite3AuthCh
4240: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
4250: 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
4260: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
4270: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
4280: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
4290: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
42a0: 6f 20 64 65 73 74 72 6f 79 20 74 68 65 20 64 61  o destroy the da
42b0: 74 61 62 61 73 65 20 72 65 63 6f 72 64 20 6f 66  tabase record of
42c0: 20 74 68 65 20 74 72 69 67 67 65 72 2e 0a 20 20   the trigger..  
42d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
42e0: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ble!=0 );.  if( 
42f0: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
4300: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
4310: 29 7b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b  ){.    int base;
4320: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
4330: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f  t VdbeOpList dro
4340: 70 54 72 69 67 67 65 72 5b 5d 20 3d 20 7b 0a 20  pTrigger[] = {. 
4350: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
4360: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29  ,     0, ADDR(9)
4370: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
4380: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c  P_String8,    0,
4390: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   1,        0}, /
43a0: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 1 */.      { O
43b0: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
43c0: 20 31 2c 20 20 20 20 20 20 20 20 32 7d 2c 0a 20   1,        2},. 
43d0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
43e0: 20 20 20 20 20 20 32 2c 20 41 44 44 52 28 38 29        2, ADDR(8)
43f0: 2c 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  1},.      { O
4400: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c  P_String8,    0,
4410: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   1,        0}, /
4420: 2a 20 34 3a 20 22 74 72 69 67 67 65 72 22 20 2a  * 4: "trigger" *
4430: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  /.      { OP_Col
4440: 75 6d 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  umn,     0, 0,  
4450: 20 20 20 20 20 20 32 7d 2c 0a 20 20 20 20 20 20        2},.      
4460: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
4470: 20 32 2c 20 41 44 44 52 28 38 29 2c 20 20 31 7d   2, ADDR(8),  1}
4480: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c  ,.      { OP_Del
4490: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ete,     0, 0,  
44a0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
44b0: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
44c0: 20 30 2c 20 41 44 44 52 28 31 29 2c 20 20 30 7d   0, ADDR(1),  0}
44d0: 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b  , /* 8 */.    };
44e0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ..    sqlite3Beg
44f0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
4500: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
4510: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  ;.    sqlite3Ope
4520: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
4530: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 62  rse, iDb);.    b
4540: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
4550: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 20 41  eAddOpList(v,  A
4560: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 72 69  rraySize(dropTri
4570: 67 67 65 72 29 2c 20 64 72 6f 70 54 72 69 67 67  gger), dropTrigg
4580: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
4590: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
45a0: 62 61 73 65 2b 31 2c 20 70 54 72 69 67 67 65 72  base+1, pTrigger
45b0: 2d 3e 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  ->name, 0);.    
45c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
45d0: 65 50 34 28 76 2c 20 62 61 73 65 2b 34 2c 20 22  eP4(v, base+4, "
45e0: 74 72 69 67 67 65 72 22 2c 20 50 34 5f 53 54 41  trigger", P4_STA
45f0: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
4600: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
4610: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
4620: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4630: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  2(v, OP_Close, 0
4640: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4650: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
4660: 50 5f 44 72 6f 70 54 72 69 67 67 65 72 2c 20 69  P_DropTrigger, i
4670: 44 62 2c 20 30 2c 20 30 2c 20 70 54 72 69 67 67  Db, 0, 0, pTrigg
4680: 65 72 2d 3e 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  er->name, 0);.  
4690: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  }.}../*.** Remov
46a0: 65 20 61 20 74 72 69 67 67 65 72 20 66 72 6f 6d  e a trigger from
46b0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
46c0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 2a 20   of the sqlite* 
46d0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64  pointer..*/.void
46e0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
46f0: 64 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 73  dDeleteTrigger(s
4700: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4710: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
4720: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 72 69 67 67  *zName){.  Trigg
4730: 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
4740: 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  int nName = strl
4750: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 54 72  en(zName);.  pTr
4760: 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 48  igger = sqlite3H
4770: 61 73 68 49 6e 73 65 72 74 28 26 28 64 62 2d 3e  ashInsert(&(db->
4780: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
4790: 2d 3e 74 72 69 67 48 61 73 68 29 2c 0a 20 20 20  ->trigHash),.   
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
47c0: 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  e, nName, 0);.  
47d0: 69 66 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a  if( pTrigger ){.
47e0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c      Table *pTabl
47f0: 65 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 67 67  e = tableOfTrigg
4800: 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20  er(pTrigger);.  
4810: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
4820: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
4830: 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 20  Table->pTrigger 
4840: 3d 3d 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  == pTrigger ){. 
4850: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 54 72       pTable->pTr
4860: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
4870: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
4880: 73 65 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65  se{.      Trigge
4890: 72 20 2a 63 63 20 3d 20 70 54 61 62 6c 65 2d 3e  r *cc = pTable->
48a0: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20  pTrigger;.      
48b0: 77 68 69 6c 65 28 20 63 63 20 29 7b 20 0a 20 20  while( cc ){ .  
48c0: 20 20 20 20 20 20 69 66 28 20 63 63 2d 3e 70 4e        if( cc->pN
48d0: 65 78 74 20 3d 3d 20 70 54 72 69 67 67 65 72 20  ext == pTrigger 
48e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 63 2d  ){.          cc-
48f0: 3e 70 4e 65 78 74 20 3d 20 63 63 2d 3e 70 4e 65  >pNext = cc->pNe
4900: 78 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  xt->pNext;.     
4910: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4920: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 63      }.        cc
4930: 20 3d 20 63 63 2d 3e 70 4e 65 78 74 3b 0a 20 20   = cc->pNext;.  
4940: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
4950: 72 74 28 63 63 29 3b 0a 20 20 20 20 7d 0a 20 20  rt(cc);.    }.  
4960: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
4970: 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29  rigger(pTrigger)
4980: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
4990: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
49a0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
49b0: 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20  /*.** pEList is 
49c0: 74 68 65 20 53 45 54 20 63 6c 61 75 73 65 20 6f  the SET clause o
49d0: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
49e0: 65 6d 65 6e 74 2e 20 20 45 61 63 68 20 65 6e 74  ement.  Each ent
49f0: 72 79 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20  ry.** in pEList 
4a00: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 61 74  is of the format
4a10: 20 3c 69 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49   <id>=<expr>.  I
4a20: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 6e 74  f any of the ent
4a30: 72 69 65 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73  ries.** in pELis
4a40: 74 20 68 61 76 65 20 61 6e 20 3c 69 64 3e 20 77  t have an <id> w
4a50: 68 69 63 68 20 6d 61 74 63 68 65 73 20 61 6e 20  hich matches an 
4a60: 69 64 65 6e 74 69 66 69 65 72 20 69 6e 20 70 49  identifier in pI
4a70: 64 4c 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72  dList,.** then r
4a80: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
4a90: 70 49 64 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74  pIdList==NULL, t
4aa0: 68 65 6e 20 69 74 20 69 73 20 63 6f 6e 73 69 64  hen it is consid
4ab0: 65 72 65 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61  ered a.** wildca
4ac0: 72 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  rd that matches 
4ad0: 61 6e 79 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77  anything.  Likew
4ae0: 69 73 65 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e  ise if pEList==N
4af0: 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d  ULL then.** it m
4b00: 61 74 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20  atches anything 
4b10: 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  so always return
4b20: 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66   true.  Return f
4b30: 61 6c 73 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alse only.** if 
4b40: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
4b50: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
4b60: 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72   checkColumnOver
4b70: 4c 61 70 28 49 64 4c 69 73 74 20 2a 70 49 64 4c  Lap(IdList *pIdL
4b80: 69 73 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ist, ExprList *p
4b90: 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b  EList){.  int e;
4ba0: 0a 20 20 69 66 28 20 21 70 49 64 4c 69 73 74 20  .  if( !pIdList 
4bb0: 7c 7c 20 21 70 45 4c 69 73 74 20 29 20 72 65 74  || !pEList ) ret
4bc0: 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 65 3d 30  urn 1;.  for(e=0
4bd0: 3b 20 65 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; e<pEList->nExp
4be0: 72 3b 20 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; e++){.    if(
4bf0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
4c00: 64 65 78 28 70 49 64 4c 69 73 74 2c 20 70 45 4c  dex(pIdList, pEL
4c10: 69 73 74 2d 3e 61 5b 65 5d 2e 7a 4e 61 6d 65 29  ist->a[e].zName)
4c20: 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  >=0 ) return 1;.
4c30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 20    }.  return 0; 
4c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4c50: 20 61 20 62 69 74 20 76 65 63 74 6f 72 20 74 6f   a bit vector to
4c60: 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 6b   indicate what k
4c70: 69 6e 64 20 6f 66 20 74 72 69 67 67 65 72 73 20  ind of triggers 
4c80: 65 78 69 73 74 20 66 6f 72 20 6f 70 65 72 61 74  exist for operat
4c90: 69 6f 6e 0a 2a 2a 20 22 6f 70 22 20 6f 6e 20 74  ion.** "op" on t
4ca0: 61 62 6c 65 20 70 54 61 62 2e 20 20 49 66 20 70  able pTab.  If p
4cb0: 43 68 61 6e 67 65 73 20 69 73 20 6e 6f 74 20 4e  Changes is not N
4cc0: 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ULL then it is a
4cd0: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
4ce0: 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 62 65 69  .** that are bei
4cf0: 6e 67 20 75 70 64 61 74 65 64 2e 20 20 54 72 69  ng updated.  Tri
4d00: 67 67 65 72 73 20 6f 6e 6c 79 20 6d 61 74 63 68  ggers only match
4d10: 20 69 66 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   if the ON claus
4d20: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 69 67  e of the.** trig
4d30: 67 65 72 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ger definition o
4d40: 76 65 72 6c 61 70 73 20 74 68 65 20 73 65 74 20  verlaps the set 
4d50: 6f 66 20 63 6f 6c 75 6d 6e 73 20 62 65 69 6e 67  of columns being
4d60: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
4d70: 54 68 65 20 72 65 74 75 72 6e 65 64 20 62 69 74  The returned bit
4d80: 20 76 65 63 74 6f 72 20 69 73 20 73 6f 6d 65 20   vector is some 
4d90: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54  combination of T
4da0: 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 61 6e  RIGGER_BEFORE an
4db0: 64 0a 2a 2a 20 54 52 49 47 47 45 52 5f 41 46 54  d.** TRIGGER_AFT
4dc0: 45 52 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ER..*/.int sqlit
4dd0: 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74 28  e3TriggersExist(
4de0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4df0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ,          /* Us
4e00: 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20  ed to check for 
4e10: 72 65 63 75 72 73 69 76 65 20 74 72 69 67 67 65  recursive trigge
4e20: 72 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  rs */.  Table *p
4e30: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
4e40: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 65  /* The table the
4e50: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 72   contains the tr
4e60: 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  iggers */.  int 
4e70: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
4e80: 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66 20 54 4b      /* one of TK
4e90: 5f 44 45 4c 45 54 45 2c 20 54 4b 5f 49 4e 53 45  _DELETE, TK_INSE
4ea0: 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 20 2a 2f  RT, TK_UPDATE */
4eb0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68  .  ExprList *pCh
4ec0: 61 6e 67 65 73 20 20 20 20 20 20 2f 2a 20 43 6f  anges      /* Co
4ed0: 6c 75 6d 6e 73 20 74 68 61 74 20 63 68 61 6e 67  lumns that chang
4ee0: 65 20 69 6e 20 61 6e 20 55 50 44 41 54 45 20 73  e in an UPDATE s
4ef0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
4f00: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
4f10: 65 72 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d  er;.  int mask =
4f20: 20 30 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 20   0;..  pTrigger 
4f30: 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  = IsVirtual(pTab
4f40: 29 20 3f 20 30 20 3a 20 70 54 61 62 2d 3e 70 54  ) ? 0 : pTab->pT
4f50: 72 69 67 67 65 72 3b 0a 20 20 77 68 69 6c 65 28  rigger;.  while(
4f60: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
4f70: 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e 6f   if( pTrigger->o
4f80: 70 3d 3d 6f 70 20 26 26 20 63 68 65 63 6b 43 6f  p==op && checkCo
4f90: 6c 75 6d 6e 4f 76 65 72 4c 61 70 28 70 54 72 69  lumnOverLap(pTri
4fa0: 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20  gger->pColumns, 
4fb0: 70 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20  pChanges) ){.   
4fc0: 20 20 20 6d 61 73 6b 20 7c 3d 20 70 54 72 69 67     mask |= pTrig
4fd0: 67 65 72 2d 3e 74 72 5f 74 6d 3b 0a 20 20 20 20  ger->tr_tm;.    
4fe0: 7d 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  }.    pTrigger =
4ff0: 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
5000: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
5010: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ask;.}../*.** Co
5020: 6e 76 65 72 74 20 74 68 65 20 70 53 74 65 70 2d  nvert the pStep-
5030: 3e 74 61 72 67 65 74 20 74 6f 6b 65 6e 20 69 6e  >target token in
5040: 74 6f 20 61 20 53 72 63 4c 69 73 74 20 61 6e 64  to a SrcList and
5050: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
5060: 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 53 72 63  r.** to that Src
5070: 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  List..**.** This
5080: 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20   routine adds a 
5090: 73 70 65 63 69 66 69 63 20 64 61 74 61 62 61 73  specific databas
50a0: 65 20 6e 61 6d 65 2c 20 69 66 20 6e 65 65 64 65  e name, if neede
50b0: 64 2c 20 74 6f 20 74 68 65 20 74 61 72 67 65 74  d, to the target
50c0: 20 77 68 65 6e 0a 2a 2a 20 66 6f 72 6d 69 6e 67   when.** forming
50d0: 20 74 68 65 20 53 72 63 4c 69 73 74 2e 20 20 54   the SrcList.  T
50e0: 68 69 73 20 70 72 65 76 65 6e 74 73 20 61 20 74  his prevents a t
50f0: 72 69 67 67 65 72 20 69 6e 20 6f 6e 65 20 64 61  rigger in one da
5100: 74 61 62 61 73 65 20 66 72 6f 6d 0a 2a 2a 20 72  tabase from.** r
5110: 65 66 65 72 72 69 6e 67 20 74 6f 20 61 20 74 61  eferring to a ta
5120: 72 67 65 74 20 69 6e 20 61 6e 6f 74 68 65 72 20  rget in another 
5130: 64 61 74 61 62 61 73 65 2e 20 20 41 6e 20 65 78  database.  An ex
5140: 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20  ception is when 
5150: 74 68 65 0a 2a 2a 20 74 72 69 67 67 65 72 20 69  the.** trigger i
5160: 73 20 69 6e 20 54 45 4d 50 20 69 6e 20 77 68 69  s in TEMP in whi
5170: 63 68 20 63 61 73 65 20 69 74 20 63 61 6e 20 72  ch case it can r
5180: 65 66 65 72 20 74 6f 20 61 6e 79 20 6f 74 68 65  efer to any othe
5190: 72 20 64 61 74 61 62 61 73 65 20 69 74 0a 2a 2a  r database it.**
51a0: 20 77 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69   wants..*/.stati
51b0: 63 20 53 72 63 4c 69 73 74 20 2a 74 61 72 67 65  c SrcList *targe
51c0: 74 53 72 63 4c 69 73 74 28 0a 20 20 50 61 72 73  tSrcList(.  Pars
51d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
51e0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
51f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69  context */.  Tri
5200: 67 67 65 72 53 74 65 70 20 2a 70 53 74 65 70 20  ggerStep *pStep 
5210: 20 20 2f 2a 20 54 68 65 20 74 72 69 67 67 65 72    /* The trigger
5220: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5230: 74 61 72 67 65 74 20 74 6f 6b 65 6e 20 2a 2f 0a  target token */.
5240: 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 44 62 3b 20  ){.  Token sDb; 
5250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d            /* Dum
5260: 6d 79 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  my database name
5270: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   token */.  int 
5280: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
5290: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
52a0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 75 73 65   database to use
52b0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
52c0: 53 72 63 3b 20 20 20 20 20 20 20 2f 2a 20 53 72  Src;       /* Sr
52d0: 63 4c 69 73 74 20 74 6f 20 62 65 20 72 65 74 75  cList to be retu
52e0: 72 6e 65 64 20 2a 2f 0a 0a 20 20 69 44 62 20 3d  rned */..  iDb =
52f0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
5300: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
5310: 2c 20 70 53 74 65 70 2d 3e 70 54 72 69 67 2d 3e  , pStep->pTrig->
5320: 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20  pSchema);.  if( 
5330: 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 3d 32  iDb==0 || iDb>=2
5340: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5350: 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
5360: 6e 44 62 20 29 3b 0a 20 20 20 20 73 44 62 2e 7a  nDb );.    sDb.z
5370: 20 3d 20 28 75 38 2a 29 70 50 61 72 73 65 2d 3e   = (u8*)pParse->
5380: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
5390: 6d 65 3b 0a 20 20 20 20 73 44 62 2e 6e 20 3d 20  me;.    sDb.n = 
53a0: 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 73 44  strlen((char*)sD
53b0: 62 2e 7a 29 3b 0a 20 20 20 20 70 53 72 63 20 3d  b.z);.    pSrc =
53c0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
53d0: 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  ppend(pParse->db
53e0: 2c 20 30 2c 20 26 73 44 62 2c 20 26 70 53 74 65  , 0, &sDb, &pSte
53f0: 70 2d 3e 74 61 72 67 65 74 29 3b 0a 20 20 7d 20  p->target);.  } 
5400: 65 6c 73 65 20 7b 0a 20 20 20 20 70 53 72 63 20  else {.    pSrc 
5410: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
5420: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64  Append(pParse->d
5430: 62 2c 20 30 2c 20 26 70 53 74 65 70 2d 3e 74 61  b, 0, &pStep->ta
5440: 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  rget, 0);.  }.  
5450: 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a  return pSrc;.}..
5460: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
5470: 44 42 45 20 63 6f 64 65 20 66 6f 72 20 7a 65 72  DBE code for zer
5480: 6f 20 6f 72 20 6d 6f 72 65 20 73 74 61 74 65 6d  o or more statem
5490: 65 6e 74 73 20 69 6e 73 69 64 65 20 74 68 65 20  ents inside the 
54a0: 62 6f 64 79 20 6f 66 20 61 0a 2a 2a 20 74 72 69  body of a.** tri
54b0: 67 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  gger.  .*/.stati
54c0: 63 20 69 6e 74 20 63 6f 64 65 54 72 69 67 67 65  c int codeTrigge
54d0: 72 50 72 6f 67 72 61 6d 28 0a 20 20 50 61 72 73  rProgram(.  Pars
54e0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
54f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
5500: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
5510: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 53   TriggerStep *pS
5520: 74 65 70 4c 69 73 74 2c 20 20 20 2f 2a 20 4c 69  tepList,   /* Li
5530: 73 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  st of statements
5540: 20 69 6e 73 69 64 65 20 74 68 65 20 74 72 69 67   inside the trig
5550: 67 65 72 20 62 6f 64 79 20 2a 2f 0a 20 20 69 6e  ger body */.  in
5560: 74 20 6f 72 63 6f 6e 66 69 6e 20 20 20 20 20 20  t orconfin      
5570: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
5580: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28  ict algorithm. (
5590: 4f 45 5f 41 62 6f 72 74 2c 20 65 74 63 29 20 2a  OE_Abort, etc) *
55a0: 2f 20 20 0a 29 7b 0a 20 20 54 72 69 67 67 65 72  /  .){.  Trigger
55b0: 53 74 65 70 20 2a 20 70 54 72 69 67 67 65 72 53  Step * pTriggerS
55c0: 74 65 70 20 3d 20 70 53 74 65 70 4c 69 73 74 3b  tep = pStepList;
55d0: 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 3b 0a 20  .  int orconf;. 
55e0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
55f0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69  e->pVdbe;.  sqli
5600: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5610: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
5620: 20 70 54 72 69 67 67 65 72 53 74 65 70 21 3d 30   pTriggerStep!=0
5630: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21   );.  assert( v!
5640: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
5650: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5660: 43 6f 6e 74 65 78 74 50 75 73 68 2c 20 30 2c 20  ContextPush, 0, 
5670: 30 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  0);.  VdbeCommen
5680: 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 69  t((v, "begin tri
5690: 67 67 65 72 20 25 73 22 2c 20 70 53 74 65 70 4c  gger %s", pStepL
56a0: 69 73 74 2d 3e 70 54 72 69 67 2d 3e 6e 61 6d 65  ist->pTrig->name
56b0: 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72  ));.  while( pTr
56c0: 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20 20  iggerStep ){.   
56d0: 20 6f 72 63 6f 6e 66 20 3d 20 28 6f 72 63 6f 6e   orconf = (orcon
56e0: 66 69 6e 20 3d 3d 20 4f 45 5f 44 65 66 61 75 6c  fin == OE_Defaul
56f0: 74 29 3f 70 54 72 69 67 67 65 72 53 74 65 70 2d  t)?pTriggerStep-
5700: 3e 6f 72 63 6f 6e 66 3a 6f 72 63 6f 6e 66 69 6e  >orconf:orconfin
5710: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72  ;.    pParse->tr
5720: 69 67 53 74 61 63 6b 2d 3e 6f 72 63 6f 6e 66 20  igStack->orconf 
5730: 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 20 20 73 77  = orconf;.    sw
5740: 69 74 63 68 28 20 70 54 72 69 67 67 65 72 53 74  itch( pTriggerSt
5750: 65 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20  ep->op ){.      
5760: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
5770: 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
5780: 20 2a 73 73 20 3d 20 73 71 6c 69 74 65 33 53 65   *ss = sqlite3Se
5790: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 72 69  lectDup(db, pTri
57a0: 67 67 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63  ggerStep->pSelec
57b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
57c0: 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ss ){.          
57d0: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
57e0: 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ..          sqli
57f0: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
5800: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 44 69 73  t(&dest, SRT_Dis
5810: 63 61 72 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  card, 0);.      
5820: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
5830: 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
5840: 20 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   ss, 0);.       
5850: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
5860: 28 70 50 61 72 73 65 2c 20 73 73 2c 20 26 64 65  (pParse, ss, &de
5870: 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  st, 0, 0, 0, 0);
5880: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
5890: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73  e3SelectDelete(s
58a0: 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  s);.        }.  
58b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
58c0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
58d0: 54 4b 5f 55 50 44 41 54 45 3a 20 7b 0a 20 20 20  TK_UPDATE: {.   
58e0: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53       SrcList *pS
58f0: 72 63 3b 0a 20 20 20 20 20 20 20 20 70 53 72 63  rc;.        pSrc
5900: 20 3d 20 74 61 72 67 65 74 53 72 63 4c 69 73 74   = targetSrcList
5910: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
5920: 72 53 74 65 70 29 3b 0a 20 20 20 20 20 20 20 20  rStep);.        
5930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5940: 32 28 76 2c 20 4f 50 5f 52 65 73 65 74 43 6f 75  2(v, OP_ResetCou
5950: 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  nt, 0, 0);.     
5960: 20 20 20 73 71 6c 69 74 65 33 55 70 64 61 74 65     sqlite3Update
5970: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 0a 20  (pParse, pSrc,. 
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5990: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
59a0: 70 28 64 62 2c 20 70 54 72 69 67 67 65 72 53 74  p(db, pTriggerSt
59b0: 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 2c 20  ep->pExprList), 
59c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
59d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
59e0: 64 62 2c 20 70 54 72 69 67 67 65 72 53 74 65 70  db, pTriggerStep
59f0: 2d 3e 70 57 68 65 72 65 29 2c 20 6f 72 63 6f 6e  ->pWhere), orcon
5a00: 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  f);.        sqli
5a10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5a20: 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20   OP_ResetCount, 
5a30: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  1, 0);.        b
5a40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5a50: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 53 45      case TK_INSE
5a60: 52 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 53 72  RT: {.        Sr
5a70: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 20  cList *pSrc;.   
5a80: 20 20 20 20 20 70 53 72 63 20 3d 20 74 61 72 67       pSrc = targ
5a90: 65 74 53 72 63 4c 69 73 74 28 70 50 61 72 73 65  etSrcList(pParse
5aa0: 2c 20 70 54 72 69 67 67 65 72 53 74 65 70 29 3b  , pTriggerStep);
5ab0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5ac0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5ad0: 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20 30 2c 20  _ResetCount, 0, 
5ae0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
5af0: 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65  te3Insert(pParse
5b00: 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20  , pSrc,.        
5b10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
5b20: 74 44 75 70 28 64 62 2c 20 70 54 72 69 67 67 65  tDup(db, pTrigge
5b30: 72 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74  rStep->pExprList
5b40: 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  ), .          sq
5b50: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
5b60: 62 2c 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  b, pTriggerStep-
5b70: 3e 70 53 65 6c 65 63 74 29 2c 20 0a 20 20 20 20  >pSelect), .    
5b80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c        sqlite3IdL
5b90: 69 73 74 44 75 70 28 64 62 2c 20 70 54 72 69 67  istDup(db, pTrig
5ba0: 67 65 72 53 74 65 70 2d 3e 70 49 64 4c 69 73 74  gerStep->pIdList
5bb0: 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 20 20  ), orconf);.    
5bc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5bd0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp2(v, OP_Rese
5be0: 74 43 6f 75 6e 74 2c 20 31 2c 20 30 29 3b 0a 20  tCount, 1, 0);. 
5bf0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5c00: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5c10: 20 54 4b 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20   TK_DELETE: {.  
5c20: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
5c30: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Src;.        sql
5c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5c50: 2c 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c  , OP_ResetCount,
5c60: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
5c70: 70 53 72 63 20 3d 20 74 61 72 67 65 74 53 72 63  pSrc = targetSrc
5c80: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 72  List(pParse, pTr
5c90: 69 67 67 65 72 53 74 65 70 29 3b 0a 20 20 20 20  iggerStep);.    
5ca0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
5cb0: 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 70 53  eFrom(pParse, pS
5cc0: 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rc, .           
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5ce0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
5cf0: 2c 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  , pTriggerStep->
5d00: 70 57 68 65 72 65 29 29 3b 0a 20 20 20 20 20 20  pWhere));.      
5d10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d20: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 65 74 43  Op2(v, OP_ResetC
5d30: 6f 75 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  ount, 1, 0);.   
5d40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5d50: 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c    }.      defaul
5d60: 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t:.        asser
5d70: 74 28 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  t(0);.    } .   
5d80: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20   pTriggerStep = 
5d90: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 4e  pTriggerStep->pN
5da0: 65 78 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ext;.  }.  sqlit
5db0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5dc0: 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30  OP_ContextPop, 0
5dd0: 2c 20 30 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  , 0);.  VdbeComm
5de0: 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 74 72 69  ent((v, "end tri
5df0: 67 67 65 72 20 25 73 22 2c 20 70 53 74 65 70 4c  gger %s", pStepL
5e00: 69 73 74 2d 3e 70 54 72 69 67 2d 3e 6e 61 6d 65  ist->pTrig->name
5e10: 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b  ));..  return 0;
5e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
5e30: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 64 65  s called to code
5e40: 20 46 4f 52 20 45 41 43 48 20 52 4f 57 20 74 72   FOR EACH ROW tr
5e50: 69 67 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  iggers..**.** Wh
5e60: 65 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  en the code that
5e70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67   this function g
5e80: 65 6e 65 72 61 74 65 73 20 69 73 20 65 78 65 63  enerates is exec
5e90: 75 74 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  uted, the follow
5ea0: 69 6e 67 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  ing .** must be 
5eb0: 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 31 2e 20 4e  true:.**.** 1. N
5ec0: 6f 20 63 75 72 73 6f 72 73 20 6d 61 79 20 62 65  o cursors may be
5ed0: 20 6f 70 65 6e 20 69 6e 20 74 68 65 20 6d 61 69   open in the mai
5ee0: 6e 20 64 61 74 61 62 61 73 65 2e 20 20 28 42 75  n database.  (Bu
5ef0: 74 20 6e 65 77 49 64 78 20 61 6e 64 20 6f 6c 64  t newIdx and old
5f00: 49 64 78 0a 2a 2a 20 20 20 20 63 61 6e 20 62 65  Idx.**    can be
5f10: 20 69 6e 64 69 63 65 73 20 6f 66 20 63 75 72 73   indices of curs
5f20: 6f 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  ors in temporary
5f30: 20 74 61 62 6c 65 73 2e 20 20 53 65 65 20 62 65   tables.  See be
5f40: 6c 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 32 2e 20 49  low.).**.** 2. I
5f50: 66 20 74 68 65 20 74 72 69 67 67 65 72 73 20 62  f the triggers b
5f60: 65 69 6e 67 20 63 6f 64 65 64 20 61 72 65 20 4f  eing coded are O
5f70: 4e 20 49 4e 53 45 52 54 20 6f 72 20 4f 4e 20 55  N INSERT or ON U
5f80: 50 44 41 54 45 20 74 72 69 67 67 65 72 73 2c 20  PDATE triggers, 
5f90: 74 68 65 6e 0a 2a 2a 20 20 20 20 61 20 74 65 6d  then.**    a tem
5fa0: 70 6f 72 61 72 79 20 76 64 62 65 20 63 75 72 73  porary vdbe curs
5fb0: 6f 72 20 28 69 6e 64 65 78 20 6e 65 77 49 64 78  or (index newIdx
5fc0: 29 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61  ) must be open a
5fd0: 6e 64 20 70 6f 69 6e 74 69 6e 67 20 61 74 0a 2a  nd pointing at.*
5fe0: 2a 20 20 20 20 61 20 72 6f 77 20 63 6f 6e 74 61  *    a row conta
5ff0: 69 6e 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20  ining values to 
6000: 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 66  be substituted f
6010: 6f 72 20 6e 65 77 2e 2a 20 65 78 70 72 65 73 73  or new.* express
6020: 69 6f 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20  ions in the.**  
6030: 20 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61    trigger progra
6040: 6d 28 73 29 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 49  m(s)..**.** 3. I
6050: 66 20 74 68 65 20 74 72 69 67 67 65 72 73 20 62  f the triggers b
6060: 65 69 6e 67 20 63 6f 64 65 64 20 61 72 65 20 4f  eing coded are O
6070: 4e 20 44 45 4c 45 54 45 20 6f 72 20 4f 4e 20 55  N DELETE or ON U
6080: 50 44 41 54 45 20 74 72 69 67 67 65 72 73 2c 20  PDATE triggers, 
6090: 74 68 65 6e 0a 2a 2a 20 20 20 20 61 20 74 65 6d  then.**    a tem
60a0: 70 6f 72 61 72 79 20 76 64 62 65 20 63 75 72 73  porary vdbe curs
60b0: 6f 72 20 28 69 6e 64 65 78 20 6f 6c 64 49 64 78  or (index oldIdx
60c0: 29 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61  ) must be open a
60d0: 6e 64 20 70 6f 69 6e 74 69 6e 67 20 61 74 0a 2a  nd pointing at.*
60e0: 2a 20 20 20 20 61 20 72 6f 77 20 63 6f 6e 74 61  *    a row conta
60f0: 69 6e 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20  ining values to 
6100: 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 66  be substituted f
6110: 6f 72 20 6f 6c 64 2e 2a 20 65 78 70 72 65 73 73  or old.* express
6120: 69 6f 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20  ions in the.**  
6130: 20 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61    trigger progra
6140: 6d 28 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  m(s)..**.** If t
6150: 68 65 79 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c  hey are not NULL
6160: 2c 20 74 68 65 20 70 69 4f 6c 64 43 6f 6c 4d 61  , the piOldColMa
6170: 73 6b 20 61 6e 64 20 70 69 4e 65 77 43 6f 6c 4d  sk and piNewColM
6180: 61 73 6b 20 6f 75 74 70 75 74 20 76 61 72 69 61  ask output varia
6190: 62 6c 65 73 0a 2a 2a 20 61 72 65 20 73 65 74 20  bles.** are set 
61a0: 74 6f 20 76 61 6c 75 65 73 20 74 68 61 74 20 64  to values that d
61b0: 65 73 63 72 69 62 65 20 74 68 65 20 63 6f 6c 75  escribe the colu
61c0: 6d 6e 73 20 75 73 65 64 20 62 79 20 74 68 65 20  mns used by the 
61d0: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 0a  trigger program.
61e0: 2a 2a 20 69 6e 20 74 68 65 20 4f 4c 44 2e 2a 20  ** in the OLD.* 
61f0: 61 6e 64 20 4e 45 57 2e 2a 20 74 61 62 6c 65 73  and NEW.* tables
6200: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 49   respectively. I
6210: 66 20 63 6f 6c 75 6d 6e 20 4e 20 6f 66 20 74 68  f column N of th
6220: 65 20 0a 2a 2a 20 70 73 65 75 64 6f 2d 74 61 62  e .** pseudo-tab
6230: 6c 65 20 69 73 20 72 65 61 64 20 61 74 20 6c 65  le is read at le
6240: 61 73 74 20 6f 6e 63 65 2c 20 74 68 65 20 63 6f  ast once, the co
6250: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
6260: 6f 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  of the output.**
6270: 20 6d 61 73 6b 20 69 73 20 73 65 74 2e 20 49 66   mask is set. If
6280: 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61   a column with a
6290: 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
62a0: 74 68 61 6e 20 33 32 20 69 73 20 72 65 61 64 2c  than 32 is read,
62b0: 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 6d   the.** output m
62c0: 61 73 6b 20 69 73 20 73 65 74 20 74 6f 20 74 68  ask is set to th
62d0: 65 20 73 70 65 63 69 61 6c 20 76 61 6c 75 65 20  e special value 
62e0: 30 78 66 66 66 66 66 66 66 66 2e 0a 2a 2a 0a 2a  0xffffffff..**.*
62f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  /.int sqlite3Cod
6300: 65 52 6f 77 54 72 69 67 67 65 72 28 0a 20 20 50  eRowTrigger(.  P
6310: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6320: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
6330: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  text */.  int op
6340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6350: 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 50 44 41  * One of TK_UPDA
6360: 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54  TE, TK_INSERT, T
6370: 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 45 78  K_DELETE */.  Ex
6380: 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73  prList *pChanges
6390: 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69  ,  /* Changes li
63a0: 73 74 20 66 6f 72 20 61 6e 79 20 55 50 44 41 54  st for any UPDAT
63b0: 45 20 4f 46 20 74 72 69 67 67 65 72 73 20 2a 2f  E OF triggers */
63c0: 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20 20  .  int tr_tm,   
63d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
63e0: 66 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45  f TRIGGER_BEFORE
63f0: 2c 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20  , TRIGGER_AFTER 
6400: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
6410: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
6420: 20 74 61 62 6c 65 20 74 6f 20 63 6f 64 65 20 74   table to code t
6430: 72 69 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f 0a  riggers from */.
6440: 20 20 69 6e 74 20 6e 65 77 49 64 78 2c 20 20 20    int newIdx,   
6450: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
6460: 64 69 63 65 20 6f 66 20 74 68 65 20 22 6e 65 77  dice of the "new
6470: 22 20 72 6f 77 20 74 6f 20 61 63 63 65 73 73 20  " row to access 
6480: 2a 2f 0a 20 20 69 6e 74 20 6f 6c 64 49 64 78 2c  */.  int oldIdx,
6490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
64a0: 20 69 6e 64 69 63 65 20 6f 66 20 74 68 65 20 22   indice of the "
64b0: 6f 6c 64 22 20 72 6f 77 20 74 6f 20 61 63 63 65  old" row to acce
64c0: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f  ss */.  int orco
64d0: 6e 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nf,          /* 
64e0: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69  ON CONFLICT poli
64f0: 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67 6e 6f  cy */.  int igno
6500: 72 65 4a 75 6d 70 2c 20 20 20 20 20 20 2f 2a 20  reJump,      /* 
6510: 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6a  Instruction to j
6520: 75 6d 70 20 74 6f 20 66 6f 72 20 52 41 49 53 45  ump to for RAISE
6530: 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 20 20 75 33  (IGNORE) */.  u3
6540: 32 20 2a 70 69 4f 6c 64 43 6f 6c 4d 61 73 6b 2c  2 *piOldColMask,
6550: 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20     /* OUT: Mask 
6560: 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20  of columns used 
6570: 66 72 6f 6d 20 74 68 65 20 4f 4c 44 2e 2a 20 74  from the OLD.* t
6580: 61 62 6c 65 20 2a 2f 0a 20 20 75 33 32 20 2a 70  able */.  u32 *p
6590: 69 4e 65 77 43 6f 6c 4d 61 73 6b 20 20 20 20 2f  iNewColMask    /
65a0: 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 63  * OUT: Mask of c
65b0: 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 72 6f 6d  olumns used from
65c0: 20 74 68 65 20 4e 45 57 2e 2a 20 74 61 62 6c 65   the NEW.* table
65d0: 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72   */.){.  Trigger
65e0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
65f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6600: 0a 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20  .  TriggerStack 
6610: 74 72 69 67 53 74 61 63 6b 45 6e 74 72 79 3b 0a  trigStackEntry;.
6620: 0a 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72  .  trigStackEntr
6630: 79 2e 6f 6c 64 43 6f 6c 4d 61 73 6b 20 3d 20 30  y.oldColMask = 0
6640: 3b 0a 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74  ;.  trigStackEnt
6650: 72 79 2e 6e 65 77 43 6f 6c 4d 61 73 6b 20 3d 20  ry.newColMask = 
6660: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 6f 70 20  0;..  assert(op 
6670: 3d 3d 20 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20  == TK_UPDATE || 
6680: 6f 70 20 3d 3d 20 54 4b 5f 49 4e 53 45 52 54 20  op == TK_INSERT 
6690: 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 44 45 4c 45  || op == TK_DELE
66a0: 54 45 29 3b 0a 20 20 61 73 73 65 72 74 28 74 72  TE);.  assert(tr
66b0: 5f 74 6d 20 3d 3d 20 54 52 49 47 47 45 52 5f 42  _tm == TRIGGER_B
66c0: 45 46 4f 52 45 20 7c 7c 20 74 72 5f 74 6d 20 3d  EFORE || tr_tm =
66d0: 3d 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20  = TRIGGER_AFTER 
66e0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 6e 65 77  );..  assert(new
66f0: 49 64 78 20 21 3d 20 2d 31 20 7c 7c 20 6f 6c 64  Idx != -1 || old
6700: 49 64 78 20 21 3d 20 2d 31 29 3b 0a 0a 20 20 66  Idx != -1);..  f
6710: 6f 72 28 70 3d 70 54 61 62 2d 3e 70 54 72 69 67  or(p=pTab->pTrig
6720: 67 65 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  ger; p; p=p->pNe
6730: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 66 69 72  xt){.    int fir
6740: 65 5f 74 68 69 73 20 3d 20 30 3b 0a 0a 20 20 20  e_this = 0;..   
6750: 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68   /* Determine wh
6760: 65 74 68 65 72 20 77 65 20 73 68 6f 75 6c 64 20  ether we should 
6770: 63 6f 64 65 20 74 68 69 73 20 74 72 69 67 67 65  code this trigge
6780: 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 0a 20 20  r */.    if( .  
6790: 20 20 20 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26      p->op==op &&
67a0: 20 0a 20 20 20 20 20 20 70 2d 3e 74 72 5f 74 6d   .      p->tr_tm
67b0: 3d 3d 74 72 5f 74 6d 20 26 26 20 0a 20 20 20 20  ==tr_tm && .    
67c0: 20 20 28 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 70    (p->pSchema==p
67d0: 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 7c 7c 20  ->pTabSchema || 
67e0: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  p->pSchema==db->
67f0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 20  aDb[1].pSchema) 
6800: 26 26 0a 20 20 20 20 20 20 28 6f 70 21 3d 54 4b  &&.      (op!=TK
6810: 5f 55 50 44 41 54 45 7c 7c 21 70 2d 3e 70 43 6f  _UPDATE||!p->pCo
6820: 6c 75 6d 6e 73 7c 7c 63 68 65 63 6b 43 6f 6c 75  lumns||checkColu
6830: 6d 6e 4f 76 65 72 4c 61 70 28 70 2d 3e 70 43 6f  mnOverLap(p->pCo
6840: 6c 75 6d 6e 73 2c 70 43 68 61 6e 67 65 73 29 29  lumns,pChanges))
6850: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 54 72  .    ){.      Tr
6860: 69 67 67 65 72 53 74 61 63 6b 20 2a 70 53 3b 20  iggerStack *pS; 
6870: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6880: 74 6f 20 74 72 69 67 67 65 72 2d 73 74 61 63 6b  to trigger-stack
6890: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 20 20   entry */.      
68a0: 66 6f 72 28 70 53 3d 70 50 61 72 73 65 2d 3e 74  for(pS=pParse->t
68b0: 72 69 67 53 74 61 63 6b 3b 20 70 53 20 26 26 20  rigStack; pS && 
68c0: 70 21 3d 70 53 2d 3e 70 54 72 69 67 67 65 72 3b  p!=pS->pTrigger;
68d0: 20 70 53 3d 70 53 2d 3e 70 4e 65 78 74 29 7b 7d   pS=pS->pNext){}
68e0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 53 20 29  .      if( !pS )
68f0: 7b 0a 20 20 20 20 20 20 20 20 66 69 72 65 5f 74  {.        fire_t
6900: 68 69 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  his = 1;.      }
6910: 0a 23 69 66 20 30 20 20 20 20 2f 2a 20 47 69 76  .#if 0    /* Giv
6920: 65 20 6e 6f 20 77 61 72 6e 69 6e 67 20 66 6f 72  e no warning for
6930: 20 72 65 63 75 72 73 69 76 65 20 74 72 69 67 67   recursive trigg
6940: 65 72 73 2e 20 20 4a 75 73 74 20 64 6f 20 6e 6f  ers.  Just do no
6950: 74 20 64 6f 20 74 68 65 6d 20 2a 2f 0a 20 20 20  t do them */.   
6960: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20     else{.       
6970: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6980: 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72 73  (pParse, "recurs
6990: 69 76 65 20 74 72 69 67 67 65 72 73 20 6e 6f 74  ive triggers not
69a0: 20 73 75 70 70 6f 72 74 65 64 20 28 25 73 29 22   supported (%s)"
69b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  ,.            p-
69c0: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
69d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
69e0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ROR;.      }.#en
69f0: 64 69 66 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  dif.    }. .    
6a00: 69 66 28 20 66 69 72 65 5f 74 68 69 73 20 29 7b  if( fire_this ){
6a10: 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 54 72  .      int endTr
6a20: 69 67 67 65 72 3b 0a 20 20 20 20 20 20 45 78 70  igger;.      Exp
6a30: 72 20 2a 20 77 68 65 6e 45 78 70 72 3b 0a 20 20  r * whenExpr;.  
6a40: 20 20 20 20 41 75 74 68 43 6f 6e 74 65 78 74 20      AuthContext 
6a50: 73 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  sContext;.      
6a60: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
6a70: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6a80: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
6a90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6aa0: 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op4(pParse->pVdb
6ab0: 65 2c 20 4f 50 5f 54 72 61 63 65 2c 20 30 2c 20  e, OP_Trace, 0, 
6ac0: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
6ae0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
6af0: 20 22 2d 2d 20 54 52 49 47 47 45 52 20 25 73 22   "-- TRIGGER %s"
6b00: 2c 20 70 2d 3e 6e 61 6d 65 29 2c 0a 20 20 20 20  , p->name),.    
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b20: 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b      P4_DYNAMIC);
6b30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6d 65  .#endif.      me
6b40: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
6b50: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
6b60: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
6b70: 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20 2f 2a  Parse;..      /*
6b80: 20 50 75 73 68 20 61 6e 20 65 6e 74 72 79 20 6f   Push an entry o
6b90: 6e 20 74 6f 20 74 68 65 20 74 72 69 67 67 65 72  n to the trigger
6ba0: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20   stack */.      
6bb0: 74 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 70  trigStackEntry.p
6bc0: 54 72 69 67 67 65 72 20 3d 20 70 3b 0a 20 20 20  Trigger = p;.   
6bd0: 20 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72     trigStackEntr
6be0: 79 2e 6e 65 77 49 64 78 20 3d 20 6e 65 77 49 64  y.newIdx = newId
6bf0: 78 3b 0a 20 20 20 20 20 20 74 72 69 67 53 74 61  x;.      trigSta
6c00: 63 6b 45 6e 74 72 79 2e 6f 6c 64 49 64 78 20 3d  ckEntry.oldIdx =
6c10: 20 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 74   oldIdx;.      t
6c20: 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 70 54  rigStackEntry.pT
6c30: 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
6c40: 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e   trigStackEntry.
6c50: 70 4e 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  pNext = pParse->
6c60: 74 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20  trigStack;.     
6c70: 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e   trigStackEntry.
6c80: 69 67 6e 6f 72 65 4a 75 6d 70 20 3d 20 69 67 6e  ignoreJump = ign
6c90: 6f 72 65 4a 75 6d 70 3b 0a 20 20 20 20 20 20 70  oreJump;.      p
6ca0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
6cb0: 20 3d 20 26 74 72 69 67 53 74 61 63 6b 45 6e 74   = &trigStackEnt
6cc0: 72 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ry;.      sqlite
6cd0: 33 41 75 74 68 43 6f 6e 74 65 78 74 50 75 73 68  3AuthContextPush
6ce0: 28 70 50 61 72 73 65 2c 20 26 73 43 6f 6e 74 65  (pParse, &sConte
6cf0: 78 74 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 0a 20  xt, p->name);.. 
6d00: 20 20 20 20 20 2f 2a 20 63 6f 64 65 20 74 68 65       /* code the
6d10: 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
6d20: 20 20 20 20 20 20 65 6e 64 54 72 69 67 67 65 72        endTrigger
6d30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
6d40: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 2d 3e  keLabel(pParse->
6d50: 70 56 64 62 65 29 3b 0a 20 20 20 20 20 20 77 68  pVdbe);.      wh
6d60: 65 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  enExpr = sqlite3
6d70: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
6d80: 57 68 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  When);.      if(
6d90: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6da0: 64 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  d || sqlite3Expr
6db0: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
6dc0: 43 2c 20 77 68 65 6e 45 78 70 72 29 20 29 7b 0a  C, whenExpr) ){.
6dd0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
6de0: 74 72 69 67 53 74 61 63 6b 20 3d 20 74 72 69 67  trigStack = trig
6df0: 53 74 61 63 6b 45 6e 74 72 79 2e 70 4e 65 78 74  StackEntry.pNext
6e00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6e10: 33 45 78 70 72 44 65 6c 65 74 65 28 77 68 65 6e  3ExprDelete(when
6e20: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72  Expr);.        r
6e30: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
6e40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6e50: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
6e60: 2c 20 77 68 65 6e 45 78 70 72 2c 20 65 6e 64 54  , whenExpr, endT
6e70: 72 69 67 67 65 72 2c 20 53 51 4c 49 54 45 5f 4a  rigger, SQLITE_J
6e80: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
6e90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6ea0: 65 74 65 28 77 68 65 6e 45 78 70 72 29 3b 0a 0a  ete(whenExpr);..
6eb0: 20 20 20 20 20 20 63 6f 64 65 54 72 69 67 67 65        codeTrigge
6ec0: 72 50 72 6f 67 72 61 6d 28 70 50 61 72 73 65 2c  rProgram(pParse,
6ed0: 20 70 2d 3e 73 74 65 70 5f 6c 69 73 74 2c 20 6f   p->step_list, o
6ee0: 72 63 6f 6e 66 29 3b 20 0a 0a 20 20 20 20 20 20  rconf); ..      
6ef0: 2f 2a 20 50 6f 70 20 74 68 65 20 65 6e 74 72 79  /* Pop the entry
6f00: 20 6f 66 66 20 74 68 65 20 74 72 69 67 67 65 72   off the trigger
6f10: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20   stack */.      
6f20: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
6f30: 6b 20 3d 20 74 72 69 67 53 74 61 63 6b 45 6e 74  k = trigStackEnt
6f40: 72 79 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  ry.pNext;.      
6f50: 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65  sqlite3AuthConte
6f60: 78 74 50 6f 70 28 26 73 43 6f 6e 74 65 78 74 29  xtPop(&sContext)
6f70: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
6f80: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6f90: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
6fa0: 65 6e 64 54 72 69 67 67 65 72 29 3b 0a 20 20 20  endTrigger);.   
6fb0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 69 4f   }.  }.  if( piO
6fc0: 6c 64 43 6f 6c 4d 61 73 6b 20 29 20 2a 70 69 4f  ldColMask ) *piO
6fd0: 6c 64 43 6f 6c 4d 61 73 6b 20 7c 3d 20 74 72 69  ldColMask |= tri
6fe0: 67 53 74 61 63 6b 45 6e 74 72 79 2e 6f 6c 64 43  gStackEntry.oldC
6ff0: 6f 6c 4d 61 73 6b 3b 0a 20 20 69 66 28 20 70 69  olMask;.  if( pi
7000: 4e 65 77 43 6f 6c 4d 61 73 6b 20 29 20 2a 70 69  NewColMask ) *pi
7010: 4e 65 77 43 6f 6c 4d 61 73 6b 20 7c 3d 20 74 72  NewColMask |= tr
7020: 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 6e 65 77  igStackEntry.new
7030: 43 6f 6c 4d 61 73 6b 3b 0a 20 20 72 65 74 75 72  ColMask;.  retur
7040: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
7050: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7060: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a  _OMIT_TRIGGER) *
7070: 2f 0a                                            /.