/ Hex Artifact Content
Login

Artifact 66695e1375b969ea41a38dec9f40ea28bb0ac767:


0000: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  /*.**.** The aut
0010: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0020: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0030: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0040: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0050: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0060: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0070: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0080: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0090: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00a0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00b0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00c0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00d0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00e0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
00f0: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0100: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0110: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 0a 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  *.*.*/.#include 
0170: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23  "sqliteInt.h"..#
0180: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0190: 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a  IT_TRIGGER./*.**
01a0: 20 44 65 6c 65 74 65 20 61 20 6c 69 6e 6b 65 64   Delete a linked
01b0: 20 6c 69 73 74 20 6f 66 20 54 72 69 67 67 65 72   list of Trigger
01c0: 53 74 65 70 20 73 74 72 75 63 74 75 72 65 73 2e  Step structures.
01d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
01e0: 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65  DeleteTriggerSte
01f0: 70 28 54 72 69 67 67 65 72 53 74 65 70 20 2a 70  p(TriggerStep *p
0200: 54 72 69 67 67 65 72 53 74 65 70 29 7b 0a 20 20  TriggerStep){.  
0210: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 53  while( pTriggerS
0220: 74 65 70 20 29 7b 0a 20 20 20 20 54 72 69 67 67  tep ){.    Trigg
0230: 65 72 53 74 65 70 20 2a 20 70 54 6d 70 20 3d 20  erStep * pTmp = 
0240: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 20 20  pTriggerStep;.  
0250: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d    pTriggerStep =
0260: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
0270: 4e 65 78 74 3b 0a 0a 20 20 20 20 69 66 28 20 70  Next;..    if( p
0280: 54 6d 70 2d 3e 74 61 72 67 65 74 2e 64 79 6e 20  Tmp->target.dyn 
0290: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28  ) sqlite3_free((
02a0: 63 68 61 72 2a 29 70 54 6d 70 2d 3e 74 61 72 67  char*)pTmp->targ
02b0: 65 74 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  et.z);.    sqlit
02c0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 54 6d  e3ExprDelete(pTm
02d0: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
02e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02f0: 65 6c 65 74 65 28 70 54 6d 70 2d 3e 70 45 78 70  elete(pTmp->pExp
0300: 72 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  rList);.    sqli
0310: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
0320: 70 54 6d 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pTmp->pSelect);.
0330: 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
0340: 74 44 65 6c 65 74 65 28 70 54 6d 70 2d 3e 70 49  tDelete(pTmp->pI
0350: 64 4c 69 73 74 29 3b 0a 0a 20 20 20 20 73 71 6c  dList);..    sql
0360: 69 74 65 33 5f 66 72 65 65 28 70 54 6d 70 29 3b  ite3_free(pTmp);
0370: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
0380: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  is is called by 
0390: 74 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20  the parser when 
03a0: 69 74 20 73 65 65 73 20 61 20 43 52 45 41 54 45  it sees a CREATE
03b0: 20 54 52 49 47 47 45 52 20 73 74 61 74 65 6d 65   TRIGGER stateme
03c0: 6e 74 0a 2a 2a 20 75 70 20 74 6f 20 74 68 65 20  nt.** up to the 
03d0: 70 6f 69 6e 74 20 6f 66 20 74 68 65 20 42 45 47  point of the BEG
03e0: 49 4e 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  IN before the tr
03f0: 69 67 67 65 72 20 61 63 74 69 6f 6e 73 2e 20 20  igger actions.  
0400: 41 20 54 72 69 67 67 65 72 0a 2a 2a 20 73 74 72  A Trigger.** str
0410: 75 63 74 75 72 65 20 69 73 20 67 65 6e 65 72 61  ucture is genera
0420: 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
0430: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 76 61   information ava
0440: 69 6c 61 62 6c 65 20 61 6e 64 20 73 74 6f 72 65  ilable and store
0450: 64 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e  d.** in pParse->
0460: 70 4e 65 77 54 72 69 67 67 65 72 2e 20 20 41 66  pNewTrigger.  Af
0470: 74 65 72 20 74 68 65 20 74 72 69 67 67 65 72 20  ter the trigger 
0480: 61 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  actions have bee
0490: 6e 20 70 61 72 73 65 64 2c 20 74 68 65 0a 2a 2a  n parsed, the.**
04a0: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 54 72   sqlite3FinishTr
04b0: 69 67 67 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  igger() function
04c0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
04d0: 6d 70 6c 65 74 65 20 74 68 65 20 74 72 69 67 67  mplete the trigg
04e0: 65 72 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69  er.** constructi
04f0: 6f 6e 20 70 72 6f 63 65 73 73 2e 0a 2a 2f 0a 76  on process..*/.v
0500: 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
0510: 54 72 69 67 67 65 72 28 0a 20 20 50 61 72 73 65  Trigger(.  Parse
0520: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
0530: 2a 20 54 68 65 20 70 61 72 73 65 20 63 6f 6e 74  * The parse cont
0540: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
0550: 45 20 54 52 49 47 47 45 52 20 73 74 61 74 65 6d  E TRIGGER statem
0560: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
0570: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
0580: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
0590: 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 54 6f 6b  trigger */.  Tok
05a0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
05b0: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   /* The name of 
05c0: 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a 20  the trigger */. 
05d0: 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20 20   int tr_tm,     
05e0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
05f0: 4b 5f 42 45 46 4f 52 45 2c 20 54 4b 5f 41 46 54  K_BEFORE, TK_AFT
0600: 45 52 2c 20 54 4b 5f 49 4e 53 54 45 41 44 20 2a  ER, TK_INSTEAD *
0610: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
0620: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
0630: 66 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f  f TK_INSERT, TK_
0640: 55 50 44 41 54 45 2c 20 54 4b 5f 44 45 4c 45 54  UPDATE, TK_DELET
0650: 45 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  E */.  IdList *p
0660: 43 6f 6c 75 6d 6e 73 2c 20 20 20 2f 2a 20 63 6f  Columns,   /* co
0670: 6c 75 6d 6e 20 6c 69 73 74 20 69 66 20 74 68 69  lumn list if thi
0680: 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 4f  s is an UPDATE O
0690: 46 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 53  F trigger */.  S
06a0: 72 63 4c 69 73 74 20 2a 70 54 61 62 6c 65 4e 61  rcList *pTableNa
06b0: 6d 65 2c 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  me,/* The name o
06c0: 66 20 74 68 65 20 74 61 62 6c 65 2f 76 69 65 77  f the table/view
06d0: 20 74 68 65 20 74 72 69 67 67 65 72 20 61 70 70   the trigger app
06e0: 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 45 78 70  lies to */.  Exp
06f0: 72 20 2a 70 57 68 65 6e 2c 20 20 20 20 20 20 20  r *pWhen,       
0700: 20 2f 2a 20 57 48 45 4e 20 63 6c 61 75 73 65 20   /* WHEN clause 
0710: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
0720: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0730: 20 69 66 20 74 68 65 20 54 45 4d 50 4f 52 41 52   if the TEMPORAR
0740: 59 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  Y keyword is pre
0750: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  sent */.  int no
0760: 45 72 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Err           /*
0770: 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 73   Suppress errors
0780: 20 69 66 20 74 68 65 20 74 72 69 67 67 65 72 20   if the trigger 
0790: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
07a0: 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a  /.){.  Trigger *
07b0: 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20  pTrigger = 0;.  
07c0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 63  Table *pTab;.  c
07d0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
07e0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
07f0: 66 20 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f  f the trigger */
0800: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0810: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
0820: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
0830: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
0840: 74 61 62 61 73 65 20 74 6f 20 73 74 6f 72 65 20  tabase to store 
0850: 74 68 65 20 74 72 69 67 67 65 72 20 69 6e 20 2a  the trigger in *
0860: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
0870: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
0880: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 64  he unqualified d
0890: 62 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 46 69  b name */.  DbFi
08a0: 78 65 72 20 73 46 69 78 3b 0a 20 20 69 6e 74 20  xer sFix;.  int 
08b0: 69 54 61 62 44 62 3b 0a 0a 20 20 61 73 73 65 72  iTabDb;..  asser
08c0: 74 28 20 70 4e 61 6d 65 31 21 3d 30 20 29 3b 20  t( pName1!=0 ); 
08d0: 20 20 2f 2a 20 70 4e 61 6d 65 31 2d 3e 7a 20 6d    /* pName1->z m
08e0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 2c 20 62 75  ight be NULL, bu
08f0: 74 20 6e 6f 74 20 70 4e 61 6d 65 31 20 69 74 73  t not pName1 its
0900: 65 6c 66 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  elf */.  assert(
0910: 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20   pName2!=0 );.  
0920: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
0930: 20 20 2f 2a 20 49 66 20 54 45 4d 50 20 77 61 73    /* If TEMP was
0940: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
0950: 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d   the trigger nam
0960: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
0970: 6c 69 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 69  lified. */.    i
0980: 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  f( pName2->n>0 )
0990: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
09a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
09b0: 22 74 65 6d 70 6f 72 61 72 79 20 74 72 69 67 67  "temporary trigg
09c0: 65 72 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  er may not have 
09d0: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 22 29  qualified name")
09e0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69  ;.      goto tri
09f0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
0a00: 20 20 7d 0a 20 20 20 20 69 44 62 20 3d 20 31 3b    }.    iDb = 1;
0a10: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61  .    pName = pNa
0a20: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me1;.  }else{.  
0a30: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
0a40: 74 68 65 20 64 62 20 74 68 61 74 20 74 68 65 20  the db that the 
0a50: 74 68 65 20 74 72 69 67 67 65 72 20 77 69 6c 6c  the trigger will
0a60: 20 62 65 20 63 72 65 61 74 65 64 20 69 6e 20 2a   be created in *
0a70: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
0a80: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
0a90: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
0aa0: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
0ab0: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
0ac0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
0ad0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
0ae0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
0af0: 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65  the trigger name
0b00: 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
0b10: 2c 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  , and the table 
0b20: 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  is a temp table,
0b30: 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 69  .  ** then set i
0b40: 44 62 20 74 6f 20 31 20 74 6f 20 63 72 65 61 74  Db to 1 to creat
0b50: 65 20 74 68 65 20 74 72 69 67 67 65 72 20 69 6e  e the trigger in
0b60: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
0b70: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20 49 66  atabase..  ** If
0b80: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
0b90: 6f 6f 6b 75 70 28 29 20 72 65 74 75 72 6e 73 20  ookup() returns 
0ba0: 30 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  0, indicating th
0bb0: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
0bc0: 0a 20 20 2a 2a 20 65 78 69 73 74 2c 20 74 68 65  .  ** exist, the
0bd0: 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74   error is caught
0be0: 20 62 79 20 74 68 65 20 62 6c 6f 63 6b 20 62 65   by the block be
0bf0: 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  low..  */.  if( 
0c00: 21 70 54 61 62 6c 65 4e 61 6d 65 20 7c 7c 20 64  !pTableName || d
0c10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0c20: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67  ){.    goto trig
0c30: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
0c40: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
0c50: 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
0c60: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d  Parse, pTableNam
0c70: 65 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32  e);.  if( pName2
0c80: 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
0c90: 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d  & pTab->pSchema=
0ca0: 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
0cb0: 65 6d 61 20 29 7b 0a 20 20 20 20 69 44 62 20 3d  ema ){.    iDb =
0cc0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e   1;.  }..  /* En
0cd0: 73 75 72 65 20 74 68 65 20 74 61 62 6c 65 20 6e  sure the table n
0ce0: 61 6d 65 20 6d 61 74 63 68 65 73 20 64 61 74 61  ame matches data
0cf0: 62 61 73 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  base name and th
0d00: 61 74 20 74 68 65 20 74 61 62 6c 65 20 65 78 69  at the table exi
0d10: 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  sts */.  if( db-
0d20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
0d30: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
0d40: 61 6e 75 70 3b 0a 20 20 61 73 73 65 72 74 28 20  anup;.  assert( 
0d50: 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e 53 72 63  pTableName->nSrc
0d60: 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==1 );.  if( sql
0d70: 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
0d80: 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
0d90: 22 74 72 69 67 67 65 72 22 2c 20 70 4e 61 6d 65  "trigger", pName
0da0: 29 20 26 26 20 0a 20 20 20 20 20 20 73 71 6c 69  ) && .      sqli
0db0: 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
0dc0: 46 69 78 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  Fix, pTableName)
0dd0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69   ){.    goto tri
0de0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
0df0: 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  }.  pTab = sqlit
0e00: 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
0e10: 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61  pParse, pTableNa
0e20: 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
0e30: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74   ){.    /* The t
0e40: 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  able does not ex
0e50: 69 73 74 2e 20 2a 2f 0a 20 20 20 20 67 6f 74 6f  ist. */.    goto
0e60: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
0e70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
0e80: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
0e90: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
0ea0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
0eb0: 6f 74 20 63 72 65 61 74 65 20 74 72 69 67 67 65  ot create trigge
0ec0: 72 73 20 6f 6e 20 76 69 72 74 75 61 6c 20 74 61  rs on virtual ta
0ed0: 62 6c 65 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f  bles");.    goto
0ee0: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
0ef0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
0f00: 6b 20 74 68 61 74 20 74 68 65 20 74 72 69 67 67  k that the trigg
0f10: 65 72 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 72  er name is not r
0f20: 65 73 65 72 76 65 64 20 61 6e 64 20 74 68 61 74  eserved and that
0f30: 20 6e 6f 20 74 72 69 67 67 65 72 20 6f 66 20 74   no trigger of t
0f40: 68 65 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  he.  ** specifie
0f50: 64 20 6e 61 6d 65 20 65 78 69 73 74 73 20 2a 2f  d name exists */
0f60: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
0f70: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
0f80: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
0f90: 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 53 51 4c 49  ( !zName || SQLI
0fa0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
0fb0: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
0fc0: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
0fd0: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
0fe0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
0ff0: 69 66 28 20 73 71 6c 69 74 65 33 48 61 73 68 46  if( sqlite3HashF
1000: 69 6e 64 28 26 28 64 62 2d 3e 61 44 62 5b 69 44  ind(&(db->aDb[iD
1010: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67  b].pSchema->trig
1020: 48 61 73 68 29 2c 20 7a 4e 61 6d 65 2c 73 74 72  Hash), zName,str
1030: 6c 65 6e 28 7a 4e 61 6d 65 29 29 20 29 7b 0a 20  len(zName)) ){. 
1040: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
1050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1060: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1070: 74 72 69 67 67 65 72 20 25 54 20 61 6c 72 65 61  trigger %T alrea
1080: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
1090: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  e);.    }.    go
10a0: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
10b0: 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  up;.  }..  /* Do
10c0: 20 6e 6f 74 20 63 72 65 61 74 65 20 61 20 74 72   not create a tr
10d0: 69 67 67 65 72 20 6f 6e 20 61 20 73 79 73 74 65  igger on a syste
10e0: 6d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28  m table */.  if(
10f0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1100: 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
1110: 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29  qlite_", 7)==0 )
1120: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1130: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
1140: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74 72 69  annot create tri
1150: 67 67 65 72 20 6f 6e 20 73 79 73 74 65 6d 20 74  gger on system t
1160: 61 62 6c 65 22 29 3b 0a 20 20 20 20 70 50 61 72  able");.    pPar
1170: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
1180: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
1190: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
11a0: 49 4e 53 54 45 41 44 20 6f 66 20 74 72 69 67 67  INSTEAD of trigg
11b0: 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 66 6f 72  ers are only for
11c0: 20 76 69 65 77 73 20 61 6e 64 20 76 69 65 77 73   views and views
11d0: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 49 4e   only support IN
11e0: 53 54 45 41 44 0a 20 20 2a 2a 20 6f 66 20 74 72  STEAD.  ** of tr
11f0: 69 67 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  iggers..  */.  i
1200: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
1210: 20 26 26 20 74 72 5f 74 6d 21 3d 54 4b 5f 49 4e   && tr_tm!=TK_IN
1220: 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73 71 6c  STEAD ){.    sql
1230: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1240: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65  rse, "cannot cre
1250: 61 74 65 20 25 73 20 74 72 69 67 67 65 72 20 6f  ate %s trigger o
1260: 6e 20 76 69 65 77 3a 20 25 53 22 2c 20 0a 20 20  n view: %S", .  
1270: 20 20 20 20 20 20 28 74 72 5f 74 6d 20 3d 3d 20        (tr_tm == 
1280: 54 4b 5f 42 45 46 4f 52 45 29 3f 22 42 45 46 4f  TK_BEFORE)?"BEFO
1290: 52 45 22 3a 22 41 46 54 45 52 22 2c 20 70 54 61  RE":"AFTER", pTa
12a0: 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  bleName, 0);.   
12b0: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
12c0: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28  eanup;.  }.  if(
12d0: 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
12e0: 26 26 20 74 72 5f 74 6d 3d 3d 54 4b 5f 49 4e 53  && tr_tm==TK_INS
12f0: 54 45 41 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  TEAD ){.    sqli
1300: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1310: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61  se, "cannot crea
1320: 74 65 20 49 4e 53 54 45 41 44 20 4f 46 22 0a 20  te INSTEAD OF". 
1330: 20 20 20 20 20 20 20 22 20 74 72 69 67 67 65 72         " trigger
1340: 20 6f 6e 20 74 61 62 6c 65 3a 20 25 53 22 2c 20   on table: %S", 
1350: 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a  pTableName, 0);.
1360: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
1370: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
1380: 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33  iTabDb = sqlite3
1390: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
13a0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13b0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
13c0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
13d0: 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
13e0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
13f0: 52 45 41 54 45 5f 54 52 49 47 47 45 52 3b 0a 20  REATE_TRIGGER;. 
1400: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1410: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 54 61  Db = db->aDb[iTa
1420: 62 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  bDb].zName;.    
1430: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 54  const char *zDbT
1440: 72 69 67 20 3d 20 69 73 54 65 6d 70 20 3f 20 64  rig = isTemp ? d
1450: 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20  b->aDb[1].zName 
1460: 3a 20 7a 44 62 3b 0a 20 20 20 20 69 66 28 20 69  : zDb;.    if( i
1470: 54 61 62 44 62 3d 3d 31 20 7c 7c 20 69 73 54 65  TabDb==1 || isTe
1480: 6d 70 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  mp ) code = SQLI
1490: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
14a0: 52 49 47 47 45 52 3b 0a 20 20 20 20 69 66 28 20  RIGGER;.    if( 
14b0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14c0: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a  (pParse, code, z
14d0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
14e0: 65 2c 20 7a 44 62 54 72 69 67 29 20 29 7b 0a 20  e, zDbTrig) ){. 
14f0: 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65       goto trigge
1500: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  r_cleanup;.    }
1510: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1520: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1530: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
1540: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 54   SCHEMA_TABLE(iT
1550: 61 62 44 62 29 2c 30 2c 7a 44 62 29 29 7b 0a 20  abDb),0,zDb)){. 
1560: 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65       goto trigge
1570: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  r_cleanup;.    }
1580: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1590: 2a 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69  * INSTEAD OF tri
15a0: 67 67 65 72 73 20 63 61 6e 20 6f 6e 6c 79 20 61  ggers can only a
15b0: 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73 20 61  ppear on views a
15c0: 6e 64 20 42 45 46 4f 52 45 20 74 72 69 67 67 65  nd BEFORE trigge
15d0: 72 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 61  rs.  ** cannot a
15e0: 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73 2e 20  ppear on views. 
15f0: 20 53 6f 20 77 65 20 6d 69 67 68 74 20 61 73 20   So we might as 
1600: 77 65 6c 6c 20 74 72 61 6e 73 6c 61 74 65 20 65  well translate e
1610: 76 65 72 79 0a 20 20 2a 2a 20 49 4e 53 54 45 41  very.  ** INSTEA
1620: 44 20 4f 46 20 74 72 69 67 67 65 72 20 69 6e 74  D OF trigger int
1630: 6f 20 61 20 42 45 46 4f 52 45 20 74 72 69 67 67  o a BEFORE trigg
1640: 65 72 2e 20 20 49 74 20 73 69 6d 70 6c 69 66 69  er.  It simplifi
1650: 65 73 20 63 6f 64 65 0a 20 20 2a 2a 20 65 6c 73  es code.  ** els
1660: 65 77 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  ewhere..  */.  i
1670: 66 20 28 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 49  f (tr_tm == TK_I
1680: 4e 53 54 45 41 44 29 7b 0a 20 20 20 20 74 72 5f  NSTEAD){.    tr_
1690: 74 6d 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 0a  tm = TK_BEFORE;.
16a0: 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20    }..  /* Build 
16b0: 74 68 65 20 54 72 69 67 67 65 72 20 6f 62 6a 65  the Trigger obje
16c0: 63 74 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72  ct */.  pTrigger
16d0: 20 3d 20 28 54 72 69 67 67 65 72 2a 29 73 71 6c   = (Trigger*)sql
16e0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
16f0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72 69 67  (db, sizeof(Trig
1700: 67 65 72 29 29 3b 0a 20 20 69 66 28 20 70 54 72  ger));.  if( pTr
1710: 69 67 67 65 72 3d 3d 30 20 29 20 67 6f 74 6f 20  igger==0 ) goto 
1720: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
1730: 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  .  pTrigger->nam
1740: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7a 4e 61  e = zName;.  zNa
1750: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 72 69 67 67  me = 0;.  pTrigg
1760: 65 72 2d 3e 74 61 62 6c 65 20 3d 20 73 71 6c 69  er->table = sqli
1770: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
1780: 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61 5b 30 5d  pTableName->a[0]
1790: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 70 54 72 69 67  .zName);.  pTrig
17a0: 67 65 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  ger->pSchema = d
17b0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
17c0: 65 6d 61 3b 0a 20 20 70 54 72 69 67 67 65 72 2d  ema;.  pTrigger-
17d0: 3e 70 54 61 62 53 63 68 65 6d 61 20 3d 20 70 54  >pTabSchema = pT
17e0: 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 70  ab->pSchema;.  p
17f0: 54 72 69 67 67 65 72 2d 3e 6f 70 20 3d 20 6f 70  Trigger->op = op
1800: 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 74 72  ;.  pTrigger->tr
1810: 5f 74 6d 20 3d 20 74 72 5f 74 6d 3d 3d 54 4b 5f  _tm = tr_tm==TK_
1820: 42 45 46 4f 52 45 20 3f 20 54 52 49 47 47 45 52  BEFORE ? TRIGGER
1830: 5f 42 45 46 4f 52 45 20 3a 20 54 52 49 47 47 45  _BEFORE : TRIGGE
1840: 52 5f 41 46 54 45 52 3b 0a 20 20 70 54 72 69 67  R_AFTER;.  pTrig
1850: 67 65 72 2d 3e 70 57 68 65 6e 20 3d 20 73 71 6c  ger->pWhen = sql
1860: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1870: 70 57 68 65 6e 29 3b 0a 20 20 70 54 72 69 67 67  pWhen);.  pTrigg
1880: 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 20 3d 20 73  er->pColumns = s
1890: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
18a0: 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20  db, pColumns);. 
18b0: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
18c0: 79 28 64 62 2c 20 26 70 54 72 69 67 67 65 72 2d  y(db, &pTrigger-
18d0: 3e 6e 61 6d 65 54 6f 6b 65 6e 2c 70 4e 61 6d 65  >nameToken,pName
18e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
18f0: 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72  rse->pNewTrigger
1900: 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ==0 );.  pParse-
1910: 3e 70 4e 65 77 54 72 69 67 67 65 72 20 3d 20 70  >pNewTrigger = p
1920: 54 72 69 67 67 65 72 3b 0a 0a 74 72 69 67 67 65  Trigger;..trigge
1930: 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  r_cleanup:.  sql
1940: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
1950: 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
1960: 73 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 4e  stDelete(pTableN
1970: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  ame);.  sqlite3I
1980: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 43 6f 6c  dListDelete(pCol
1990: 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  umns);.  sqlite3
19a0: 45 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 6e  ExprDelete(pWhen
19b0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  );.  if( !pParse
19c0: 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20 29 7b  ->pNewTrigger ){
19d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
19e0: 74 65 54 72 69 67 67 65 72 28 70 54 72 69 67 67  teTrigger(pTrigg
19f0: 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
1a00: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1a10: 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 3d 3d 70  ->pNewTrigger==p
1a20: 54 72 69 67 67 65 72 20 29 3b 0a 20 20 7d 0a 7d  Trigger );.  }.}
1a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1a40: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
1a50: 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  fter all of the 
1a60: 74 72 69 67 67 65 72 20 61 63 74 69 6f 6e 73 20  trigger actions 
1a70: 68 61 76 65 20 62 65 65 6e 20 70 61 72 73 65 64  have been parsed
1a80: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
1a90: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f  complete the pro
1aa0: 63 65 73 73 20 6f 66 20 62 75 69 6c 64 69 6e 67  cess of building
1ab0: 20 74 68 65 20 74 72 69 67 67 65 72 2e 0a 2a 2f   the trigger..*/
1ac0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e  .void sqlite3Fin
1ad0: 69 73 68 54 72 69 67 67 65 72 28 0a 20 20 50 61  ishTrigger(.  Pa
1ae0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1af0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
1b00: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69  context */.  Tri
1b10: 67 67 65 72 53 74 65 70 20 2a 70 53 74 65 70 4c  ggerStep *pStepL
1b20: 69 73 74 2c 20 2f 2a 20 54 68 65 20 74 72 69 67  ist, /* The trig
1b30: 67 65 72 65 64 20 70 72 6f 67 72 61 6d 20 2a 2f  gered program */
1b40: 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 6c 20 20  .  Token *pAll  
1b50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
1b60: 6b 65 6e 20 74 68 61 74 20 64 65 73 63 72 69 62  ken that describ
1b70: 65 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  es the complete 
1b80: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 2a  CREATE TRIGGER *
1b90: 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a  /.){.  Trigger *
1ba0: 70 54 72 69 67 20 3d 20 30 3b 20 20 20 20 20 2f  pTrig = 0;     /
1bb0: 2a 20 54 68 65 20 74 72 69 67 67 65 72 20 77 68  * The trigger wh
1bc0: 6f 73 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  ose construction
1bd0: 20 69 73 20 66 69 6e 69 73 68 69 6e 67 20 75 70   is finishing up
1be0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1bf0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1c00: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1c10: 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46   */.  DbFixer sF
1c20: 69 78 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  ix;.  int iDb;  
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1c50: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 72 69 67  taining the trig
1c60: 67 65 72 20 2a 2f 0a 0a 20 20 70 54 72 69 67 20  ger */..  pTrig 
1c70: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72  = pParse->pNewTr
1c80: 69 67 67 65 72 3b 0a 20 20 70 50 61 72 73 65 2d  igger;.  pParse-
1c90: 3e 70 4e 65 77 54 72 69 67 67 65 72 20 3d 20 30  >pNewTrigger = 0
1ca0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1cb0: 6e 45 72 72 20 7c 7c 20 21 70 54 72 69 67 20 29  nErr || !pTrig )
1cc0: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e   goto triggerfin
1cd0: 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69  ish_cleanup;.  i
1ce0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
1cf0: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
1d00: 2d 3e 64 62 2c 20 70 54 72 69 67 2d 3e 70 53 63  ->db, pTrig->pSc
1d10: 68 65 6d 61 29 3b 0a 20 20 70 54 72 69 67 2d 3e  hema);.  pTrig->
1d20: 73 74 65 70 5f 6c 69 73 74 20 3d 20 70 53 74 65  step_list = pSte
1d30: 70 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  pList;.  while( 
1d40: 70 53 74 65 70 4c 69 73 74 20 29 7b 0a 20 20 20  pStepList ){.   
1d50: 20 70 53 74 65 70 4c 69 73 74 2d 3e 70 54 72 69   pStepList->pTri
1d60: 67 20 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 70  g = pTrig;.    p
1d70: 53 74 65 70 4c 69 73 74 20 3d 20 70 53 74 65 70  StepList = pStep
1d80: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  List->pNext;.  }
1d90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
1da0: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
1db0: 72 73 65 2c 20 69 44 62 2c 20 22 74 72 69 67 67  rse, iDb, "trigg
1dc0: 65 72 22 2c 20 26 70 54 72 69 67 2d 3e 6e 61 6d  er", &pTrig->nam
1dd0: 65 54 6f 6b 65 6e 29 20 0a 20 20 20 20 20 20 20  eToken) .       
1de0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78     && sqlite3Fix
1df0: 54 72 69 67 67 65 72 53 74 65 70 28 26 73 46 69  TriggerStep(&sFi
1e00: 78 2c 20 70 54 72 69 67 2d 3e 73 74 65 70 5f 6c  x, pTrig->step_l
1e10: 69 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ist) ){.    goto
1e20: 20 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63   triggerfinish_c
1e30: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  leanup;.  }..  /
1e40: 2a 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  * if we are not 
1e50: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 61 6e  initializing, an
1e60: 64 20 74 68 69 73 20 74 72 69 67 67 65 72 20 69  d this trigger i
1e70: 73 20 6e 6f 74 20 6f 6e 20 61 20 54 45 4d 50 20  s not on a TEMP 
1e80: 74 61 62 6c 65 2c 20 0a 20 20 2a 2a 20 62 75 69  table, .  ** bui
1e90: 6c 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ld the sqlite_ma
1ea0: 73 74 65 72 20 65 6e 74 72 79 0a 20 20 2a 2f 0a  ster entry.  */.
1eb0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
1ec0: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 74 61 74  busy ){.    stat
1ed0: 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c  ic const VdbeOpL
1ee0: 69 73 74 20 69 6e 73 65 72 74 54 72 69 67 5b 5d  ist insertTrig[]
1ef0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
1f00: 4e 65 77 52 6f 77 69 64 2c 20 20 20 30 2c 20 30  NewRowid,   0, 0
1f10: 2c 20 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c  ,  0          },
1f20: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
1f30: 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c 20 20 22  ng8,    0, 0,  "
1f40: 74 72 69 67 67 65 72 22 20 20 7d 2c 0a 20 20 20  trigger"  },.   
1f50: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c     { OP_String8,
1f60: 20 20 20 20 30 2c 20 30 2c 20 20 30 20 20 20 20      0, 0,  0    
1f70: 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20 32 3a 20        },  /* 2: 
1f80: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 2a 2f 0a  trigger name */.
1f90: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
1fa0: 67 38 2c 20 20 20 20 30 2c 20 30 2c 20 20 30 20  g8,    0, 0,  0 
1fb0: 20 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20           },  /* 
1fc0: 33 3a 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  3: table name */
1fd0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
1fe0: 67 65 72 2c 20 20 20 20 30 2c 20 30 2c 20 20 30  ger,    0, 0,  0
1ff0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2000: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c     { OP_String8,
2010: 20 20 20 20 30 2c 20 30 2c 20 20 22 43 52 45 41      0, 0,  "CREA
2020: 54 45 20 54 52 49 47 47 45 52 20 22 7d 2c 0a 20  TE TRIGGER "},. 
2030: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
2040: 38 2c 20 20 20 20 30 2c 20 30 2c 20 20 30 20 20  8,    0, 0,  0  
2050: 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20 36          },  /* 6
2060: 3a 20 53 51 4c 20 2a 2f 0a 20 20 20 20 20 20 7b  : SQL */.      {
2070: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 20 20 20 20   OP_Concat,     
2080: 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20 20  0, 0,  0        
2090: 20 20 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50    }, .      { OP
20a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
20b0: 30 2c 20 20 22 61 61 61 64 61 22 20 20 20 20 7d  0,  "aaada"    }
20c0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 73  ,.      { OP_Ins
20d0: 65 72 74 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ert,     0, 0,  
20e0: 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  0          },.  
20f0: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 61 64 64    };.    int add
2100: 72 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  r;.    Vdbe *v;.
2110: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20  .    /* Make an 
2120: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73 71 6c  entry in the sql
2130: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
2140: 20 2a 2f 0a 20 20 20 20 76 20 3d 20 73 71 6c 69   */.    v = sqli
2150: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
2160: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
2170: 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66   ) goto triggerf
2180: 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20  inish_cleanup;. 
2190: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
21a0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
21b0: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
21c0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
21d0: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
21e0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64 72  , iDb);.    addr
21f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2200: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
2210: 53 69 7a 65 28 69 6e 73 65 72 74 54 72 69 67 29  Size(insertTrig)
2220: 2c 20 69 6e 73 65 72 74 54 72 69 67 29 3b 0a 20  , insertTrig);. 
2230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2240: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2b 32  angeP3(v, addr+2
2250: 2c 20 70 54 72 69 67 2d 3e 6e 61 6d 65 2c 20 30  , pTrig->name, 0
2260: 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ); .    sqlite3V
2270: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
2280: 64 64 72 2b 33 2c 20 70 54 72 69 67 2d 3e 74 61  ddr+3, pTrig->ta
2290: 62 6c 65 2c 20 30 29 3b 20 0a 20 20 20 20 73 71  ble, 0); .    sq
22a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
22b0: 33 28 76 2c 20 61 64 64 72 2b 36 2c 20 28 63 68  3(v, addr+6, (ch
22c0: 61 72 2a 29 70 41 6c 6c 2d 3e 7a 2c 20 70 41 6c  ar*)pAll->z, pAl
22d0: 6c 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  l->n);.    sqlit
22e0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
22f0: 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  b, v, iDb);.    
2300: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2310: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
2320: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2330: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
2340: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
2350: 30 2c 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74  0, sqlite3MPrint
2360: 66 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22  f(.        db, "
2370: 74 79 70 65 3d 27 74 72 69 67 67 65 72 27 20 41  type='trigger' A
2380: 4e 44 20 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70  ND name='%q'", p
2390: 54 72 69 67 2d 3e 6e 61 6d 65 29 2c 20 50 33 5f  Trig->name), P3_
23a0: 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20  DYNAMIC.    );. 
23b0: 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   }..  if( db->in
23c0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
23d0: 6e 74 20 6e 3b 0a 20 20 20 20 54 61 62 6c 65 20  nt n;.    Table 
23e0: 2a 70 54 61 62 3b 0a 20 20 20 20 54 72 69 67 67  *pTab;.    Trigg
23f0: 65 72 20 2a 70 44 65 6c 3b 0a 20 20 20 20 70 44  er *pDel;.    pD
2400: 65 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  el = sqlite3Hash
2410: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
2420: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72  iDb].pSchema->tr
2430: 69 67 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  igHash, .       
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
2450: 72 69 67 2d 3e 6e 61 6d 65 2c 20 73 74 72 6c 65  rig->name, strle
2460: 6e 28 70 54 72 69 67 2d 3e 6e 61 6d 65 29 2c 20  n(pTrig->name), 
2470: 70 54 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20  pTrig);.    if( 
2480: 70 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 61 73  pDel ){.      as
2490: 73 65 72 74 28 20 70 44 65 6c 3d 3d 70 54 72 69  sert( pDel==pTri
24a0: 67 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6d  g );.      db->m
24b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
24c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
24d0: 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75  gerfinish_cleanu
24e0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  p;.    }.    n =
24f0: 20 73 74 72 6c 65 6e 28 70 54 72 69 67 2d 3e 74   strlen(pTrig->t
2500: 61 62 6c 65 29 20 2b 20 31 3b 0a 20 20 20 20 70  able) + 1;.    p
2510: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Tab = sqlite3Has
2520: 68 46 69 6e 64 28 26 70 54 72 69 67 2d 3e 70 54  hFind(&pTrig->pT
2530: 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  abSchema->tblHas
2540: 68 2c 20 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c  h, pTrig->table,
2550: 20 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   n);.    assert(
2560: 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
2570: 70 54 72 69 67 2d 3e 70 4e 65 78 74 20 3d 20 70  pTrig->pNext = p
2580: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  Tab->pTrigger;. 
2590: 20 20 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65     pTab->pTrigge
25a0: 72 20 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 70  r = pTrig;.    p
25b0: 54 72 69 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 74  Trig = 0;.  }..t
25c0: 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65  riggerfinish_cle
25d0: 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 44  anup:.  sqlite3D
25e0: 65 6c 65 74 65 54 72 69 67 67 65 72 28 70 54 72  eleteTrigger(pTr
25f0: 69 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ig);.  assert( !
2600: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
2610: 67 65 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ger );.  sqlite3
2620: 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65  DeleteTriggerSte
2630: 70 28 70 53 74 65 70 4c 69 73 74 29 3b 0a 7d 0a  p(pStepList);.}.
2640: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f  ./*.** Make a co
2650: 70 79 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 6f 6e  py of all compon
2660: 65 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76 65  ents of the give
2670: 6e 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20  n trigger step. 
2680: 20 54 68 69 73 20 68 61 73 0a 2a 2a 20 74 68 65   This has.** the
2690: 20 65 66 66 65 63 74 20 6f 66 20 63 6f 70 79 69   effect of copyi
26a0: 6e 67 20 61 6c 6c 20 45 78 70 72 2e 74 6f 6b 65  ng all Expr.toke
26b0: 6e 2e 7a 20 76 61 6c 75 65 73 20 69 6e 74 6f 20  n.z values into 
26c0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a  memory obtained.
26d0: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
26e0: 6d 61 6c 6c 6f 63 28 29 2e 20 20 41 73 20 69 6e  malloc().  As in
26f0: 69 74 69 61 6c 6c 79 20 63 72 65 61 74 65 64 2c  itially created,
2700: 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
2710: 7a 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6c 6c 20  z values.** all 
2720: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
2730: 75 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 77  ut string that w
2740: 61 73 20 66 65 64 20 74 6f 20 74 68 65 20 70 61  as fed to the pa
2750: 72 73 65 72 2e 20 20 42 75 74 20 74 68 61 74 0a  rser.  But that.
2760: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 70 68  ** string is eph
2770: 65 6d 65 72 61 6c 20 2d 20 69 74 20 77 69 6c 6c  emeral - it will
2780: 20 67 6f 20 61 77 61 79 20 61 73 20 73 6f 6f 6e   go away as soon
2790: 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f   as the sqlite3_
27a0: 65 78 65 63 28 29 0a 2a 2a 20 63 61 6c 6c 20 74  exec().** call t
27b0: 68 61 74 20 73 74 61 72 74 65 64 20 74 68 65 20  hat started the 
27c0: 70 61 72 73 65 72 20 65 78 69 74 73 2e 20 20 54  parser exits.  T
27d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
27e0: 73 20 61 20 70 65 72 73 69 73 74 65 6e 74 0a 2a  s a persistent.*
27f0: 2a 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 74 68  * copy of all th
2800: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 73  e Expr.token.z s
2810: 74 72 69 6e 67 73 20 73 6f 20 74 68 61 74 20 74  trings so that t
2820: 68 65 20 54 72 69 67 67 65 72 53 74 65 70 20 73  he TriggerStep s
2830: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 69 6c 6c  tructure.** will
2840: 20 62 65 20 76 61 6c 69 64 20 65 76 65 6e 20 61   be valid even a
2850: 66 74 65 72 20 74 68 65 20 73 71 6c 69 74 65 33  fter the sqlite3
2860: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
2870: 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  urns..*/.static 
2880: 76 6f 69 64 20 73 71 6c 69 74 65 50 65 72 73 69  void sqlitePersi
2890: 73 74 54 72 69 67 67 65 72 53 74 65 70 28 73 71  stTriggerStep(sq
28a0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 72 69 67 67  lite3 *db, Trigg
28b0: 65 72 53 74 65 70 20 2a 70 29 7b 0a 20 20 69 66  erStep *p){.  if
28c0: 28 20 70 2d 3e 74 61 72 67 65 74 2e 7a 20 29 7b  ( p->target.z ){
28d0: 0a 20 20 20 20 70 2d 3e 74 61 72 67 65 74 2e 7a  .    p->target.z
28e0: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44   = (u8*)sqlite3D
28f0: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
2900: 61 72 2a 29 70 2d 3e 74 61 72 67 65 74 2e 7a 2c  ar*)p->target.z,
2910: 20 70 2d 3e 74 61 72 67 65 74 2e 6e 29 3b 0a 20   p->target.n);. 
2920: 20 20 20 70 2d 3e 74 61 72 67 65 74 2e 64 79 6e     p->target.dyn
2930: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
2940: 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
2950: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d    Select *pNew =
2960: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
2970: 70 28 64 62 2c 20 70 2d 3e 70 53 65 6c 65 63 74  p(db, p->pSelect
2980: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
2990: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53  lectDelete(p->pS
29a0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70  elect);.    p->p
29b0: 53 65 6c 65 63 74 20 3d 20 70 4e 65 77 3b 0a 20  Select = pNew;. 
29c0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65   }.  if( p->pWhe
29d0: 72 65 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  re ){.    Expr *
29e0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
29f0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
2a00: 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
2a10: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
2a20: 57 68 65 72 65 29 3b 0a 20 20 20 20 70 2d 3e 70  Where);.    p->p
2a30: 57 68 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Where = pNew;.  
2a40: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 78 70 72  }.  if( p->pExpr
2a50: 4c 69 73 74 20 29 7b 0a 20 20 20 20 45 78 70 72  List ){.    Expr
2a60: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c  List *pNew = sql
2a70: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2a80: 64 62 2c 20 70 2d 3e 70 45 78 70 72 4c 69 73 74  db, p->pExprList
2a90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2aa0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
2ab0: 70 45 78 70 72 4c 69 73 74 29 3b 0a 20 20 20 20  pExprList);.    
2ac0: 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 70  p->pExprList = p
2ad0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  New;.  }.  if( p
2ae0: 2d 3e 70 49 64 4c 69 73 74 20 29 7b 0a 20 20 20  ->pIdList ){.   
2af0: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20   IdList *pNew = 
2b00: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
2b10: 28 64 62 2c 20 70 2d 3e 70 49 64 4c 69 73 74 29  (db, p->pIdList)
2b20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
2b30: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 49 64  istDelete(p->pId
2b40: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 49  List);.    p->pI
2b50: 64 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  dList = pNew;.  
2b60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  }.}../*.** Turn 
2b70: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2b80: 6e 74 20 28 74 68 61 74 20 74 68 65 20 70 53 65  nt (that the pSe
2b90: 6c 65 63 74 20 70 61 72 61 6d 65 74 65 72 20 70  lect parameter p
2ba0: 6f 69 6e 74 73 20 74 6f 29 20 69 6e 74 6f 0a 2a  oints to) into.*
2bb0: 2a 20 61 20 74 72 69 67 67 65 72 20 73 74 65 70  * a trigger step
2bc0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
2bd0: 74 65 72 20 74 6f 20 61 20 54 72 69 67 67 65 72  ter to a Trigger
2be0: 53 74 65 70 20 73 74 72 75 63 74 75 72 65 2e 0a  Step structure..
2bf0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
2c00: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
2c10: 69 6e 65 20 77 68 65 6e 20 69 74 20 66 69 6e 64  ine when it find
2c20: 73 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  s a SELECT state
2c30: 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62 6f 64 79 20  ment in.** body 
2c40: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 0a  of a TRIGGER.  .
2c50: 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a  */.TriggerStep *
2c60: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 53 65  sqlite3TriggerSe
2c70: 6c 65 63 74 53 74 65 70 28 73 71 6c 69 74 65 33  lectStep(sqlite3
2c80: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 53   *db, Select *pS
2c90: 65 6c 65 63 74 29 7b 0a 20 20 54 72 69 67 67 65  elect){.  Trigge
2ca0: 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53  rStep *pTriggerS
2cb0: 74 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tep = sqlite3DbM
2cc0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
2cd0: 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70  zeof(TriggerStep
2ce0: 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67  ));.  if( pTrigg
2cf0: 65 72 53 74 65 70 3d 3d 30 20 29 20 7b 0a 20 20  erStep==0 ) {.  
2d00: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2d10: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
2d20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2d30: 7d 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  }..  pTriggerSte
2d40: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
2d50: 54 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  T;.  pTriggerSte
2d60: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65  p->pSelect = pSe
2d70: 6c 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65 72  lect;.  pTrigger
2d80: 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f  Step->orconf = O
2d90: 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 73 71 6c  E_Default;.  sql
2da0: 69 74 65 50 65 72 73 69 73 74 54 72 69 67 67 65  itePersistTrigge
2db0: 72 53 74 65 70 28 64 62 2c 20 70 54 72 69 67 67  rStep(db, pTrigg
2dc0: 65 72 53 74 65 70 29 3b 0a 0a 20 20 72 65 74 75  erStep);..  retu
2dd0: 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b  rn pTriggerStep;
2de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 69 6c 64 20  .}../*.** Build 
2df0: 61 20 74 72 69 67 67 65 72 20 73 74 65 70 20 6f  a trigger step o
2e00: 75 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20  ut of an INSERT 
2e10: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
2e20: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
2e30: 74 6f 20 74 68 65 20 6e 65 77 20 74 72 69 67 67  to the new trigg
2e40: 65 72 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  er step..**.** T
2e50: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
2e60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
2e70: 6e 20 69 74 20 73 65 65 73 20 61 6e 20 49 4e 53  n it sees an INS
2e80: 45 52 54 20 69 6e 73 69 64 65 20 74 68 65 0a 2a  ERT inside the.*
2e90: 2a 20 62 6f 64 79 20 6f 66 20 61 20 74 72 69 67  * body of a trig
2ea0: 67 65 72 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53  ger..*/.TriggerS
2eb0: 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67  tep *sqlite3Trig
2ec0: 67 65 72 49 6e 73 65 72 74 53 74 65 70 28 0a 20  gerInsertStep(. 
2ed0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
2ee0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
2ef0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2f00: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
2f10: 6c 65 4e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  leName,  /* Name
2f20: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e   of the table in
2f30: 74 6f 20 77 68 69 63 68 20 77 65 20 69 6e 73 65  to which we inse
2f40: 72 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  rt */.  IdList *
2f50: 70 43 6f 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20 4c  pColumn,    /* L
2f60: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
2f70: 6e 20 70 54 61 62 6c 65 4e 61 6d 65 20 74 6f 20  n pTableName to 
2f80: 69 6e 73 65 72 74 20 69 6e 74 6f 20 2a 2f 0a 20  insert into */. 
2f90: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2fa0: 74 2c 20 20 20 2f 2a 20 54 68 65 20 56 41 4c 55  t,   /* The VALU
2fb0: 45 20 63 6c 61 75 73 65 3a 20 61 20 6c 69 73 74  E clause: a list
2fc0: 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 62 65   of values to be
2fd0: 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 53   inserted */.  S
2fe0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
2ff0: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
3000: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 73 75  tatement that su
3010: 70 70 6c 69 65 73 20 76 61 6c 75 65 73 20 2a 2f  pplies values */
3020: 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20  .  int orconf   
3030: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
3040: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
3050: 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 52   (OE_Abort, OE_R
3060: 65 70 6c 61 63 65 2c 20 65 74 63 2e 29 20 2a 2f  eplace, etc.) */
3070: 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65  .){.  TriggerSte
3080: 70 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b  p *pTriggerStep;
3090: 0a 0a 20 20 61 73 73 65 72 74 28 70 45 4c 69 73  ..  assert(pELis
30a0: 74 20 3d 3d 20 30 20 7c 7c 20 70 53 65 6c 65 63  t == 0 || pSelec
30b0: 74 20 3d 3d 20 30 29 3b 0a 20 20 61 73 73 65 72  t == 0);.  asser
30c0: 74 28 70 45 4c 69 73 74 20 21 3d 20 30 20 7c 7c  t(pEList != 0 ||
30d0: 20 70 53 65 6c 65 63 74 20 21 3d 20 30 20 7c 7c   pSelect != 0 ||
30e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
30f0: 64 29 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53  d);..  pTriggerS
3100: 74 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tep = sqlite3DbM
3110: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
3120: 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70  zeof(TriggerStep
3130: 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67  ));.  if( pTrigg
3140: 65 72 53 74 65 70 20 29 7b 0a 20 20 20 20 70 54  erStep ){.    pT
3150: 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d  riggerStep->op =
3160: 20 54 4b 5f 49 4e 53 45 52 54 3b 0a 20 20 20 20   TK_INSERT;.    
3170: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53  pTriggerStep->pS
3180: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
3190: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
31a0: 70 2d 3e 74 61 72 67 65 74 20 20 3d 20 2a 70 54  p->target  = *pT
31b0: 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 20 20 70 54  ableName;.    pT
31c0: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c  riggerStep->pIdL
31d0: 69 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20  ist = pColumn;. 
31e0: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
31f0: 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 70 45 4c  >pExprList = pEL
3200: 69 73 74 3b 0a 20 20 20 20 70 54 72 69 67 67 65  ist;.    pTrigge
3210: 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20  rStep->orconf = 
3220: 6f 72 63 6f 6e 66 3b 0a 20 20 20 20 73 71 6c 69  orconf;.    sqli
3230: 74 65 50 65 72 73 69 73 74 54 72 69 67 67 65 72  tePersistTrigger
3240: 53 74 65 70 28 64 62 2c 20 70 54 72 69 67 67 65  Step(db, pTrigge
3250: 72 53 74 65 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  rStep);.  }else{
3260: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
3270: 73 74 44 65 6c 65 74 65 28 70 43 6f 6c 75 6d 6e  stDelete(pColumn
3280: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3290: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c  prListDelete(pEL
32a0: 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
32b0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
32c0: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 72  elect);.  }..  r
32d0: 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74  eturn pTriggerSt
32e0: 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  ep;.}../*.** Con
32f0: 73 74 72 75 63 74 20 61 20 74 72 69 67 67 65 72  struct a trigger
3300: 20 73 74 65 70 20 74 68 61 74 20 69 6d 70 6c 65   step that imple
3310: 6d 65 6e 74 73 20 61 6e 20 55 50 44 41 54 45 20  ments an UPDATE 
3320: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65  statement and re
3330: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
3340: 72 20 74 6f 20 74 68 61 74 20 74 72 69 67 67 65  r to that trigge
3350: 72 20 73 74 65 70 2e 20 20 54 68 65 20 70 61 72  r step.  The par
3360: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
3370: 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 0a 2a  outine when it.*
3380: 2a 20 73 65 65 73 20 61 6e 20 55 50 44 41 54 45  * sees an UPDATE
3390: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69 64   statement insid
33a0: 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  e the body of a 
33b0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 2e 0a  CREATE TRIGGER..
33c0: 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a  */.TriggerStep *
33d0: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 55 70  sqlite3TriggerUp
33e0: 64 61 74 65 53 74 65 70 28 0a 20 20 73 71 6c 69  dateStep(.  sqli
33f0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
3400: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
3410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
3420: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
3430: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
3440: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
3450: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 45 78   updated */.  Ex
3460: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
3470: 20 20 20 2f 2a 20 54 68 65 20 53 45 54 20 63 6c     /* The SET cl
3480: 61 75 73 65 3a 20 6c 69 73 74 20 6f 66 20 63 6f  ause: list of co
3490: 6c 75 6d 6e 20 61 6e 64 20 6e 65 77 20 76 61 6c  lumn and new val
34a0: 75 65 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ues */.  Expr *p
34b0: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 2f 2a  Where,        /*
34c0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
34d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e  e */.  int orcon
34e0: 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  f           /* T
34f0: 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  he conflict algo
3500: 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72 74  rithm. (OE_Abort
3510: 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63  , OE_Ignore, etc
3520: 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65  ) */.){.  Trigge
3530: 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53  rStep *pTriggerS
3540: 74 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tep = sqlite3DbM
3550: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
3560: 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70  zeof(TriggerStep
3570: 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67  ));.  if( pTrigg
3580: 65 72 53 74 65 70 3d 3d 30 20 29 7b 0a 20 20 20  erStep==0 ){.   
3590: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
35a0: 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b  tDelete(pEList);
35b0: 0a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  .     sqlite3Exp
35c0: 72 44 65 6c 65 74 65 28 70 57 68 65 72 65 29 3b  rDelete(pWhere);
35d0: 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  .     return 0;.
35e0: 20 20 7d 0a 0a 20 20 70 54 72 69 67 67 65 72 53    }..  pTriggerS
35f0: 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 55 50 44  tep->op = TK_UPD
3600: 41 54 45 3b 0a 20 20 70 54 72 69 67 67 65 72 53  ATE;.  pTriggerS
3610: 74 65 70 2d 3e 74 61 72 67 65 74 20 20 3d 20 2a  tep->target  = *
3620: 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 70 54  pTableName;.  pT
3630: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70  riggerStep->pExp
3640: 72 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  rList = pEList;.
3650: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3660: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
3670: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
3680: 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66  >orconf = orconf
3690: 3b 0a 20 20 73 71 6c 69 74 65 50 65 72 73 69 73  ;.  sqlitePersis
36a0: 74 54 72 69 67 67 65 72 53 74 65 70 28 64 62 2c  tTriggerStep(db,
36b0: 20 70 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a   pTriggerStep);.
36c0: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67  .  return pTrigg
36d0: 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erStep;.}../*.**
36e0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69   Construct a tri
36f0: 67 67 65 72 20 73 74 65 70 20 74 68 61 74 20 69  gger step that i
3700: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 44 45 4c 45  mplements a DELE
3710: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  TE statement and
3720: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
3730: 6e 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69  nter to that tri
3740: 67 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20  gger step.  The 
3750: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
3760: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69  s routine when i
3770: 74 0a 2a 2a 20 73 65 65 73 20 61 20 44 45 4c 45  t.** sees a DELE
3780: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73  TE statement ins
3790: 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20  ide the body of 
37a0: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  a CREATE TRIGGER
37b0: 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70  ..*/.TriggerStep
37c0: 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72   *sqlite3Trigger
37d0: 44 65 6c 65 74 65 53 74 65 70 28 0a 20 20 73 71  DeleteStep(.  sq
37e0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
37f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
3800: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
3810: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
3820: 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ame,      /* The
3830: 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
3840: 68 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74  h rows are delet
3850: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
3860: 68 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20  here            
3870: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3880: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  use */.){.  Trig
3890: 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65  gerStep *pTrigge
38a0: 72 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 44  rStep = sqlite3D
38b0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
38c0: 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74  sizeof(TriggerSt
38d0: 65 70 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69  ep));.  if( pTri
38e0: 67 67 65 72 53 74 65 70 3d 3d 30 20 29 7b 0a 20  ggerStep==0 ){. 
38f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3900: 6c 65 74 65 28 70 57 68 65 72 65 29 3b 0a 20 20  lete(pWhere);.  
3910: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3920: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
3930: 3e 6f 70 20 3d 20 54 4b 5f 44 45 4c 45 54 45 3b  >op = TK_DELETE;
3940: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
3950: 3e 74 61 72 67 65 74 20 20 3d 20 2a 70 54 61 62  >target  = *pTab
3960: 6c 65 4e 61 6d 65 3b 0a 20 20 70 54 72 69 67 67  leName;.  pTrigg
3970: 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d  erStep->pWhere =
3980: 20 70 57 68 65 72 65 3b 0a 20 20 70 54 72 69 67   pWhere;.  pTrig
3990: 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20  gerStep->orconf 
39a0: 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20  = OE_Default;.  
39b0: 73 71 6c 69 74 65 50 65 72 73 69 73 74 54 72 69  sqlitePersistTri
39c0: 67 67 65 72 53 74 65 70 28 64 62 2c 20 70 54 72  ggerStep(db, pTr
39d0: 69 67 67 65 72 53 74 65 70 29 3b 0a 0a 20 20 72  iggerStep);..  r
39e0: 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74  eturn pTriggerSt
39f0: 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65  ep;.}../* .** Re
3a00: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
3a10: 20 61 20 54 72 69 67 67 65 72 20 73 74 72 75 63   a Trigger struc
3a20: 74 75 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ture.*/.void sql
3a30: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
3a40: 72 28 54 72 69 67 67 65 72 20 2a 70 54 72 69 67  r(Trigger *pTrig
3a50: 67 65 72 29 7b 0a 20 20 69 66 28 20 70 54 72 69  ger){.  if( pTri
3a60: 67 67 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  gger==0 ) return
3a70: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  ;.  sqlite3Delet
3a80: 65 54 72 69 67 67 65 72 53 74 65 70 28 70 54 72  eTriggerStep(pTr
3a90: 69 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69 73 74  igger->step_list
3aa0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3ab0: 65 28 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65  e(pTrigger->name
3ac0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3ad0: 65 28 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c  e(pTrigger->tabl
3ae0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
3af0: 72 44 65 6c 65 74 65 28 70 54 72 69 67 67 65 72  rDelete(pTrigger
3b00: 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 73 71 6c 69  ->pWhen);.  sqli
3b10: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
3b20: 70 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d  pTrigger->pColum
3b30: 6e 73 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67  ns);.  if( pTrig
3b40: 67 65 72 2d 3e 6e 61 6d 65 54 6f 6b 65 6e 2e 64  ger->nameToken.d
3b50: 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  yn ) sqlite3_fre
3b60: 65 28 28 63 68 61 72 2a 29 70 54 72 69 67 67 65  e((char*)pTrigge
3b70: 72 2d 3e 6e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  r->nameToken.z);
3b80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3b90: 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  pTrigger);.}../*
3ba0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3bb0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  n is called to d
3bc0: 72 6f 70 20 61 20 74 72 69 67 67 65 72 20 66 72  rop a trigger fr
3bd0: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
3be0: 73 63 68 65 6d 61 2e 20 0a 2a 2a 0a 2a 2a 20 54  schema. .**.** T
3bf0: 68 69 73 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  his may be calle
3c00: 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
3c10: 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 74  the parser and t
3c20: 68 65 72 65 66 6f 72 65 20 69 64 65 6e 74 69 66  herefore identif
3c30: 69 65 73 0a 2a 2a 20 74 68 65 20 74 72 69 67 67  ies.** the trigg
3c40: 65 72 20 62 79 20 6e 61 6d 65 2e 20 20 54 68 65  er by name.  The
3c50: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
3c60: 67 65 72 50 74 72 28 29 20 72 6f 75 74 69 6e 65  gerPtr() routine
3c70: 20 64 6f 65 73 20 74 68 65 0a 2a 2a 20 73 61 6d   does the.** sam
3c80: 65 20 6a 6f 62 20 61 73 20 74 68 69 73 20 72 6f  e job as this ro
3c90: 75 74 69 6e 65 20 65 78 63 65 70 74 20 69 74 20  utine except it 
3ca0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
3cb0: 74 6f 20 74 68 65 20 74 72 69 67 67 65 72 0a 2a  to the trigger.*
3cc0: 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  * instead of the
3cd0: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 2e 0a 2a   trigger name..*
3ce0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3cf0: 72 6f 70 54 72 69 67 67 65 72 28 50 61 72 73 65  ropTrigger(Parse
3d00: 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
3d10: 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 6e 6f  t *pName, int no
3d20: 45 72 72 29 7b 0a 20 20 54 72 69 67 67 65 72 20  Err){.  Trigger 
3d30: 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20  *pTrigger = 0;. 
3d40: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
3d50: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e  char *zDb;.  con
3d60: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
3d70: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 73    int nName;.  s
3d80: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
3d90: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
3da0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3db0: 20 29 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69   ) goto drop_tri
3dc0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
3dd0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
3de0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
3df0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
3e00: 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67 65  goto drop_trigge
3e10: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  r_cleanup;.  }..
3e20: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
3e30: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 7a 44  >nSrc==1 );.  zD
3e40: 62 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  b = pName->a[0].
3e50: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7a 4e 61  zDatabase;.  zNa
3e60: 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  me = pName->a[0]
3e70: 2e 7a 4e 61 6d 65 3b 0a 20 20 6e 4e 61 6d 65 20  .zName;.  nName 
3e80: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
3e90: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
3ea0: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
3eb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
3ec0: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
3ed0: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
3ee0: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
3ef0: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26  */.    if( zDb &
3f00: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
3f10: 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d  (db->aDb[j].zNam
3f20: 65 2c 20 7a 44 62 29 20 29 20 63 6f 6e 74 69 6e  e, zDb) ) contin
3f30: 75 65 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  ue;.    pTrigger
3f40: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
3f50: 6e 64 28 26 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e  nd(&(db->aDb[j].
3f60: 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73  pSchema->trigHas
3f70: 68 29 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  h), zName, nName
3f80: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72 69 67  );.    if( pTrig
3f90: 67 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ger ) break;.  }
3fa0: 0a 20 20 69 66 28 20 21 70 54 72 69 67 67 65 72  .  if( !pTrigger
3fb0: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6e 6f 45   ){.    if( !noE
3fc0: 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rr ){.      sqli
3fd0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3fe0: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 72 69  se, "no such tri
3ff0: 67 67 65 72 3a 20 25 53 22 2c 20 70 4e 61 6d 65  gger: %S", pName
4000: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
4010: 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67 65  goto drop_trigge
4020: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  r_cleanup;.  }. 
4030: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
4040: 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
4050: 54 72 69 67 67 65 72 29 3b 0a 0a 64 72 6f 70 5f  Trigger);..drop_
4060: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a  trigger_cleanup:
4070: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
4080: 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
4090: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
40a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
40b0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
40c0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74   for the table t
40d0: 68 61 74 20 61 20 74 72 69 67 67 65 72 0a 2a 2a  hat a trigger.**
40e0: 20 69 73 20 73 65 74 20 6f 6e 2e 0a 2a 2f 0a 73   is set on..*/.s
40f0: 74 61 74 69 63 20 54 61 62 6c 65 20 2a 74 61 62  tatic Table *tab
4100: 6c 65 4f 66 54 72 69 67 67 65 72 28 54 72 69 67  leOfTrigger(Trig
4110: 67 65 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a  ger *pTrigger){.
4120: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
4130: 28 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65  (pTrigger->table
4140: 29 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  ) + 1;.  return 
4150: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
4160: 26 70 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53  &pTrigger->pTabS
4170: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
4180: 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 2c  pTrigger->table,
4190: 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44   n);.}.../*.** D
41a0: 72 6f 70 20 61 20 74 72 69 67 67 65 72 20 67 69  rop a trigger gi
41b0: 76 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ven a pointer to
41c0: 20 74 68 61 74 20 74 72 69 67 67 65 72 2e 20 0a   that trigger. .
41d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
41e0: 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 50 61  ropTriggerPtr(Pa
41f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 72 69  rse *pParse, Tri
4200: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 29 7b  gger *pTrigger){
4210: 0a 20 20 54 61 62 6c 65 20 20 20 2a 70 54 61 62  .  Table   *pTab
4220: 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  le;.  Vdbe *v;. 
4230: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4240: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
4250: 20 69 44 62 3b 0a 0a 20 20 69 44 62 20 3d 20 73   iDb;..  iDb = s
4260: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
4270: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
4280: 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
4290: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
42a0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
42b0: 6e 44 62 20 29 3b 0a 20 20 70 54 61 62 6c 65 20  nDb );.  pTable 
42c0: 3d 20 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72  = tableOfTrigger
42d0: 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 61 73  (pTrigger);.  as
42e0: 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
42f0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
4300: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 72 69 67  ->pSchema==pTrig
4310: 67 65 72 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20  ger->pSchema || 
4320: 69 44 62 3d 3d 31 20 29 3b 0a 23 69 66 6e 64 65  iDb==1 );.#ifnde
4330: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
4340: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
4350: 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
4360: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47  QLITE_DROP_TRIGG
4370: 45 52 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ER;.    const ch
4380: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
4390: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
43a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
43b0: 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
43c0: 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  E(iDb);.    if( 
43d0: 69 44 62 3d 3d 31 20 29 20 63 6f 64 65 20 3d 20  iDb==1 ) code = 
43e0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
43f0: 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 69 66  _TRIGGER;.    if
4400: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
4410: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
4420: 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 2c   pTrigger->name,
4430: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20   pTable->zName, 
4440: 7a 44 62 29 20 7c 7c 0a 20 20 20 20 20 20 73 71  zDb) ||.      sq
4450: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
4460: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
4470: 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
4480: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Db) ){.      ret
4490: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  urn;.    }.  }.#
44a0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
44b0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 65 73  rate code to des
44c0: 74 72 6f 79 20 74 68 65 20 64 61 74 61 62 61 73  troy the databas
44d0: 65 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  e record of the 
44e0: 74 72 69 67 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  trigger..  */.  
44f0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
4500: 30 20 29 3b 0a 20 20 69 66 28 20 28 76 20 3d 20  0 );.  if( (v = 
4510: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
4520: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
4530: 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20    int base;.    
4540: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62  static const Vdb
4550: 65 4f 70 4c 69 73 74 20 64 72 6f 70 54 72 69 67  eOpList dropTrig
4560: 67 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ger[] = {.      
4570: 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
4580: 20 30 2c 20 41 44 44 52 28 39 29 2c 20 20 30 7d   0, ADDR(9),  0}
4590: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72  ,.      { OP_Str
45a0: 69 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c 20 20  ing8,    0, 0,  
45b0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
45c0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  /.      { OP_Col
45d0: 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20  umn,     0, 1,  
45e0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
45f0: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
4600: 20 30 2c 20 41 44 44 52 28 38 29 2c 20 20 30 7d   0, ADDR(8),  0}
4610: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72  ,.      { OP_Str
4620: 69 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c 20 20  ing8,    0, 0,  
4630: 20 20 20 20 20 20 22 74 72 69 67 67 65 72 22 7d        "trigger"}
4640: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
4650: 75 6d 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  umn,     0, 0,  
4660: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
4670: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
4680: 20 30 2c 20 41 44 44 52 28 38 29 2c 20 20 30 7d   0, ADDR(8),  0}
4690: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c  ,.      { OP_Del
46a0: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ete,     0, 0,  
46b0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
46c0: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
46d0: 20 30 2c 20 41 44 44 52 28 31 29 2c 20 20 30 7d   0, ADDR(1),  0}
46e0: 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b  , /* 8 */.    };
46f0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ..    sqlite3Beg
4700: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
4710: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
4720: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  ;.    sqlite3Ope
4730: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
4740: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 62  rse, iDb);.    b
4750: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
4760: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 20 41  eAddOpList(v,  A
4770: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 72 69  rraySize(dropTri
4780: 67 67 65 72 29 2c 20 64 72 6f 70 54 72 69 67 67  gger), dropTrigg
4790: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
47a0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
47b0: 62 61 73 65 2b 31 2c 20 70 54 72 69 67 67 65 72  base+1, pTrigger
47c0: 2d 3e 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  ->name, 0);.    
47d0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
47e0: 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
47f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4800: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
4810: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
4820: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
4830: 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72 2c 20  OP_DropTrigger, 
4840: 69 44 62 2c 20 30 2c 20 70 54 72 69 67 67 65 72  iDb, 0, pTrigger
4850: 2d 3e 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  ->name, 0);.  }.
4860: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
4870: 61 20 74 72 69 67 67 65 72 20 66 72 6f 6d 20 74  a trigger from t
4880: 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f  he hash tables o
4890: 66 20 74 68 65 20 73 71 6c 69 74 65 2a 20 70 6f  f the sqlite* po
48a0: 69 6e 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  inter..*/.void s
48b0: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
48c0: 65 6c 65 74 65 54 72 69 67 67 65 72 28 73 71 6c  eleteTrigger(sql
48d0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
48e0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
48f0: 4e 61 6d 65 29 7b 0a 20 20 54 72 69 67 67 65 72  Name){.  Trigger
4900: 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 69 6e   *pTrigger;.  in
4910: 74 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e  t nName = strlen
4920: 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 54 72 69 67  (zName);.  pTrig
4930: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 48 61 73  ger = sqlite3Has
4940: 68 49 6e 73 65 72 74 28 26 28 64 62 2d 3e 61 44  hInsert(&(db->aD
4950: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
4960: 74 72 69 67 48 61 73 68 29 2c 0a 20 20 20 20 20  trigHash),.     
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c            zName,
4990: 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66   nName, 0);.  if
49a0: 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
49b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20    Table *pTable 
49c0: 3d 20 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72  = tableOfTrigger
49d0: 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20  (pTrigger);.    
49e0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
49f0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
4a00: 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 20 3d 3d  ble->pTrigger ==
4a10: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
4a20: 20 20 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67     pTable->pTrig
4a30: 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
4a40: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
4a50: 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 20  {.      Trigger 
4a60: 2a 63 63 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54  *cc = pTable->pT
4a70: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 77 68  rigger;.      wh
4a80: 69 6c 65 28 20 63 63 20 29 7b 20 0a 20 20 20 20  ile( cc ){ .    
4a90: 20 20 20 20 69 66 28 20 63 63 2d 3e 70 4e 65 78      if( cc->pNex
4aa0: 74 20 3d 3d 20 70 54 72 69 67 67 65 72 20 29 7b  t == pTrigger ){
4ab0: 0a 20 20 20 20 20 20 20 20 20 20 63 63 2d 3e 70  .          cc->p
4ac0: 4e 65 78 74 20 3d 20 63 63 2d 3e 70 4e 65 78 74  Next = cc->pNext
4ad0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
4ae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4af0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 63 20 3d    }.        cc =
4b00: 20 63 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   cc->pNext;.    
4b10: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
4b20: 28 63 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  (cc);.    }.    
4b30: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
4b40: 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a  gger(pTrigger);.
4b50: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
4b60: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
4b70: 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  anges;.  }.}../*
4b80: 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 74 68  .** pEList is th
4b90: 65 20 53 45 54 20 63 6c 61 75 73 65 20 6f 66 20  e SET clause of 
4ba0: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
4bb0: 65 6e 74 2e 20 20 45 61 63 68 20 65 6e 74 72 79  ent.  Each entry
4bc0: 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 69 73  .** in pEList is
4bd0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 61 74 20 3c   of the format <
4be0: 69 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49 66 20  id>=<expr>.  If 
4bf0: 61 6e 79 20 6f 66 20 74 68 65 20 65 6e 74 72 69  any of the entri
4c00: 65 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20  es.** in pEList 
4c10: 68 61 76 65 20 61 6e 20 3c 69 64 3e 20 77 68 69  have an <id> whi
4c20: 63 68 20 6d 61 74 63 68 65 73 20 61 6e 20 69 64  ch matches an id
4c30: 65 6e 74 69 66 69 65 72 20 69 6e 20 70 49 64 4c  entifier in pIdL
4c40: 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  ist,.** then ret
4c50: 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 70 49  urn TRUE.  If pI
4c60: 64 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65  dList==NULL, the
4c70: 6e 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72  n it is consider
4c80: 65 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61 72 64  ed a.** wildcard
4c90: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 6e   that matches an
4ca0: 79 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77 69 73  ything.  Likewis
4cb0: 65 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55 4c  e if pEList==NUL
4cc0: 4c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d 61 74  L then.** it mat
4cd0: 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20 73 6f  ches anything so
4ce0: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   always return t
4cf0: 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  rue.  Return fal
4d00: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  se only.** if th
4d10: 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2e  ere is no match.
4d20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
4d30: 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 4c 61  heckColumnOverLa
4d40: 70 28 49 64 4c 69 73 74 20 2a 70 49 64 4c 69 73  p(IdList *pIdLis
4d50: 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  t, ExprList *pEL
4d60: 69 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b 0a 20  ist){.  int e;. 
4d70: 20 69 66 28 20 21 70 49 64 4c 69 73 74 20 7c 7c   if( !pIdList ||
4d80: 20 21 70 45 4c 69 73 74 20 29 20 72 65 74 75 72   !pEList ) retur
4d90: 6e 20 31 3b 0a 20 20 66 6f 72 28 65 3d 30 3b 20  n 1;.  for(e=0; 
4da0: 65 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  e<pEList->nExpr;
4db0: 20 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   e++){.    if( s
4dc0: 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
4dd0: 78 28 70 49 64 4c 69 73 74 2c 20 70 45 4c 69 73  x(pIdList, pELis
4de0: 74 2d 3e 61 5b 65 5d 2e 7a 4e 61 6d 65 29 3e 3d  t->a[e].zName)>=
4df0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
4e00: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 20 0a 7d  }.  return 0; .}
4e10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
4e20: 20 62 69 74 20 76 65 63 74 6f 72 20 74 6f 20 69   bit vector to i
4e30: 6e 64 69 63 61 74 65 20 77 68 61 74 20 6b 69 6e  ndicate what kin
4e40: 64 20 6f 66 20 74 72 69 67 67 65 72 73 20 65 78  d of triggers ex
4e50: 69 73 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  ist for operatio
4e60: 6e 0a 2a 2a 20 22 6f 70 22 20 6f 6e 20 74 61 62  n.** "op" on tab
4e70: 6c 65 20 70 54 61 62 2e 20 20 49 66 20 70 43 68  le pTab.  If pCh
4e80: 61 6e 67 65 73 20 69 73 20 6e 6f 74 20 4e 55 4c  anges is not NUL
4e90: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 6c  L then it is a l
4ea0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  ist of columns.*
4eb0: 2a 20 74 68 61 74 20 61 72 65 20 62 65 69 6e 67  * that are being
4ec0: 20 75 70 64 61 74 65 64 2e 20 20 54 72 69 67 67   updated.  Trigg
4ed0: 65 72 73 20 6f 6e 6c 79 20 6d 61 74 63 68 20 69  ers only match i
4ee0: 66 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  f the ON clause 
4ef0: 6f 66 20 74 68 65 0a 2a 2a 20 74 72 69 67 67 65  of the.** trigge
4f00: 72 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 76 65  r definition ove
4f10: 72 6c 61 70 73 20 74 68 65 20 73 65 74 20 6f 66  rlaps the set of
4f20: 20 63 6f 6c 75 6d 6e 73 20 62 65 69 6e 67 20 75   columns being u
4f30: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  pdated..**.** Th
4f40: 65 20 72 65 74 75 72 6e 65 64 20 62 69 74 20 76  e returned bit v
4f50: 65 63 74 6f 72 20 69 73 20 73 6f 6d 65 20 63 6f  ector is some co
4f60: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 52 49  mbination of TRI
4f70: 47 47 45 52 5f 42 45 46 4f 52 45 20 61 6e 64 0a  GGER_BEFORE and.
4f80: 2a 2a 20 54 52 49 47 47 45 52 5f 41 46 54 45 52  ** TRIGGER_AFTER
4f90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4fa0: 54 72 69 67 67 65 72 73 45 78 69 73 74 28 0a 20  TriggersExist(. 
4fb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
4fd0: 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 72 65   to check for re
4fe0: 63 75 72 73 69 76 65 20 74 72 69 67 67 65 72 73  cursive triggers
4ff0: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
5000: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
5010: 20 54 68 65 20 74 61 62 6c 65 20 74 68 65 20 63   The table the c
5020: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 72 69 67  ontains the trig
5030: 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  gers */.  int op
5040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5050: 20 20 2f 2a 20 6f 6e 65 20 6f 66 20 54 4b 5f 44    /* one of TK_D
5060: 45 4c 45 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54  ELETE, TK_INSERT
5070: 2c 20 54 4b 5f 55 50 44 41 54 45 20 2a 2f 0a 20  , TK_UPDATE */. 
5080: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
5090: 67 65 73 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ges      /* Colu
50a0: 6d 6e 73 20 74 68 61 74 20 63 68 61 6e 67 65 20  mns that change 
50b0: 69 6e 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  in an UPDATE sta
50c0: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  tement */.){.  T
50d0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
50e0: 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30  ;.  int mask = 0
50f0: 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  ;..  pTrigger = 
5100: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
5110: 3f 20 30 20 3a 20 70 54 61 62 2d 3e 70 54 72 69  ? 0 : pTab->pTri
5120: 67 67 65 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  gger;.  while( p
5130: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 69  Trigger ){.    i
5140: 66 28 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 3d  f( pTrigger->op=
5150: 3d 6f 70 20 26 26 20 63 68 65 63 6b 43 6f 6c 75  =op && checkColu
5160: 6d 6e 4f 76 65 72 4c 61 70 28 70 54 72 69 67 67  mnOverLap(pTrigg
5170: 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70 43  er->pColumns, pC
5180: 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20 20 20  hanges) ){.     
5190: 20 6d 61 73 6b 20 7c 3d 20 70 54 72 69 67 67 65   mask |= pTrigge
51a0: 72 2d 3e 74 72 5f 74 6d 3b 0a 20 20 20 20 7d 0a  r->tr_tm;.    }.
51b0: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
51c0: 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
51d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
51e0: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  k;.}../*.** Conv
51f0: 65 72 74 20 74 68 65 20 70 53 74 65 70 2d 3e 74  ert the pStep->t
5200: 61 72 67 65 74 20 74 6f 6b 65 6e 20 69 6e 74 6f  arget token into
5210: 20 61 20 53 72 63 4c 69 73 74 20 61 6e 64 20 72   a SrcList and r
5220: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
5230: 2a 2a 20 74 6f 20 74 68 61 74 20 53 72 63 4c 69  ** to that SrcLi
5240: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  st..**.** This r
5250: 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 73 70  outine adds a sp
5260: 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20  ecific database 
5270: 6e 61 6d 65 2c 20 69 66 20 6e 65 65 64 65 64 2c  name, if needed,
5280: 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 77   to the target w
5290: 68 65 6e 0a 2a 2a 20 66 6f 72 6d 69 6e 67 20 74  hen.** forming t
52a0: 68 65 20 53 72 63 4c 69 73 74 2e 20 20 54 68 69  he SrcList.  Thi
52b0: 73 20 70 72 65 76 65 6e 74 73 20 61 20 74 72 69  s prevents a tri
52c0: 67 67 65 72 20 69 6e 20 6f 6e 65 20 64 61 74 61  gger in one data
52d0: 62 61 73 65 20 66 72 6f 6d 0a 2a 2a 20 72 65 66  base from.** ref
52e0: 65 72 72 69 6e 67 20 74 6f 20 61 20 74 61 72 67  erring to a targ
52f0: 65 74 20 69 6e 20 61 6e 6f 74 68 65 72 20 64 61  et in another da
5300: 74 61 62 61 73 65 2e 20 20 41 6e 20 65 78 63 65  tabase.  An exce
5310: 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 74 68  ption is when th
5320: 65 0a 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20  e.** trigger is 
5330: 69 6e 20 54 45 4d 50 20 69 6e 20 77 68 69 63 68  in TEMP in which
5340: 20 63 61 73 65 20 69 74 20 63 61 6e 20 72 65 66   case it can ref
5350: 65 72 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  er to any other 
5360: 64 61 74 61 62 61 73 65 20 69 74 0a 2a 2a 20 77  database it.** w
5370: 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ants..*/.static 
5380: 53 72 63 4c 69 73 74 20 2a 74 61 72 67 65 74 53  SrcList *targetS
5390: 72 63 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  rcList(.  Parse 
53a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
53b0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
53c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67  ntext */.  Trigg
53d0: 65 72 53 74 65 70 20 2a 70 53 74 65 70 20 20 20  erStep *pStep   
53e0: 2f 2a 20 54 68 65 20 74 72 69 67 67 65 72 20 63  /* The trigger c
53f0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
5400: 72 67 65 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  rget token */.){
5410: 0a 20 20 54 6f 6b 65 6e 20 73 44 62 3b 20 20 20  .  Token sDb;   
5420: 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79          /* Dummy
5430: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 74   database name t
5440: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  oken */.  int iD
5450: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
5460: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
5470: 61 74 61 62 61 73 65 20 74 6f 20 75 73 65 20 2a  atabase to use *
5480: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
5490: 63 3b 20 20 20 20 20 20 20 2f 2a 20 53 72 63 4c  c;       /* SrcL
54a0: 69 73 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  ist to be return
54b0: 65 64 20 2a 2f 0a 0a 20 20 69 44 62 20 3d 20 73  ed */..  iDb = s
54c0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
54d0: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
54e0: 70 53 74 65 70 2d 3e 70 54 72 69 67 2d 3e 70 53  pStep->pTrig->pS
54f0: 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 69 44  chema);.  if( iD
5500: 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 3d 32 20 29  b==0 || iDb>=2 )
5510: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  {.    assert( iD
5520: 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44  b<pParse->db->nD
5530: 62 20 29 3b 0a 20 20 20 20 73 44 62 2e 7a 20 3d  b );.    sDb.z =
5540: 20 28 75 38 2a 29 70 50 61 72 73 65 2d 3e 64 62   (u8*)pParse->db
5550: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
5560: 3b 0a 20 20 20 20 73 44 62 2e 6e 20 3d 20 73 74  ;.    sDb.n = st
5570: 72 6c 65 6e 28 28 63 68 61 72 2a 29 73 44 62 2e  rlen((char*)sDb.
5580: 7a 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 73  z);.    pSrc = s
5590: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
55a0: 65 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  end(pParse->db, 
55b0: 30 2c 20 26 73 44 62 2c 20 26 70 53 74 65 70 2d  0, &sDb, &pStep-
55c0: 3e 74 61 72 67 65 74 29 3b 0a 20 20 7d 20 65 6c  >target);.  } el
55d0: 73 65 20 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  se {.    pSrc = 
55e0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
55f0: 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  pend(pParse->db,
5600: 20 30 2c 20 26 70 53 74 65 70 2d 3e 74 61 72 67   0, &pStep->targ
5610: 65 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  et, 0);.  }.  re
5620: 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 2f 2a  turn pSrc;.}../*
5630: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
5640: 45 20 63 6f 64 65 20 66 6f 72 20 7a 65 72 6f 20  E code for zero 
5650: 6f 72 20 6d 6f 72 65 20 73 74 61 74 65 6d 65 6e  or more statemen
5660: 74 73 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f  ts inside the bo
5670: 64 79 20 6f 66 20 61 0a 2a 2a 20 74 72 69 67 67  dy of a.** trigg
5680: 65 72 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  er.  .*/.static 
5690: 69 6e 74 20 63 6f 64 65 54 72 69 67 67 65 72 50  int codeTriggerP
56a0: 72 6f 67 72 61 6d 28 0a 20 20 50 61 72 73 65 20  rogram(.  Parse 
56b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
56c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
56d0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
56e0: 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65  riggerStep *pSte
56f0: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74  pList,   /* List
5700: 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69   of statements i
5710: 6e 73 69 64 65 20 74 68 65 20 74 72 69 67 67 65  nside the trigge
5720: 72 20 62 6f 64 79 20 2a 2f 0a 20 20 69 6e 74 20  r body */.  int 
5730: 6f 72 63 6f 6e 66 69 6e 20 20 20 20 20 20 20 20  orconfin        
5740: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
5750: 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45  t algorithm. (OE
5760: 5f 41 62 6f 72 74 2c 20 65 74 63 29 20 2a 2f 20  _Abort, etc) */ 
5770: 20 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74   .){.  TriggerSt
5780: 65 70 20 2a 20 70 54 72 69 67 67 65 72 53 74 65  ep * pTriggerSte
5790: 70 20 3d 20 70 53 74 65 70 4c 69 73 74 3b 0a 20  p = pStepList;. 
57a0: 20 69 6e 74 20 6f 72 63 6f 6e 66 3b 0a 20 20 56   int orconf;.  V
57b0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
57c0: 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65  >pVdbe;.  sqlite
57d0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
57e0: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  db;..  assert( p
57f0: 54 72 69 67 67 65 72 53 74 65 70 21 3d 30 20 29  TriggerStep!=0 )
5800: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
5810: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
5820: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
5830: 74 65 78 74 50 75 73 68 2c 20 30 2c 20 30 29 3b  textPush, 0, 0);
5840: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
5850: 76 2c 20 22 23 20 62 65 67 69 6e 20 74 72 69 67  v, "# begin trig
5860: 67 65 72 20 25 73 22 2c 20 70 53 74 65 70 4c 69  ger %s", pStepLi
5870: 73 74 2d 3e 70 54 72 69 67 2d 3e 6e 61 6d 65 29  st->pTrig->name)
5880: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69  );.  while( pTri
5890: 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20 20 20  ggerStep ){.    
58a0: 6f 72 63 6f 6e 66 20 3d 20 28 6f 72 63 6f 6e 66  orconf = (orconf
58b0: 69 6e 20 3d 3d 20 4f 45 5f 44 65 66 61 75 6c 74  in == OE_Default
58c0: 29 3f 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  )?pTriggerStep->
58d0: 6f 72 63 6f 6e 66 3a 6f 72 63 6f 6e 66 69 6e 3b  orconf:orconfin;
58e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72 69  .    pParse->tri
58f0: 67 53 74 61 63 6b 2d 3e 6f 72 63 6f 6e 66 20 3d  gStack->orconf =
5900: 20 6f 72 63 6f 6e 66 3b 0a 20 20 20 20 73 77 69   orconf;.    swi
5910: 74 63 68 28 20 70 54 72 69 67 67 65 72 53 74 65  tch( pTriggerSte
5920: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63  p->op ){.      c
5930: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
5940: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
5950: 2a 73 73 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  *ss = sqlite3Sel
5960: 65 63 74 44 75 70 28 64 62 2c 20 70 54 72 69 67  ectDup(db, pTrig
5970: 67 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74  gerStep->pSelect
5980: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
5990: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  s ){.          s
59a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
59b0: 6c 76 65 28 70 50 61 72 73 65 2c 20 73 73 2c 20  lve(pParse, ss, 
59c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
59d0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
59e0: 73 65 2c 20 73 73 2c 20 53 52 54 5f 44 69 73 63  se, ss, SRT_Disc
59f0: 61 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ard, 0, 0, 0, 0,
5a00: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
5a10: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
5a20: 74 65 28 73 73 29 3b 0a 20 20 20 20 20 20 20 20  te(ss);.        
5a30: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
5a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
5a50: 61 73 65 20 54 4b 5f 55 50 44 41 54 45 3a 20 7b  ase TK_UPDATE: {
5a60: 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74  .        SrcList
5a70: 20 2a 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20   *pSrc;.        
5a80: 70 53 72 63 20 3d 20 74 61 72 67 65 74 53 72 63  pSrc = targetSrc
5a90: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 72  List(pParse, pTr
5aa0: 69 67 67 65 72 53 74 65 70 29 3b 0a 20 20 20 20  iggerStep);.    
5ab0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5ac0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 73 65 74  ddOp(v, OP_Reset
5ad0: 43 6f 75 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  Count, 0, 0);.  
5ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 70 64        sqlite3Upd
5af0: 61 74 65 28 70 50 61 72 73 65 2c 20 70 53 72 63  ate(pParse, pSrc
5b00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
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 20 20  ), .            
5b50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5b60: 75 70 28 64 62 2c 20 70 54 72 69 67 67 65 72 53  up(db, pTriggerS
5b70: 74 65 70 2d 3e 70 57 68 65 72 65 29 2c 20 6f 72  tep->pWhere), or
5b80: 63 6f 6e 66 29 3b 0a 20 20 20 20 20 20 20 20 73  conf);.        s
5b90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5ba0: 76 2c 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74  v, OP_ResetCount
5bb0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
5bc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5bd0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e        case TK_IN
5be0: 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  SERT: {.        
5bf0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
5c00: 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 74 61         pSrc = ta
5c10: 72 67 65 74 53 72 63 4c 69 73 74 28 70 50 61 72  rgetSrcList(pPar
5c20: 73 65 2c 20 70 54 72 69 67 67 65 72 53 74 65 70  se, pTriggerStep
5c30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5c40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5c50: 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20 30 2c  P_ResetCount, 0,
5c60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
5c70: 69 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73  ite3Insert(pPars
5c80: 65 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  e, pSrc,.       
5c90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
5ca0: 73 74 44 75 70 28 64 62 2c 20 70 54 72 69 67 67  stDup(db, pTrigg
5cb0: 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73  erStep->pExprLis
5cc0: 74 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  t), .          s
5cd0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
5ce0: 64 62 2c 20 70 54 72 69 67 67 65 72 53 74 65 70  db, pTriggerStep
5cf0: 2d 3e 70 53 65 6c 65 63 74 29 2c 20 0a 20 20 20  ->pSelect), .   
5d00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64         sqlite3Id
5d10: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 54 72 69  ListDup(db, pTri
5d20: 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c 69 73  ggerStep->pIdLis
5d30: 74 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 20  t), orconf);.   
5d40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5d50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 73 65  AddOp(v, OP_Rese
5d60: 74 43 6f 75 6e 74 2c 20 31 2c 20 30 29 3b 0a 20  tCount, 1, 0);. 
5d70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5d90: 20 54 4b 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20   TK_DELETE: {.  
5da0: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
5db0: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Src;.        sql
5dc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5dd0: 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20   OP_ResetCount, 
5de0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  0, 0);.        p
5df0: 53 72 63 20 3d 20 74 61 72 67 65 74 53 72 63 4c  Src = targetSrcL
5e00: 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 72 69  ist(pParse, pTri
5e10: 67 67 65 72 53 74 65 70 29 3b 0a 20 20 20 20 20  ggerStep);.     
5e20: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
5e30: 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 70 53 72  From(pParse, pSr
5e40: 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  c, .            
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
5e60: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
5e70: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
5e80: 57 68 65 72 65 29 29 3b 0a 20 20 20 20 20 20 20  Where));.       
5e90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5ea0: 70 28 76 2c 20 4f 50 5f 52 65 73 65 74 43 6f 75  p(v, OP_ResetCou
5eb0: 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  nt, 1, 0);.     
5ec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5ed0: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
5ee0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5ef0: 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 70  0);.    } .    p
5f00: 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 70 54  TriggerStep = pT
5f10: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 4e 65 78  riggerStep->pNex
5f20: 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
5f30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5f40: 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30  ContextPop, 0, 0
5f50: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
5f60: 28 28 76 2c 20 22 23 20 65 6e 64 20 74 72 69 67  ((v, "# end trig
5f70: 67 65 72 20 25 73 22 2c 20 70 53 74 65 70 4c 69  ger %s", pStepLi
5f80: 73 74 2d 3e 70 54 72 69 67 2d 3e 6e 61 6d 65 29  st->pTrig->name)
5f90: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  );..  return 0;.
5fa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
5fb0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 64 65 20   called to code 
5fc0: 46 4f 52 20 45 41 43 48 20 52 4f 57 20 74 72 69  FOR EACH ROW tri
5fd0: 67 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ggers..**.** Whe
5fe0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
5ff0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65  this function ge
6000: 6e 65 72 61 74 65 73 20 69 73 20 65 78 65 63 75  nerates is execu
6010: 74 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ted, the followi
6020: 6e 67 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 74  ng .** must be t
6030: 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 31 2e 20 4e 6f  rue:.**.** 1. No
6040: 20 63 75 72 73 6f 72 73 20 6d 61 79 20 62 65 20   cursors may be 
6050: 6f 70 65 6e 20 69 6e 20 74 68 65 20 6d 61 69 6e  open in the main
6060: 20 64 61 74 61 62 61 73 65 2e 20 20 28 42 75 74   database.  (But
6070: 20 6e 65 77 49 64 78 20 61 6e 64 20 6f 6c 64 49   newIdx and oldI
6080: 64 78 0a 2a 2a 20 20 20 20 63 61 6e 20 62 65 20  dx.**    can be 
6090: 69 6e 64 69 63 65 73 20 6f 66 20 63 75 72 73 6f  indices of curso
60a0: 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  rs in temporary 
60b0: 74 61 62 6c 65 73 2e 20 20 53 65 65 20 62 65 6c  tables.  See bel
60c0: 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 32 2e 20 49 66  ow.).**.** 2. If
60d0: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 62 65   the triggers be
60e0: 69 6e 67 20 63 6f 64 65 64 20 61 72 65 20 4f 4e  ing coded are ON
60f0: 20 49 4e 53 45 52 54 20 6f 72 20 4f 4e 20 55 50   INSERT or ON UP
6100: 44 41 54 45 20 74 72 69 67 67 65 72 73 2c 20 74  DATE triggers, t
6110: 68 65 6e 0a 2a 2a 20 20 20 20 61 20 74 65 6d 70  hen.**    a temp
6120: 6f 72 61 72 79 20 76 64 62 65 20 63 75 72 73 6f  orary vdbe curso
6130: 72 20 28 69 6e 64 65 78 20 6e 65 77 49 64 78 29  r (index newIdx)
6140: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61 6e   must be open an
6150: 64 20 70 6f 69 6e 74 69 6e 67 20 61 74 0a 2a 2a  d pointing at.**
6160: 20 20 20 20 61 20 72 6f 77 20 63 6f 6e 74 61 69      a row contai
6170: 6e 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 62  ning values to b
6180: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 66 6f  e substituted fo
6190: 72 20 6e 65 77 2e 2a 20 65 78 70 72 65 73 73 69  r new.* expressi
61a0: 6f 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ons in the.**   
61b0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
61c0: 28 73 29 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 49 66  (s)..**.** 3. If
61d0: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 62 65   the triggers be
61e0: 69 6e 67 20 63 6f 64 65 64 20 61 72 65 20 4f 4e  ing coded are ON
61f0: 20 44 45 4c 45 54 45 20 6f 72 20 4f 4e 20 55 50   DELETE or ON UP
6200: 44 41 54 45 20 74 72 69 67 67 65 72 73 2c 20 74  DATE triggers, t
6210: 68 65 6e 0a 2a 2a 20 20 20 20 61 20 74 65 6d 70  hen.**    a temp
6220: 6f 72 61 72 79 20 76 64 62 65 20 63 75 72 73 6f  orary vdbe curso
6230: 72 20 28 69 6e 64 65 78 20 6f 6c 64 49 64 78 29  r (index oldIdx)
6240: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61 6e   must be open an
6250: 64 20 70 6f 69 6e 74 69 6e 67 20 61 74 0a 2a 2a  d pointing at.**
6260: 20 20 20 20 61 20 72 6f 77 20 63 6f 6e 74 61 69      a row contai
6270: 6e 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 62  ning values to b
6280: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 66 6f  e substituted fo
6290: 72 20 6f 6c 64 2e 2a 20 65 78 70 72 65 73 73 69  r old.* expressi
62a0: 6f 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ons in the.**   
62b0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
62c0: 28 73 29 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  (s)..**.*/.int s
62d0: 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69  qlite3CodeRowTri
62e0: 67 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  gger(.  Parse *p
62f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
6300: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
6310: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
6320: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
6330: 66 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f  f TK_UPDATE, TK_
6340: 49 4e 53 45 52 54 2c 20 54 4b 5f 44 45 4c 45 54  INSERT, TK_DELET
6350: 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  E */.  ExprList 
6360: 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f 2a 20 43  *pChanges,  /* C
6370: 68 61 6e 67 65 73 20 6c 69 73 74 20 66 6f 72 20  hanges list for 
6380: 61 6e 79 20 55 50 44 41 54 45 20 4f 46 20 74 72  any UPDATE OF tr
6390: 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  iggers */.  int 
63a0: 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20 20 20  tr_tm,          
63b0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 52 49 47 47   /* One of TRIGG
63c0: 45 52 5f 42 45 46 4f 52 45 2c 20 54 52 49 47 47  ER_BEFORE, TRIGG
63d0: 45 52 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54 61  ER_AFTER */.  Ta
63e0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
63f0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
6400: 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 73  to code triggers
6410: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
6420: 65 77 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  ewIdx,          
6430: 2f 2a 20 54 68 65 20 69 6e 64 69 63 65 20 6f 66  /* The indice of
6440: 20 74 68 65 20 22 6e 65 77 22 20 72 6f 77 20 74   the "new" row t
6450: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e  o access */.  in
6460: 74 20 6f 6c 64 49 64 78 2c 20 20 20 20 20 20 20  t oldIdx,       
6470: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 69 63 65     /* The indice
6480: 20 6f 66 20 74 68 65 20 22 6f 6c 64 22 20 72 6f   of the "old" ro
6490: 77 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20  w to access */. 
64a0: 20 69 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20 20   int orconf,    
64b0: 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46        /* ON CONF
64c0: 4c 49 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 20  LICT policy */. 
64d0: 20 69 6e 74 20 69 67 6e 6f 72 65 4a 75 6d 70 20   int ignoreJump 
64e0: 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
64f0: 74 69 6f 6e 20 74 6f 20 6a 75 6d 70 20 74 6f 20  tion to jump to 
6500: 66 6f 72 20 52 41 49 53 45 28 49 47 4e 4f 52 45  for RAISE(IGNORE
6510: 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65  ) */.){.  Trigge
6520: 72 20 2a 70 3b 0a 20 20 54 72 69 67 67 65 72 53  r *p;.  TriggerS
6530: 74 61 63 6b 20 74 72 69 67 53 74 61 63 6b 45 6e  tack trigStackEn
6540: 74 72 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 6f  try;..  assert(o
6550: 70 20 3d 3d 20 54 4b 5f 55 50 44 41 54 45 20 7c  p == TK_UPDATE |
6560: 7c 20 6f 70 20 3d 3d 20 54 4b 5f 49 4e 53 45 52  | op == TK_INSER
6570: 54 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 44 45  T || op == TK_DE
6580: 4c 45 54 45 29 3b 0a 20 20 61 73 73 65 72 74 28  LETE);.  assert(
6590: 74 72 5f 74 6d 20 3d 3d 20 54 52 49 47 47 45 52  tr_tm == TRIGGER
65a0: 5f 42 45 46 4f 52 45 20 7c 7c 20 74 72 5f 74 6d  _BEFORE || tr_tm
65b0: 20 3d 3d 20 54 52 49 47 47 45 52 5f 41 46 54 45   == TRIGGER_AFTE
65c0: 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 6e  R );..  assert(n
65d0: 65 77 49 64 78 20 21 3d 20 2d 31 20 7c 7c 20 6f  ewIdx != -1 || o
65e0: 6c 64 49 64 78 20 21 3d 20 2d 31 29 3b 0a 0a 20  ldIdx != -1);.. 
65f0: 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 54 72   for(p=pTab->pTr
6600: 69 67 67 65 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  igger; p; p=p->p
6610: 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 66  Next){.    int f
6620: 69 72 65 5f 74 68 69 73 20 3d 20 30 3b 0a 20 20  ire_this = 0;.  
6630: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6640: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 20  pParse->db;..   
6650: 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68   /* Determine wh
6660: 65 74 68 65 72 20 77 65 20 73 68 6f 75 6c 64 20  ether we should 
6670: 63 6f 64 65 20 74 68 69 73 20 74 72 69 67 67 65  code this trigge
6680: 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 0a 20 20  r */.    if( .  
6690: 20 20 20 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26      p->op==op &&
66a0: 20 0a 20 20 20 20 20 20 70 2d 3e 74 72 5f 74 6d   .      p->tr_tm
66b0: 3d 3d 74 72 5f 74 6d 20 26 26 20 0a 20 20 20 20  ==tr_tm && .    
66c0: 20 20 28 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 70    (p->pSchema==p
66d0: 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 7c 7c 20  ->pTabSchema || 
66e0: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  p->pSchema==db->
66f0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 20  aDb[1].pSchema) 
6700: 26 26 0a 20 20 20 20 20 20 28 6f 70 21 3d 54 4b  &&.      (op!=TK
6710: 5f 55 50 44 41 54 45 7c 7c 21 70 2d 3e 70 43 6f  _UPDATE||!p->pCo
6720: 6c 75 6d 6e 73 7c 7c 63 68 65 63 6b 43 6f 6c 75  lumns||checkColu
6730: 6d 6e 4f 76 65 72 4c 61 70 28 70 2d 3e 70 43 6f  mnOverLap(p->pCo
6740: 6c 75 6d 6e 73 2c 70 43 68 61 6e 67 65 73 29 29  lumns,pChanges))
6750: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 54 72  .    ){.      Tr
6760: 69 67 67 65 72 53 74 61 63 6b 20 2a 70 53 3b 20  iggerStack *pS; 
6770: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6780: 74 6f 20 74 72 69 67 67 65 72 2d 73 74 61 63 6b  to trigger-stack
6790: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 20 20   entry */.      
67a0: 66 6f 72 28 70 53 3d 70 50 61 72 73 65 2d 3e 74  for(pS=pParse->t
67b0: 72 69 67 53 74 61 63 6b 3b 20 70 53 20 26 26 20  rigStack; pS && 
67c0: 70 21 3d 70 53 2d 3e 70 54 72 69 67 67 65 72 3b  p!=pS->pTrigger;
67d0: 20 70 53 3d 70 53 2d 3e 70 4e 65 78 74 29 7b 7d   pS=pS->pNext){}
67e0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 53 20 29  .      if( !pS )
67f0: 7b 0a 20 20 20 20 20 20 20 20 66 69 72 65 5f 74  {.        fire_t
6800: 68 69 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  his = 1;.      }
6810: 0a 23 69 66 20 30 20 20 20 20 2f 2a 20 47 69 76  .#if 0    /* Giv
6820: 65 20 6e 6f 20 77 61 72 6e 69 6e 67 20 66 6f 72  e no warning for
6830: 20 72 65 63 75 72 73 69 76 65 20 74 72 69 67 67   recursive trigg
6840: 65 72 73 2e 20 20 4a 75 73 74 20 64 6f 20 6e 6f  ers.  Just do no
6850: 74 20 64 6f 20 74 68 65 6d 20 2a 2f 0a 20 20 20  t do them */.   
6860: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20     else{.       
6870: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6880: 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72 73  (pParse, "recurs
6890: 69 76 65 20 74 72 69 67 67 65 72 73 20 6e 6f 74  ive triggers not
68a0: 20 73 75 70 70 6f 72 74 65 64 20 28 25 73 29 22   supported (%s)"
68b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  ,.            p-
68c0: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
68d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
68e0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ROR;.      }.#en
68f0: 64 69 66 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  dif.    }. .    
6900: 69 66 28 20 66 69 72 65 5f 74 68 69 73 20 29 7b  if( fire_this ){
6910: 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 54 72  .      int endTr
6920: 69 67 67 65 72 3b 0a 20 20 20 20 20 20 45 78 70  igger;.      Exp
6930: 72 20 2a 20 77 68 65 6e 45 78 70 72 3b 0a 20 20  r * whenExpr;.  
6940: 20 20 20 20 41 75 74 68 43 6f 6e 74 65 78 74 20      AuthContext 
6950: 73 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  sContext;.      
6960: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
6970: 0a 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ..      memset(&
6980: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
6990: 4e 43 29 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  NC));.      sNC.
69a0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
69b0: 0a 0a 20 20 20 20 20 20 2f 2a 20 50 75 73 68 20  ..      /* Push 
69c0: 61 6e 20 65 6e 74 72 79 20 6f 6e 20 74 6f 20 74  an entry on to t
69d0: 68 65 20 74 72 69 67 67 65 72 20 73 74 61 63 6b  he trigger stack
69e0: 20 2a 2f 0a 20 20 20 20 20 20 74 72 69 67 53 74   */.      trigSt
69f0: 61 63 6b 45 6e 74 72 79 2e 70 54 72 69 67 67 65  ackEntry.pTrigge
6a00: 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 74 72 69  r = p;.      tri
6a10: 67 53 74 61 63 6b 45 6e 74 72 79 2e 6e 65 77 49  gStackEntry.newI
6a20: 64 78 20 3d 20 6e 65 77 49 64 78 3b 0a 20 20 20  dx = newIdx;.   
6a30: 20 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72     trigStackEntr
6a40: 79 2e 6f 6c 64 49 64 78 20 3d 20 6f 6c 64 49 64  y.oldIdx = oldId
6a50: 78 3b 0a 20 20 20 20 20 20 74 72 69 67 53 74 61  x;.      trigSta
6a60: 63 6b 45 6e 74 72 79 2e 70 54 61 62 20 3d 20 70  ckEntry.pTab = p
6a70: 54 61 62 3b 0a 20 20 20 20 20 20 74 72 69 67 53  Tab;.      trigS
6a80: 74 61 63 6b 45 6e 74 72 79 2e 70 4e 65 78 74 20  tackEntry.pNext 
6a90: 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  = pParse->trigSt
6aa0: 61 63 6b 3b 0a 20 20 20 20 20 20 74 72 69 67 53  ack;.      trigS
6ab0: 74 61 63 6b 45 6e 74 72 79 2e 69 67 6e 6f 72 65  tackEntry.ignore
6ac0: 4a 75 6d 70 20 3d 20 69 67 6e 6f 72 65 4a 75 6d  Jump = ignoreJum
6ad0: 70 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  p;.      pParse-
6ae0: 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 26 74 72  >trigStack = &tr
6af0: 69 67 53 74 61 63 6b 45 6e 74 72 79 3b 0a 20 20  igStackEntry;.  
6b00: 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43      sqlite3AuthC
6b10: 6f 6e 74 65 78 74 50 75 73 68 28 70 50 61 72 73  ontextPush(pPars
6b20: 65 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70 2d  e, &sContext, p-
6b30: 3e 6e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 2f  >name);..      /
6b40: 2a 20 63 6f 64 65 20 74 68 65 20 57 48 45 4e 20  * code the WHEN 
6b50: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
6b60: 65 6e 64 54 72 69 67 67 65 72 20 3d 20 73 71 6c  endTrigger = sql
6b70: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6b80: 6c 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 29  l(pParse->pVdbe)
6b90: 3b 0a 20 20 20 20 20 20 77 68 65 6e 45 78 70 72  ;.      whenExpr
6ba0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
6bb0: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 6e 29 3b  p(db, p->pWhen);
6bc0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
6bd0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
6be0: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
6bf0: 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 77 68 65  eNames(&sNC, whe
6c00: 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
6c10: 20 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74    pParse->trigSt
6c20: 61 63 6b 20 3d 20 74 72 69 67 53 74 61 63 6b 45  ack = trigStackE
6c30: 6e 74 72 79 2e 70 4e 65 78 74 3b 0a 20 20 20 20  ntry.pNext;.    
6c40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6c50: 65 6c 65 74 65 28 77 68 65 6e 45 78 70 72 29 3b  elete(whenExpr);
6c60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6c70: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
6c80: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
6c90: 6c 73 65 28 70 50 61 72 73 65 2c 20 77 68 65 6e  lse(pParse, when
6ca0: 45 78 70 72 2c 20 65 6e 64 54 72 69 67 67 65 72  Expr, endTrigger
6cb0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
6cc0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 77 68  te3ExprDelete(wh
6cd0: 65 6e 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20  enExpr);..      
6ce0: 63 6f 64 65 54 72 69 67 67 65 72 50 72 6f 67 72  codeTriggerProgr
6cf0: 61 6d 28 70 50 61 72 73 65 2c 20 70 2d 3e 73 74  am(pParse, p->st
6d00: 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e 66 29  ep_list, orconf)
6d10: 3b 20 0a 0a 20 20 20 20 20 20 2f 2a 20 50 6f 70  ; ..      /* Pop
6d20: 20 74 68 65 20 65 6e 74 72 79 20 6f 66 66 20 74   the entry off t
6d30: 68 65 20 74 72 69 67 67 65 72 20 73 74 61 63 6b  he trigger stack
6d40: 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73 65   */.      pParse
6d50: 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 74 72  ->trigStack = tr
6d60: 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 70 4e 65  igStackEntry.pNe
6d70: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
6d80: 33 41 75 74 68 43 6f 6e 74 65 78 74 50 6f 70 28  3AuthContextPop(
6d90: 26 73 43 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 20  &sContext);..   
6da0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
6db0: 73 6f 6c 76 65 4c 61 62 65 6c 28 70 50 61 72 73  solveLabel(pPars
6dc0: 65 2d 3e 70 56 64 62 65 2c 20 65 6e 64 54 72 69  e->pVdbe, endTri
6dd0: 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  gger);.    }.  }
6de0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
6df0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
6e00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
6e10: 49 47 47 45 52 29 20 2a 2f 0a                    IGGER) */.