/ Hex Artifact Content
Login

Artifact fbe9b54f60b3d163eff7f4c4958c03069686ed04dc2994c286b216176a965bb6:


0000: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  /*.**.** The aut
0010: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0020: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0030: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0040: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0050: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0060: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0070: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0080: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0090: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00a0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00b0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00c0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00d0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00e0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
00f0: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0100: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0110: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0170: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
0180: 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 54  ementation for T
0190: 52 49 47 47 45 52 73 0a 2a 2f 0a 23 69 6e 63 6c  RIGGERs.*/.#incl
01a0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
01b0: 22 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  "..#ifndef SQLIT
01c0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f  E_OMIT_TRIGGER./
01d0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 6c 69  *.** Delete a li
01e0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 54 72 69  nked list of Tri
01f0: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
0200: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0210: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
0220: 72 53 74 65 70 28 73 71 6c 69 74 65 33 20 2a 64  rStep(sqlite3 *d
0230: 62 2c 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  b, TriggerStep *
0240: 70 54 72 69 67 67 65 72 53 74 65 70 29 7b 0a 20  pTriggerStep){. 
0250: 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
0260: 53 74 65 70 20 29 7b 0a 20 20 20 20 54 72 69 67  Step ){.    Trig
0270: 67 65 72 53 74 65 70 20 2a 20 70 54 6d 70 20 3d  gerStep * pTmp =
0280: 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 20   pTriggerStep;. 
0290: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 20     pTriggerStep 
02a0: 3d 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  = pTriggerStep->
02b0: 70 4e 65 78 74 3b 0a 0a 20 20 20 20 73 71 6c 69  pNext;..    sqli
02c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
02d0: 2c 20 70 54 6d 70 2d 3e 70 57 68 65 72 65 29 3b  , pTmp->pWhere);
02e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
02f0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0300: 54 6d 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b  Tmp->pExprList);
0310: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
0320: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6d  ctDelete(db, pTm
0330: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  p->pSelect);.   
0340: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
0350: 6c 65 74 65 28 64 62 2c 20 70 54 6d 70 2d 3e 70  lete(db, pTmp->p
0360: 49 64 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  IdList);.    sql
0370: 69 74 65 33 55 70 73 65 72 74 44 65 6c 65 74 65  ite3UpsertDelete
0380: 28 64 62 2c 20 70 54 6d 70 2d 3e 70 55 70 73 65  (db, pTmp->pUpse
0390: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
03a0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 2d  DbFree(db, pTmp-
03b0: 3e 7a 53 70 61 6e 29 3b 0a 0a 20 20 20 20 73 71  >zSpan);..    sq
03c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
03d0: 70 54 6d 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pTmp);.  }.}../*
03e0: 0a 2a 2a 20 47 69 76 65 6e 20 74 61 62 6c 65 20  .** Given table 
03f0: 70 54 61 62 2c 20 72 65 74 75 72 6e 20 61 20 6c  pTab, return a l
0400: 69 73 74 20 6f 66 20 61 6c 6c 20 74 68 65 20 74  ist of all the t
0410: 72 69 67 67 65 72 73 20 61 74 74 61 63 68 65 64  riggers attached
0420: 20 74 6f 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   to .** the tabl
0430: 65 2e 20 54 68 65 20 6c 69 73 74 20 69 73 20 63  e. The list is c
0440: 6f 6e 6e 65 63 74 65 64 20 62 79 20 54 72 69 67  onnected by Trig
0450: 67 65 72 2e 70 4e 65 78 74 20 70 6f 69 6e 74 65  ger.pNext pointe
0460: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  rs..**.** All of
0470: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 6f 6e   the triggers on
0480: 20 70 54 61 62 20 74 68 61 74 20 61 72 65 20 69   pTab that are i
0490: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
04a0: 61 73 65 20 61 73 20 70 54 61 62 0a 2a 2a 20 61  ase as pTab.** a
04b0: 72 65 20 61 6c 72 65 61 64 79 20 61 74 74 61 63  re already attac
04c0: 68 65 64 20 74 6f 20 70 54 61 62 2d 3e 70 54 72  hed to pTab->pTr
04d0: 69 67 67 65 72 2e 20 20 42 75 74 20 74 68 65 72  igger.  But ther
04e0: 65 20 6d 69 67 68 74 20 62 65 20 61 64 64 69 74  e might be addit
04f0: 69 6f 6e 61 6c 0a 2a 2a 20 74 72 69 67 67 65 72  ional.** trigger
0500: 73 20 6f 6e 20 70 54 61 62 20 69 6e 20 74 68 65  s on pTab in the
0510: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20 54   TEMP schema.  T
0520: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 65 70  his routine prep
0530: 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 54 45 4d 50  ends all.** TEMP
0540: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 70 54 61   triggers on pTa
0550: 62 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  b to the beginni
0560: 6e 67 20 6f 66 20 74 68 65 20 70 54 61 62 2d 3e  ng of the pTab->
0570: 70 54 72 69 67 67 65 72 20 6c 69 73 74 0a 2a 2a  pTrigger list.**
0580: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
0590: 20 63 6f 6d 62 69 6e 65 64 20 6c 69 73 74 2e 0a   combined list..
05a0: 2a 2a 0a 2a 2a 20 54 6f 20 73 74 61 74 65 20 69  **.** To state i
05b0: 74 20 61 6e 6f 74 68 65 72 20 77 61 79 3a 20 20  t another way:  
05c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
05d0: 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 61  urns a list of a
05e0: 6c 6c 20 74 72 69 67 67 65 72 73 0a 2a 2a 20 74  ll triggers.** t
05f0: 68 61 74 20 66 69 72 65 20 6f 66 66 20 6f 66 20  hat fire off of 
0600: 70 54 61 62 2e 20 20 54 68 65 20 6c 69 73 74 20  pTab.  The list 
0610: 77 69 6c 6c 20 69 6e 63 6c 75 64 65 20 61 6e 79  will include any
0620: 20 54 45 4d 50 20 74 72 69 67 67 65 72 73 20 6f   TEMP triggers o
0630: 6e 0a 2a 2a 20 70 54 61 62 20 61 73 20 77 65 6c  n.** pTab as wel
0640: 6c 20 61 73 20 74 68 65 20 74 72 69 67 67 65 72  l as the trigger
0650: 73 20 6c 69 73 65 64 20 69 6e 20 70 54 61 62 2d  s lised in pTab-
0660: 3e 70 54 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72  >pTrigger..*/.Tr
0670: 69 67 67 65 72 20 2a 73 71 6c 69 74 65 33 54 72  igger *sqlite3Tr
0680: 69 67 67 65 72 4c 69 73 74 28 50 61 72 73 65 20  iggerList(Parse 
0690: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
06a0: 70 54 61 62 29 7b 0a 20 20 53 63 68 65 6d 61 20  pTab){.  Schema 
06b0: 2a 20 63 6f 6e 73 74 20 70 54 6d 70 53 63 68 65  * const pTmpSche
06c0: 6d 61 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ma = pParse->db-
06d0: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[1].pSchema;
06e0: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 73  .  Trigger *pLis
06f0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
0700: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
0710: 6f 66 20 74 72 69 67 67 65 72 73 20 74 6f 20 72  of triggers to r
0720: 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  eturn */..  if( 
0730: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 54  pParse->disableT
0740: 72 69 67 67 65 72 73 20 29 7b 0a 20 20 20 20 72  riggers ){.    r
0750: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
0760: 69 66 28 20 70 54 6d 70 53 63 68 65 6d 61 21 3d  if( pTmpSchema!=
0770: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
0780: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
0790: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
07a0: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
07b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
07c0: 41 42 4c 45 5f 53 48 41 52 45 44 5f 53 43 48 45  ABLE_SHARED_SCHE
07d0: 4d 41 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63  MA.    char *zSc
07e0: 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 69 66  hema = 0;.    if
07f0: 28 20 49 73 53 68 61 72 65 64 53 63 68 65 6d 61  ( IsSharedSchema
0800: 28 64 62 29 20 29 7b 0a 20 20 20 20 20 20 7a 53  (db) ){.      zS
0810: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
0820: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
0830: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
0840: 53 63 68 65 6d 61 29 5d 2e 7a 44 62 53 4e 61 6d  Schema)].zDbSNam
0850: 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  e;.    }.#endif.
0860: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
0870: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
0880: 6c 64 28 64 62 2c 20 30 2c 20 70 54 6d 70 53 63  ld(db, 0, pTmpSc
0890: 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 66 6f 72  hema) );.    for
08a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
08b0: 73 74 28 26 70 54 6d 70 53 63 68 65 6d 61 2d 3e  st(&pTmpSchema->
08c0: 74 72 69 67 48 61 73 68 29 3b 20 70 3b 20 70 3d  trigHash); p; p=
08d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
08e0: 29 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65  )){.      Trigge
08f0: 72 20 2a 70 54 72 69 67 20 3d 20 28 54 72 69 67  r *pTrig = (Trig
0900: 67 65 72 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ger *)sqliteHash
0910: 44 61 74 61 28 70 29 3b 0a 0a 23 69 66 64 65 66  Data(p);..#ifdef
0920: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
0930: 48 41 52 45 44 5f 53 43 48 45 4d 41 0a 20 20 20  HARED_SCHEMA.   
0940: 20 20 20 69 66 28 20 28 7a 53 63 68 65 6d 61 3d     if( (zSchema=
0950: 3d 30 20 26 26 20 70 54 72 69 67 2d 3e 70 54 61  =0 && pTrig->pTa
0960: 62 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  bSchema==pTab->p
0970: 53 63 68 65 6d 61 29 0a 20 20 20 20 20 20 20 7c  Schema).       |
0980: 7c 20 28 7a 53 63 68 65 6d 61 21 3d 30 20 26 26  | (zSchema!=0 &&
0990: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
09a0: 6d 70 28 70 54 72 69 67 2d 3e 7a 54 61 62 53 63  mp(pTrig->zTabSc
09b0: 68 65 6d 61 2c 20 7a 53 63 68 65 6d 61 29 29 20  hema, zSchema)) 
09c0: 29 0a 23 65 6c 73 65 20 0a 20 20 20 20 20 20 69  ).#else .      i
09d0: 66 28 20 70 54 72 69 67 2d 3e 70 54 61 62 53 63  f( pTrig->pTabSc
09e0: 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
09f0: 65 6d 61 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  ema ).#endif.   
0a00: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28     {.        if(
0a10: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
0a20: 6d 70 28 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c  mp(pTrig->table,
0a30: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b   pTab->zName) ){
0a40: 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67  .          pTrig
0a50: 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 3d 20 70  ->pTabSchema = p
0a60: 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  Tab->pSchema;.  
0a70: 20 20 20 20 20 20 20 20 70 54 72 69 67 2d 3e 70          pTrig->p
0a80: 4e 65 78 74 20 3d 20 28 70 4c 69 73 74 20 3f 20  Next = (pList ? 
0a90: 70 4c 69 73 74 20 3a 20 70 54 61 62 2d 3e 70 54  pList : pTab->pT
0aa0: 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 20  rigger);.       
0ab0: 20 20 20 70 4c 69 73 74 20 3d 20 70 54 72 69 67     pList = pTrig
0ac0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0ad0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
0ae0: 20 72 65 74 75 72 6e 20 28 70 4c 69 73 74 20 3f   return (pList ?
0af0: 20 70 4c 69 73 74 20 3a 20 70 54 61 62 2d 3e 70   pList : pTab->p
0b00: 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Trigger);.}../*.
0b10: 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
0b20: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
0b30: 77 68 65 6e 20 69 74 20 73 65 65 73 20 61 20 43  when it sees a C
0b40: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 73 74  REATE TRIGGER st
0b50: 61 74 65 6d 65 6e 74 0a 2a 2a 20 75 70 20 74 6f  atement.** up to
0b60: 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 74 68   the point of th
0b70: 65 20 42 45 47 49 4e 20 62 65 66 6f 72 65 20 74  e BEGIN before t
0b80: 68 65 20 74 72 69 67 67 65 72 20 61 63 74 69 6f  he trigger actio
0b90: 6e 73 2e 20 20 41 20 54 72 69 67 67 65 72 0a 2a  ns.  A Trigger.*
0ba0: 2a 20 73 74 72 75 63 74 75 72 65 20 69 73 20 67  * structure is g
0bb0: 65 6e 65 72 61 74 65 64 20 62 61 73 65 64 20 6f  enerated based o
0bc0: 6e 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  n the informatio
0bd0: 6e 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 64 20  n available and 
0be0: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 50 61  stored.** in pPa
0bf0: 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72  rse->pNewTrigger
0c00: 2e 20 20 41 66 74 65 72 20 74 68 65 20 74 72 69  .  After the tri
0c10: 67 67 65 72 20 61 63 74 69 6f 6e 73 20 68 61 76  gger actions hav
0c20: 65 20 62 65 65 6e 20 70 61 72 73 65 64 2c 20 74  e been parsed, t
0c30: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  he.** sqlite3Fin
0c40: 69 73 68 54 72 69 67 67 65 72 28 29 20 66 75 6e  ishTrigger() fun
0c50: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
0c60: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
0c70: 74 72 69 67 67 65 72 0a 2a 2a 20 63 6f 6e 73 74  trigger.** const
0c80: 72 75 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e  ruction process.
0c90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0ca0: 42 65 67 69 6e 54 72 69 67 67 65 72 28 0a 20 20  BeginTrigger(.  
0cb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0cc0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
0cd0: 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20   context of the 
0ce0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 73  CREATE TRIGGER s
0cf0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
0d00: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
0d10: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66    /* The name of
0d20: 20 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a   the trigger */.
0d30: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
0d40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d        /* The nam
0d50: 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72  e of the trigger
0d60: 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c   */.  int tr_tm,
0d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
0d80: 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54   of TK_BEFORE, T
0d90: 4b 5f 41 46 54 45 52 2c 20 54 4b 5f 49 4e 53 54  K_AFTER, TK_INST
0da0: 45 41 44 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  EAD */.  int op,
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0dc0: 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e 53 45 52 54  One of TK_INSERT
0dd0: 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f  , TK_UPDATE, TK_
0de0: 44 45 4c 45 54 45 20 2a 2f 0a 20 20 49 64 4c 69  DELETE */.  IdLi
0df0: 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20  st *pColumns,   
0e00: 2f 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 69  /* column list i
0e10: 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44  f this is an UPD
0e20: 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 20 2a  ATE OF trigger *
0e30: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
0e40: 62 6c 65 4e 61 6d 65 2c 2f 2a 20 54 68 65 20 6e  bleName,/* The n
0e50: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
0e60: 2f 76 69 65 77 20 74 68 65 20 74 72 69 67 67 65  /view the trigge
0e70: 72 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  r applies to */.
0e80: 20 20 45 78 70 72 20 2a 70 57 68 65 6e 2c 20 20    Expr *pWhen,  
0e90: 20 20 20 20 20 20 2f 2a 20 57 48 45 4e 20 63 6c        /* WHEN cl
0ea0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ause */.  int is
0eb0: 54 65 6d 70 2c 20 20 20 20 20 20 20 20 20 2f 2a  Temp,         /*
0ec0: 20 54 72 75 65 20 69 66 20 74 68 65 20 54 45 4d   True if the TEM
0ed0: 50 4f 52 41 52 59 20 6b 65 79 77 6f 72 64 20 69  PORARY keyword i
0ee0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
0ef0: 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
0f00: 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65     /* Suppress e
0f10: 72 72 6f 72 73 20 69 66 20 74 68 65 20 74 72 69  rrors if the tri
0f20: 67 67 65 72 20 61 6c 72 65 61 64 79 20 65 78 69  gger already exi
0f30: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  sts */.){.  Trig
0f40: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
0f50: 30 3b 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74  0;  /* The new t
0f60: 72 69 67 67 65 72 20 2a 2f 0a 20 20 54 61 62 6c  rigger */.  Tabl
0f70: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
0f80: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 61      /* Table tha
0f90: 74 20 74 68 65 20 74 72 69 67 67 65 72 20 66 69  t the trigger fi
0fa0: 72 65 73 20 6f 66 66 20 6f 66 20 2a 2f 0a 20 20  res off of */.  
0fb0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
0fc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
0fd0: 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20 2a  of the trigger *
0fe0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
0ff0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
1000: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1010: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
1020: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
1030: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1040: 74 61 62 61 73 65 20 74 6f 20 73 74 6f 72 65 20  tabase to store 
1050: 74 68 65 20 74 72 69 67 67 65 72 20 69 6e 20 2a  the trigger in *
1060: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
1070: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1080: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 64  he unqualified d
1090: 62 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 46 69  b name */.  DbFi
10a0: 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20  xer sFix;       
10b0: 20 20 20 20 2f 2a 20 53 74 61 74 65 20 76 65 63      /* State vec
10c0: 74 6f 72 20 66 6f 72 20 74 68 65 20 44 42 20 66  tor for the DB f
10d0: 69 78 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ixer */..  asser
10e0: 74 28 20 70 4e 61 6d 65 31 21 3d 30 20 29 3b 20  t( pName1!=0 ); 
10f0: 20 20 2f 2a 20 70 4e 61 6d 65 31 2d 3e 7a 20 6d    /* pName1->z m
1100: 69 67 68 74 20 62 65 20 4e 55 4c 4c 2c 20 62 75  ight be NULL, bu
1110: 74 20 6e 6f 74 20 70 4e 61 6d 65 31 20 69 74 73  t not pName1 its
1120: 65 6c 66 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  elf */.  assert(
1130: 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20   pName2!=0 );.  
1140: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 49  assert( op==TK_I
1150: 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  NSERT || op==TK_
1160: 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b  UPDATE || op==TK
1170: 5f 44 45 4c 45 54 45 20 29 3b 0a 20 20 61 73 73  _DELETE );.  ass
1180: 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c  ert( op>0 && op<
1190: 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 69 73  0xff );.  if( is
11a0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Temp ){.    /* I
11b0: 66 20 54 45 4d 50 20 77 61 73 20 73 70 65 63 69  f TEMP was speci
11c0: 66 69 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74  fied, then the t
11d0: 72 69 67 67 65 72 20 6e 61 6d 65 20 6d 61 79 20  rigger name may 
11e0: 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64  not be qualified
11f0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 61  . */.    if( pNa
1200: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
1210: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1220: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
1230: 72 61 72 79 20 74 72 69 67 67 65 72 20 6d 61 79  rary trigger may
1240: 20 6e 6f 74 20 68 61 76 65 20 71 75 61 6c 69 66   not have qualif
1250: 69 65 64 20 6e 61 6d 65 22 29 3b 0a 20 20 20 20  ied name");.    
1260: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
1270: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
1280: 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 70    iDb = 1;.    p
1290: 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  Name = pName1;. 
12a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
12b0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 64 62  igure out the db
12c0: 20 74 68 61 74 20 74 68 65 20 74 72 69 67 67 65   that the trigge
12d0: 72 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  r will be create
12e0: 64 20 69 6e 20 2a 2f 0a 20 20 20 20 69 44 62 20  d in */.    iDb 
12f0: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
1300: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
1310: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
1320: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
1330: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  b<0 ){.      got
1340: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1350: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  p;.    }.  }.  i
1360: 66 28 20 21 70 54 61 62 6c 65 4e 61 6d 65 20 7c  f( !pTableName |
1370: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1380: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  ed ){.    goto t
1390: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
13a0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 20 6c 6f 6e 67    }..  /* A long
13b0: 2d 73 74 61 6e 64 69 6e 67 20 70 61 72 73 65 72  -standing parser
13c0: 20 62 75 67 20 69 73 20 74 68 61 74 20 74 68 69   bug is that thi
13d0: 73 20 73 79 6e 74 61 78 20 77 61 73 20 61 6c 6c  s syntax was all
13e0: 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
13f0: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
1400: 52 20 61 74 74 61 63 68 65 64 2e 64 65 6d 6f 20  R attached.demo 
1410: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
1420: 61 74 74 61 63 68 65 64 2e 74 61 62 20 2e 2e 2e  attached.tab ...
1430: 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  ..  **          
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 0a         ^^^^^^^^.
1470: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6d 61 69    **.  ** To mai
1480: 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
1490: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2c 20 69  compatibility, i
14a0: 67 6e 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  gnore the databa
14b0: 73 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 6f 6e 20  se.  ** name on 
14c0: 70 54 61 62 6c 65 4e 61 6d 65 20 69 66 20 77 65  pTableName if we
14d0: 20 61 72 65 20 72 65 70 61 72 73 69 6e 67 20 6f   are reparsing o
14e0: 75 74 20 6f 66 20 53 51 4c 49 54 45 5f 4d 41 53  ut of SQLITE_MAS
14f0: 54 45 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  TER..  */.  if( 
1500: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
1510: 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 73   iDb!=1 ){.    s
1520: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1530: 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61 5b 30   pTableName->a[0
1540: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1550: 20 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61 5b    pTableName->a[
1560: 30 5d 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  0].zDatabase = 0
1570: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1580: 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20  he trigger name 
1590: 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
15a0: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69   and the table i
15b0: 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 0a  s a temp table,.
15c0: 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 69 44    ** then set iD
15d0: 62 20 74 6f 20 31 20 74 6f 20 63 72 65 61 74 65  b to 1 to create
15e0: 20 74 68 65 20 74 72 69 67 67 65 72 20 69 6e 20   the trigger in 
15f0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
1600: 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20 49 66 20  tabase..  ** If 
1610: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
1620: 6f 6b 75 70 28 29 20 72 65 74 75 72 6e 73 20 30  okup() returns 0
1630: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
1640: 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 0a   table does not.
1650: 20 20 2a 2a 20 65 78 69 73 74 2c 20 74 68 65 20    ** exist, the 
1660: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
1670: 62 79 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c  by the block bel
1680: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 20  ow..  */.  pTab 
1690: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
16a0: 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
16b0: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66  TableName);.  if
16c0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
16d0: 3d 30 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d  =0 && pName2->n=
16e0: 3d 30 20 26 26 20 70 54 61 62 0a 20 20 20 20 20  =0 && pTab.     
16f0: 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68     && pTab->pSch
1700: 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
1710: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69  pSchema ){.    i
1720: 44 62 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  Db = 1;.  }..  /
1730: 2a 20 45 6e 73 75 72 65 20 74 68 65 20 74 61 62  * Ensure the tab
1740: 6c 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20  le name matches 
1750: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 61 6e  database name an
1760: 64 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  d that the table
1770: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28   exists */.  if(
1780: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1790: 64 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72  d ) goto trigger
17a0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 61 73 73 65  _cleanup;.  asse
17b0: 72 74 28 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e  rt( pTableName->
17c0: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 73 71 6c  nSrc==1 );.  sql
17d0: 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
17e0: 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
17f0: 22 74 72 69 67 67 65 72 22 2c 20 70 4e 61 6d 65  "trigger", pName
1800: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1810: 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
1820: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 20 29 7b  , pTableName) ){
1830: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
1840: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  r_cleanup;.  }. 
1850: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
1860: 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
1870: 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  rse, pTableName)
1880: 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 29 7b  ;.  if( !pTab ){
1890: 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  .    /* The tabl
18a0: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
18b0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d  . */.    if( db-
18c0: 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 7b 0a  >init.iDb==1 ){.
18d0: 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
18e0: 23 33 38 31 30 2e 0a 20 20 20 20 20 20 2a 2a 20  #3810..      ** 
18f0: 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65 6e 65 76  Normally, whenev
1900: 65 72 20 61 20 74 61 62 6c 65 20 69 73 20 64 72  er a table is dr
1910: 6f 70 70 65 64 2c 20 61 6c 6c 20 61 73 73 6f 63  opped, all assoc
1920: 69 61 74 65 64 20 74 72 69 67 67 65 72 73 20 61  iated triggers a
1930: 72 65 0a 20 20 20 20 20 20 2a 2a 20 64 72 6f 70  re.      ** drop
1940: 70 65 64 20 74 6f 6f 2e 20 20 42 75 74 20 69 66  ped too.  But if
1950: 20 61 20 54 45 4d 50 20 74 72 69 67 67 65 72 20   a TEMP trigger 
1960: 69 73 20 63 72 65 61 74 65 64 20 6f 6e 20 61 20  is created on a 
1970: 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 0a 20  non-TEMP table. 
1980: 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20       ** and the 
1990: 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64  table is dropped
19a0: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
19b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
19c0: 69 6f 6e 2c 20 74 68 65 0a 20 20 20 20 20 20 2a  ion, the.      *
19d0: 2a 20 74 72 69 67 67 65 72 20 69 73 20 6e 6f 74  * trigger is not
19e0: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 65 20   visible to the 
19f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1a00: 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 74 68  ion that does th
1a10: 65 0a 20 20 20 20 20 20 2a 2a 20 64 72 6f 70 20  e.      ** drop 
1a20: 73 6f 20 74 68 65 20 74 72 69 67 67 65 72 20 63  so the trigger c
1a30: 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
1a40: 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20  .  This results 
1a50: 69 6e 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 22  in an.      ** "
1a60: 6f 72 70 68 61 6e 65 64 20 74 72 69 67 67 65 72  orphaned trigger
1a70: 22 20 2d 20 61 20 74 72 69 67 67 65 72 20 77 68  " - a trigger wh
1a80: 6f 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 74  ose associated t
1a90: 61 62 6c 65 20 69 73 20 6d 69 73 73 69 6e 67 2e  able is missing.
1aa0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1ab0: 64 62 2d 3e 69 6e 69 74 2e 6f 72 70 68 61 6e 54  db->init.orphanT
1ac0: 72 69 67 67 65 72 20 3d 20 31 3b 0a 20 20 20 20  rigger = 1;.    
1ad0: 7d 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  }.    goto trigg
1ae0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
1af0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
1b00: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
1b10: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b20: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65  rse, "cannot cre
1b30: 61 74 65 20 74 72 69 67 67 65 72 73 20 6f 6e 20  ate triggers on 
1b40: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 22 29  virtual tables")
1b50: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  ;.    goto trigg
1b60: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
1b70: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1b80: 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d   the trigger nam
1b90: 65 20 69 73 20 6e 6f 74 20 72 65 73 65 72 76 65  e is not reserve
1ba0: 64 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 74 72  d and that no tr
1bb0: 69 67 67 65 72 20 6f 66 20 74 68 65 0a 20 20 2a  igger of the.  *
1bc0: 2a 20 73 70 65 63 69 66 69 65 64 20 6e 61 6d 65  * specified name
1bd0: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 7a 4e 61   exists */.  zNa
1be0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1bf0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
1c00: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
1c10: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  e==0 ){.    asse
1c20: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1c30: 69 6c 65 64 20 29 3b 0a 20 20 20 20 67 6f 74 6f  iled );.    goto
1c40: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1c50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1c60: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
1c70: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
1c80: 2c 20 22 74 72 69 67 67 65 72 22 2c 20 70 54 61  , "trigger", pTa
1c90: 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  b->zName) ){.   
1ca0: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
1cb0: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73  eanup;.  }.  ass
1cc0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
1cd0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1ce0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  iDb, 0) );.  if(
1cf0: 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45   !IN_RENAME_OBJE
1d00: 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  CT ){.    if( sq
1d10: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 28  lite3HashFind(&(
1d20: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
1d30: 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 29 2c  hema->trigHash),
1d40: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
1d50: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
1d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1d70: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
1d80: 72 69 67 67 65 72 20 25 54 20 61 6c 72 65 61 64  rigger %T alread
1d90: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
1da0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1db0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1dc0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
1dd0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1de0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1df0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
1e00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1e10: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
1e20: 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  up;.    }.  }.. 
1e30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 63 72 65 61 74   /* Do not creat
1e40: 65 20 61 20 74 72 69 67 67 65 72 20 6f 6e 20 61  e a trigger on a
1e50: 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20 2a 2f   system table */
1e60: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
1e70: 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
1e80: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
1e90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
1ea0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1eb0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61  se, "cannot crea
1ec0: 74 65 20 74 72 69 67 67 65 72 20 6f 6e 20 73 79  te trigger on sy
1ed0: 73 74 65 6d 20 74 61 62 6c 65 22 29 3b 0a 20 20  stem table");.  
1ee0: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
1ef0: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  leanup;.  }..  /
1f00: 2a 20 49 4e 53 54 45 41 44 20 6f 66 20 74 72 69  * INSTEAD of tri
1f10: 67 67 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 66  ggers are only f
1f20: 6f 72 20 76 69 65 77 73 20 61 6e 64 20 76 69 65  or views and vie
1f30: 77 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  ws only support 
1f40: 49 4e 53 54 45 41 44 0a 20 20 2a 2a 20 6f 66 20  INSTEAD.  ** of 
1f50: 74 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f 0a 20  triggers..  */. 
1f60: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
1f70: 63 74 20 26 26 20 74 72 5f 74 6d 21 3d 54 4b 5f  ct && tr_tm!=TK_
1f80: 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73  INSTEAD ){.    s
1f90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1fa0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
1fb0: 72 65 61 74 65 20 25 73 20 74 72 69 67 67 65 72  reate %s trigger
1fc0: 20 6f 6e 20 76 69 65 77 3a 20 25 53 22 2c 20 0a   on view: %S", .
1fd0: 20 20 20 20 20 20 20 20 28 74 72 5f 74 6d 20 3d          (tr_tm =
1fe0: 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f 22 42 45  = TK_BEFORE)?"BE
1ff0: 46 4f 52 45 22 3a 22 41 46 54 45 52 22 2c 20 70  FORE":"AFTER", p
2000: 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a 20  TableName, 0);. 
2010: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
2020: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69  cleanup;.  }.  i
2030: 66 28 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63  f( !pTab->pSelec
2040: 74 20 26 26 20 74 72 5f 74 6d 3d 3d 54 4b 5f 49  t && tr_tm==TK_I
2050: 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73 71  NSTEAD ){.    sq
2060: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2070: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72  arse, "cannot cr
2080: 65 61 74 65 20 49 4e 53 54 45 41 44 20 4f 46 22  eate INSTEAD OF"
2090: 0a 20 20 20 20 20 20 20 20 22 20 74 72 69 67 67  .        " trigg
20a0: 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20 25 53 22  er on table: %S"
20b0: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29  , pTableName, 0)
20c0: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  ;.    goto trigg
20d0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
20e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20f0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
2100: 4f 4e 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  ON.  if( !IN_REN
2110: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
2120: 20 20 69 6e 74 20 69 54 61 62 44 62 20 3d 20 73    int iTabDb = s
2130: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
2140: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
2150: 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 6e 74 20  chema);.    int 
2160: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
2170: 45 41 54 45 5f 54 52 49 47 47 45 52 3b 0a 20 20  EATE_TRIGGER;.  
2180: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2190: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 54 61 62  b = db->aDb[iTab
21a0: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
21b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
21c0: 62 54 72 69 67 20 3d 20 69 73 54 65 6d 70 20 3f  bTrig = isTemp ?
21d0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53   db->aDb[1].zDbS
21e0: 4e 61 6d 65 20 3a 20 7a 44 62 3b 0a 20 20 20 20  Name : zDb;.    
21f0: 69 66 28 20 69 54 61 62 44 62 3d 3d 31 20 7c 7c  if( iTabDb==1 ||
2200: 20 69 73 54 65 6d 70 20 29 20 63 6f 64 65 20 3d   isTemp ) code =
2210: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
2220: 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20  EMP_TRIGGER;.   
2230: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
2240: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
2250: 64 65 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  de, zName, pTab-
2260: 3e 7a 4e 61 6d 65 2c 20 7a 44 62 54 72 69 67 29  >zName, zDbTrig)
2270: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74   ){.      goto t
2280: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
2290: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
22a0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
22b0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
22c0: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
22d0: 4c 45 28 69 54 61 62 44 62 29 2c 30 2c 7a 44 62  LE(iTabDb),0,zDb
22e0: 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74  )){.      goto t
22f0: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
2300: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2310: 0a 0a 20 20 2f 2a 20 49 4e 53 54 45 41 44 20 4f  ..  /* INSTEAD O
2320: 46 20 74 72 69 67 67 65 72 73 20 63 61 6e 20 6f  F triggers can o
2330: 6e 6c 79 20 61 70 70 65 61 72 20 6f 6e 20 76 69  nly appear on vi
2340: 65 77 73 20 61 6e 64 20 42 45 46 4f 52 45 20 74  ews and BEFORE t
2350: 72 69 67 67 65 72 73 0a 20 20 2a 2a 20 63 61 6e  riggers.  ** can
2360: 6e 6f 74 20 61 70 70 65 61 72 20 6f 6e 20 76 69  not appear on vi
2370: 65 77 73 2e 20 20 53 6f 20 77 65 20 6d 69 67 68  ews.  So we migh
2380: 74 20 61 73 20 77 65 6c 6c 20 74 72 61 6e 73 6c  t as well transl
2390: 61 74 65 20 65 76 65 72 79 0a 20 20 2a 2a 20 49  ate every.  ** I
23a0: 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65  NSTEAD OF trigge
23b0: 72 20 69 6e 74 6f 20 61 20 42 45 46 4f 52 45 20  r into a BEFORE 
23c0: 74 72 69 67 67 65 72 2e 20 20 49 74 20 73 69 6d  trigger.  It sim
23d0: 70 6c 69 66 69 65 73 20 63 6f 64 65 0a 20 20 2a  plifies code.  *
23e0: 2a 20 65 6c 73 65 77 68 65 72 65 2e 0a 20 20 2a  * elsewhere..  *
23f0: 2f 0a 20 20 69 66 20 28 74 72 5f 74 6d 20 3d 3d  /.  if (tr_tm ==
2400: 20 54 4b 5f 49 4e 53 54 45 41 44 29 7b 0a 20 20   TK_INSTEAD){.  
2410: 20 20 74 72 5f 74 6d 20 3d 20 54 4b 5f 42 45 46    tr_tm = TK_BEF
2420: 4f 52 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  ORE;.  }..  /* B
2430: 75 69 6c 64 20 74 68 65 20 54 72 69 67 67 65 72  uild the Trigger
2440: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 54 72   object */.  pTr
2450: 69 67 67 65 72 20 3d 20 28 54 72 69 67 67 65 72  igger = (Trigger
2460: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
2470: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
2480: 28 54 72 69 67 67 65 72 29 29 3b 0a 20 20 69 66  (Trigger));.  if
2490: 28 20 70 54 72 69 67 67 65 72 3d 3d 30 20 29 20  ( pTrigger==0 ) 
24a0: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
24b0: 61 6e 75 70 3b 0a 20 20 70 54 72 69 67 67 65 72  anup;.  pTrigger
24c0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
24d0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  .  zName = 0;.  
24e0: 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 20  pTrigger->table 
24f0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2500: 70 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65  p(db, pTableName
2510: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 23  ->a[0].zName);.#
2520: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2530: 42 4c 45 5f 53 48 41 52 45 44 5f 53 43 48 45 4d  BLE_SHARED_SCHEM
2540: 41 0a 20 20 69 66 28 20 49 73 53 68 61 72 65 64  A.  if( IsShared
2550: 53 63 68 65 6d 61 28 64 62 29 20 26 26 20 69 44  Schema(db) && iD
2560: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 69 6e 74 20  b==1 ){.    int 
2570: 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33  iTabDb = sqlite3
2580: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
2590: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
25a0: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e  ;.    pTrigger->
25b0: 7a 54 61 62 53 63 68 65 6d 61 20 3d 20 73 71 6c  zTabSchema = sql
25c0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
25d0: 20 64 62 2d 3e 61 44 62 5b 69 54 61 62 44 62 5d   db->aDb[iTabDb]
25e0: 2e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20 7d 0a  .zDbSName);.  }.
25f0: 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
2600: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 48  SQLITE_ENABLE_SH
2610: 41 52 45 44 5f 53 43 48 45 4d 41 20 2a 2f 0a 20  ARED_SCHEMA */. 
2620: 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
2630: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
2640: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 72  ].pSchema;.  pTr
2650: 69 67 67 65 72 2d 3e 70 54 61 62 53 63 68 65 6d  igger->pTabSchem
2660: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
2670: 61 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 6f  a;.  pTrigger->o
2680: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 54  p = (u8)op;.  pT
2690: 72 69 67 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 20  rigger->tr_tm = 
26a0: 74 72 5f 74 6d 3d 3d 54 4b 5f 42 45 46 4f 52 45  tr_tm==TK_BEFORE
26b0: 20 3f 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52   ? TRIGGER_BEFOR
26c0: 45 20 3a 20 54 52 49 47 47 45 52 5f 41 46 54 45  E : TRIGGER_AFTE
26d0: 52 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  R;.  if( IN_RENA
26e0: 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
26f0: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
2700: 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c  kenRemap(pParse,
2710: 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65   pTrigger->table
2720: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61 5b  , pTableName->a[
2730: 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  0].zName);.    p
2740: 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 20 3d  Trigger->pWhen =
2750: 20 70 57 68 65 6e 3b 0a 20 20 20 20 70 57 68 65   pWhen;.    pWhe
2760: 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 0;.  }else{.
2770: 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 57      pTrigger->pW
2780: 68 65 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  hen = sqlite3Exp
2790: 72 44 75 70 28 64 62 2c 20 70 57 68 65 6e 2c 20  rDup(db, pWhen, 
27a0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
27b0: 0a 20 20 7d 0a 20 20 70 54 72 69 67 67 65 72 2d  .  }.  pTrigger-
27c0: 3e 70 43 6f 6c 75 6d 6e 73 20 3d 20 70 43 6f 6c  >pColumns = pCol
27d0: 75 6d 6e 73 3b 0a 20 20 70 43 6f 6c 75 6d 6e 73  umns;.  pColumns
27e0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
27f0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
2800: 67 65 72 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72  ger==0 );.  pPar
2810: 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20  se->pNewTrigger 
2820: 3d 20 70 54 72 69 67 67 65 72 3b 0a 0a 74 72 69  = pTrigger;..tri
2830: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  gger_cleanup:.  
2840: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2850: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
2860: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
2870: 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  (db, pTableName)
2880: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
2890: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  tDelete(db, pCol
28a0: 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  umns);.  sqlite3
28b0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
28c0: 57 68 65 6e 29 3b 0a 20 20 69 66 28 20 21 70 50  When);.  if( !pP
28d0: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
28e0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
28f0: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62  DeleteTrigger(db
2900: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d  , pTrigger);.  }
2910: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2920: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72  ( pParse->pNewTr
2930: 69 67 67 65 72 3d 3d 70 54 72 69 67 67 65 72 20  igger==pTrigger 
2940: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2950: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2960: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c  called after all
2970: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
2980: 61 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  actions have bee
2990: 6e 20 70 61 72 73 65 64 0a 2a 2a 20 69 6e 20 6f  n parsed.** in o
29a0: 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
29b0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
29c0: 62 75 69 6c 64 69 6e 67 20 74 68 65 20 74 72 69  building the tri
29d0: 67 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gger..*/.void sq
29e0: 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67  lite3FinishTrigg
29f0: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
2a00: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
2a10: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
2a20: 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  */.  TriggerStep
2a30: 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 2f 2a 20   *pStepList, /* 
2a40: 54 68 65 20 74 72 69 67 67 65 72 65 64 20 70 72  The triggered pr
2a50: 6f 67 72 61 6d 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ogram */.  Token
2a60: 20 2a 70 41 6c 6c 20 20 20 20 20 20 20 20 20 20   *pAll          
2a70: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74     /* Token that
2a80: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63   describes the c
2a90: 6f 6d 70 6c 65 74 65 20 43 52 45 41 54 45 20 54  omplete CREATE T
2aa0: 52 49 47 47 45 52 20 2a 2f 0a 29 7b 0a 20 20 54  RIGGER */.){.  T
2ab0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 20 3d 20  rigger *pTrig = 
2ac0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
2ad0: 67 65 72 3b 20 20 20 2f 2a 20 54 72 69 67 67 65  ger;   /* Trigge
2ae0: 72 20 62 65 69 6e 67 20 66 69 6e 69 73 68 65 64  r being finished
2af0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
2b00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b20: 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72   Name of trigger
2b30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2b40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b60: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
2b70: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2ba0: 78 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  xer object */.  
2bb0: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2be0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2bf0: 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20  he trigger */.  
2c00: 54 6f 6b 65 6e 20 6e 61 6d 65 54 6f 6b 65 6e 3b  Token nameToken;
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 69 67 67          /* Trigg
2c30: 65 72 20 6e 61 6d 65 20 66 6f 72 20 65 72 72 6f  er name for erro
2c40: 72 20 72 65 70 6f 72 74 69 6e 67 20 2a 2f 0a 0a  r reporting */..
2c50: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72    pParse->pNewTr
2c60: 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  igger = 0;.  if(
2c70: 20 4e 45 56 45 52 28 70 50 61 72 73 65 2d 3e 6e   NEVER(pParse->n
2c80: 45 72 72 29 20 7c 7c 20 21 70 54 72 69 67 20 29  Err) || !pTrig )
2c90: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e   goto triggerfin
2ca0: 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7a  ish_cleanup;.  z
2cb0: 4e 61 6d 65 20 3d 20 70 54 72 69 67 2d 3e 7a 4e  Name = pTrig->zN
2cc0: 61 6d 65 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  ame;.  iDb = sql
2cd0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
2ce0: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
2cf0: 72 69 67 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  rig->pSchema);. 
2d00: 20 70 54 72 69 67 2d 3e 73 74 65 70 5f 6c 69 73   pTrig->step_lis
2d10: 74 20 3d 20 70 53 74 65 70 4c 69 73 74 3b 0a 20  t = pStepList;. 
2d20: 20 77 68 69 6c 65 28 20 70 53 74 65 70 4c 69 73   while( pStepLis
2d30: 74 20 29 7b 0a 20 20 20 20 70 53 74 65 70 4c 69  t ){.    pStepLi
2d40: 73 74 2d 3e 70 54 72 69 67 20 3d 20 70 54 72 69  st->pTrig = pTri
2d50: 67 3b 0a 20 20 20 20 70 53 74 65 70 4c 69 73 74  g;.    pStepList
2d60: 20 3d 20 70 53 74 65 70 4c 69 73 74 2d 3e 70 4e   = pStepList->pN
2d70: 65 78 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ext;.  }.  sqlit
2d80: 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 6e 61 6d  e3TokenInit(&nam
2d90: 65 54 6f 6b 65 6e 2c 20 70 54 72 69 67 2d 3e 7a  eToken, pTrig->z
2da0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
2db0: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
2dc0: 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 72 69  Parse, iDb, "tri
2dd0: 67 67 65 72 22 2c 20 26 6e 61 6d 65 54 6f 6b 65  gger", &nameToke
2de0: 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  n);.  if( sqlite
2df0: 33 46 69 78 54 72 69 67 67 65 72 53 74 65 70 28  3FixTriggerStep(
2e00: 26 73 46 69 78 2c 20 70 54 72 69 67 2d 3e 73 74  &sFix, pTrig->st
2e10: 65 70 5f 6c 69 73 74 29 20 0a 20 20 20 7c 7c 20  ep_list) .   || 
2e20: 73 71 6c 69 74 65 33 46 69 78 45 78 70 72 28 26  sqlite3FixExpr(&
2e30: 73 46 69 78 2c 20 70 54 72 69 67 2d 3e 70 57 68  sFix, pTrig->pWh
2e40: 65 6e 29 20 0a 20 20 29 7b 0a 20 20 20 20 67 6f  en) .  ){.    go
2e50: 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69 73 68  to triggerfinish
2e60: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 23  _cleanup;.  }..#
2e70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e80: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
2e90: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
2ea0: 4a 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  JECT ){.    asse
2eb0: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
2ec0: 73 79 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  sy );.    pParse
2ed0: 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20 3d 20  ->pNewTrigger = 
2ee0: 70 54 72 69 67 3b 0a 20 20 20 20 70 54 72 69 67  pTrig;.    pTrig
2ef0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 0a 23 65   = 0;.  }else.#e
2f00: 6e 64 69 66 0a 0a 20 20 2f 2a 20 69 66 20 77 65  ndif..  /* if we
2f10: 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c   are not initial
2f20: 69 7a 69 6e 67 2c 0a 20 20 2a 2a 20 62 75 69 6c  izing,.  ** buil
2f30: 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  d the sqlite_mas
2f40: 74 65 72 20 65 6e 74 72 79 0a 20 20 2a 2f 0a 20  ter entry.  */. 
2f50: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
2f60: 75 73 79 20 29 7b 0a 20 20 20 20 56 64 62 65 20  usy ){.    Vdbe 
2f70: 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  *v;.    char *z;
2f80: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 6e  ..    /* Make an
2f90: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73 71   entry in the sq
2fa0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
2fb0: 65 20 2a 2f 0a 20 20 20 20 76 20 3d 20 73 71 6c  e */.    v = sql
2fc0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
2fd0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
2fe0: 30 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72  0 ) goto trigger
2ff0: 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a  finish_cleanup;.
3000: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
3010: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
3020: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
3030: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 44      z = sqlite3D
3040: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
3050: 61 72 2a 29 70 41 6c 6c 2d 3e 7a 2c 20 70 41 6c  ar*)pAll->z, pAl
3060: 6c 2d 3e 6e 29 3b 0a 20 20 20 20 74 65 73 74 63  l->n);.    testc
3070: 61 73 65 28 20 7a 3d 3d 30 20 29 3b 0a 20 20 20  ase( z==0 );.   
3080: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
3090: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
30a0: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
30b0: 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 74 72  %Q.%s VALUES('tr
30c0: 69 67 67 65 72 27 2c 25 51 2c 25 51 2c 30 2c 27  igger',%Q,%Q,0,'
30d0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 25  CREATE TRIGGER %
30e0: 71 27 29 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  q')",.       db-
30f0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
3100: 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
3110: 20 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 70   zName,.       p
3120: 54 72 69 67 2d 3e 74 61 62 6c 65 2c 20 7a 29 3b  Trig->table, z);
3130: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3140: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 73  ee(db, z);.    s
3150: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
3160: 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
3170: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3180: 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
3190: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 0a 20 20  (pParse, iDb,.  
31a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
31b0: 69 6e 74 66 28 64 62 2c 20 22 74 79 70 65 3d 27  intf(db, "type='
31c0: 74 72 69 67 67 65 72 27 20 41 4e 44 20 6e 61 6d  trigger' AND nam
31d0: 65 3d 27 25 71 27 22 2c 20 7a 4e 61 6d 65 29 29  e='%q'", zName))
31e0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d  ;.  }..  if( db-
31f0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
3200: 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 6e 6b    Trigger *pLink
3210: 20 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 48 61   = pTrig;.    Ha
3220: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d  sh *pHash = &db-
3230: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
3240: 61 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20  a->trigHash;.   
3250: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3260: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3270: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
3280: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6e 6b     assert( pLink
3290: 21 3d 30 20 29 3b 0a 20 20 20 20 70 54 72 69 67  !=0 );.    pTrig
32a0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
32b0: 73 65 72 74 28 70 48 61 73 68 2c 20 7a 4e 61 6d  sert(pHash, zNam
32c0: 65 2c 20 70 54 72 69 67 29 3b 0a 20 20 20 20 69  e, pTrig);.    i
32d0: 66 28 20 70 54 72 69 67 20 29 7b 0a 20 20 20 20  f( pTrig ){.    
32e0: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
32f0: 74 28 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t(db);.    }else
3300: 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 53 63 68   if( pLink->pSch
3310: 65 6d 61 3d 3d 70 4c 69 6e 6b 2d 3e 70 54 61 62  ema==pLink->pTab
3320: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
3330: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
3340: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
3350: 33 48 61 73 68 46 69 6e 64 28 26 70 4c 69 6e 6b  3HashFind(&pLink
3360: 2d 3e 70 54 61 62 53 63 68 65 6d 61 2d 3e 74 62  ->pTabSchema->tb
3370: 6c 48 61 73 68 2c 20 70 4c 69 6e 6b 2d 3e 74 61  lHash, pLink->ta
3380: 62 6c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ble);.      asse
3390: 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
33a0: 20 20 20 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78       pLink->pNex
33b0: 74 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67  t = pTab->pTrigg
33c0: 65 72 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  er;.      pTab->
33d0: 70 54 72 69 67 67 65 72 20 3d 20 70 4c 69 6e 6b  pTrigger = pLink
33e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 74 72 69  ;.    }.  }..tri
33f0: 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e  ggerfinish_clean
3400: 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  up:.  sqlite3Del
3410: 65 74 65 54 72 69 67 67 65 72 28 64 62 2c 20 70  eteTrigger(db, p
3420: 54 72 69 67 29 3b 0a 20 20 61 73 73 65 72 74 28  Trig);.  assert(
3430: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
3440: 54 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e 70 4e  T || !pParse->pN
3450: 65 77 54 72 69 67 67 65 72 20 29 3b 0a 20 20 73  ewTrigger );.  s
3460: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
3470: 67 65 72 53 74 65 70 28 64 62 2c 20 70 53 74 65  gerStep(db, pSte
3480: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
3490: 20 44 75 70 6c 69 63 61 74 65 20 61 20 72 61 6e   Duplicate a ran
34a0: 67 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20  ge of text from 
34b0: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
34c0: 2c 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 61  , then convert a
34d0: 6c 6c 0a 2a 2a 20 77 68 69 74 65 73 70 61 63 65  ll.** whitespace
34e0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f   characters into
34f0: 20 6f 72 64 69 6e 61 72 79 20 73 70 61 63 65 20   ordinary space 
3500: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
3510: 74 61 74 69 63 20 63 68 61 72 20 2a 74 72 69 67  tatic char *trig
3520: 67 65 72 53 70 61 6e 44 75 70 28 73 71 6c 69 74  gerSpanDup(sqlit
3530: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
3540: 61 72 20 2a 7a 53 74 61 72 74 2c 20 63 6f 6e 73  ar *zStart, cons
3550: 74 20 63 68 61 72 20 2a 7a 45 6e 64 29 7b 0a 20  t char *zEnd){. 
3560: 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
3570: 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20  e3DbSpanDup(db, 
3580: 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20  zStart, zEnd);. 
3590: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 20   int i;.  if( z 
35a0: 29 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b  ) for(i=0; z[i];
35b0: 20 69 2b 2b 29 20 69 66 28 20 73 71 6c 69 74 65   i++) if( sqlite
35c0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29  3Isspace(z[i]) )
35d0: 20 7a 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20 72   z[i] = ' ';.  r
35e0: 65 74 75 72 6e 20 7a 3b 0a 7d 20 20 20 20 0a 0a  eturn z;.}    ..
35f0: 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 53 45 4c  /*.** Turn a SEL
3600: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 28 74  ECT statement (t
3610: 68 61 74 20 74 68 65 20 70 53 65 6c 65 63 74 20  hat the pSelect 
3620: 70 61 72 61 6d 65 74 65 72 20 70 6f 69 6e 74 73  parameter points
3630: 20 74 6f 29 20 69 6e 74 6f 0a 2a 2a 20 61 20 74   to) into.** a t
3640: 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 52 65  rigger step.  Re
3650: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
3660: 6f 20 61 20 54 72 69 67 67 65 72 53 74 65 70 20  o a TriggerStep 
3670: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
3680: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
3690: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
36a0: 68 65 6e 20 69 74 20 66 69 6e 64 73 20 61 20 53  hen it finds a S
36b0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
36c0: 69 6e 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20  in.** body of a 
36d0: 54 52 49 47 47 45 52 2e 20 20 0a 2a 2f 0a 54 72  TRIGGER.  .*/.Tr
36e0: 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74  iggerStep *sqlit
36f0: 65 33 54 72 69 67 67 65 72 53 65 6c 65 63 74 53  e3TriggerSelectS
3700: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  tep(.  sqlite3 *
3710: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
3720: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
3730: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  onnection */.  S
3740: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
3750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
3760: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3770: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
3780: 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20  ar *zStart,     
3790: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
37a0: 53 51 4c 20 74 65 78 74 20 2a 2f 0a 20 20 63 6f  SQL text */.  co
37b0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20  nst char *zEnd  
37c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
37d0: 20 6f 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a   of SQL text */.
37e0: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
37f0: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 20 3d   *pTriggerStep =
3800: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3810: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
3820: 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a 20  TriggerStep));. 
3830: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65   if( pTriggerSte
3840: 70 3d 3d 30 20 29 20 7b 0a 20 20 20 20 73 71 6c  p==0 ) {.    sql
3850: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
3860: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
3870: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3880: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
3890: 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
38a0: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
38b0: 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65  >pSelect = pSele
38c0: 63 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  ct;.  pTriggerSt
38d0: 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f  ep->orconf = OE_
38e0: 44 65 66 61 75 6c 74 3b 0a 20 20 70 54 72 69 67  Default;.  pTrig
38f0: 67 65 72 53 74 65 70 2d 3e 7a 53 70 61 6e 20 3d  gerStep->zSpan =
3900: 20 74 72 69 67 67 65 72 53 70 61 6e 44 75 70 28   triggerSpanDup(
3910: 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64  db, zStart, zEnd
3920: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69  );.  return pTri
3930: 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a  ggerStep;.}../*.
3940: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
3950: 65 20 74 6f 20 68 6f 6c 64 20 61 20 6e 65 77 20  e to hold a new 
3960: 74 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 54  trigger step.  T
3970: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  he allocated spa
3980: 63 65 0a 2a 2a 20 68 6f 6c 64 73 20 62 6f 74 68  ce.** holds both
3990: 20 74 68 65 20 54 72 69 67 67 65 72 53 74 65 70   the TriggerStep
39a0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 65 20   object and the 
39b0: 54 72 69 67 67 65 72 53 74 65 70 2e 74 61 72 67  TriggerStep.targ
39c0: 65 74 2e 7a 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  et.z string..**.
39d0: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
39e0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
39f0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
3a00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3a10: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   is set..*/.stat
3a20: 69 63 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  ic TriggerStep *
3a30: 74 72 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63  triggerStepAlloc
3a40: 61 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ate(.  Parse *pP
3a50: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
3a60: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
3a70: 74 65 78 74 20 2a 2f 0a 20 20 75 38 20 6f 70 2c  text */.  u8 op,
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 20 20 2f 2a 20 54 72 69 67 67 65 72        /* Trigger
3aa0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 54 6f 6b   opcode */.  Tok
3ab0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
3ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3ad0: 74 61 72 67 65 74 20 6e 61 6d 65 20 2a 2f 0a 20  target name */. 
3ae0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
3af0: 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  art,         /* 
3b00: 53 74 61 72 74 20 6f 66 20 53 51 4c 20 74 65 78  Start of SQL tex
3b10: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
3b20: 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 20  r *zEnd         
3b30: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 53 51 4c     /* End of SQL
3b40: 20 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71   text */.){.  sq
3b50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
3b60: 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65  se->db;.  Trigge
3b70: 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53  rStep *pTriggerS
3b80: 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67 65 72  tep;..  pTrigger
3b90: 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62  Step = sqlite3Db
3ba0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
3bb0: 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 65  izeof(TriggerSte
3bc0: 70 29 20 2b 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20  p) + pName->n + 
3bd0: 31 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67  1);.  if( pTrigg
3be0: 65 72 53 74 65 70 20 29 7b 0a 20 20 20 20 63 68  erStep ){.    ch
3bf0: 61 72 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 26  ar *z = (char*)&
3c00: 70 54 72 69 67 67 65 72 53 74 65 70 5b 31 5d 3b  pTriggerStep[1];
3c10: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  .    memcpy(z, p
3c20: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
3c30: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
3c40: 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 20 20 70  equote(z);.    p
3c50: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 7a 54 61  TriggerStep->zTa
3c60: 72 67 65 74 20 3d 20 7a 3b 0a 20 20 20 20 70 54  rget = z;.    pT
3c70: 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d  riggerStep->op =
3c80: 20 6f 70 3b 0a 20 20 20 20 70 54 72 69 67 67 65   op;.    pTrigge
3c90: 72 53 74 65 70 2d 3e 7a 53 70 61 6e 20 3d 20 74  rStep->zSpan = t
3ca0: 72 69 67 67 65 72 53 70 61 6e 44 75 70 28 64 62  riggerSpanDup(db
3cb0: 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b  , zStart, zEnd);
3cc0: 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  .    if( IN_RENA
3cd0: 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
3ce0: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
3cf0: 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c  TokenMap(pParse,
3d00: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 7a   pTriggerStep->z
3d10: 54 61 72 67 65 74 2c 20 70 4e 61 6d 65 29 3b 0a  Target, pName);.
3d20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3d30: 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b  rn pTriggerStep;
3d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 69 6c 64 20  .}../*.** Build 
3d50: 61 20 74 72 69 67 67 65 72 20 73 74 65 70 20 6f  a trigger step o
3d60: 75 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20  ut of an INSERT 
3d70: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
3d80: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
3d90: 74 6f 20 74 68 65 20 6e 65 77 20 74 72 69 67 67  to the new trigg
3da0: 65 72 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  er step..**.** T
3db0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
3dc0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3dd0: 6e 20 69 74 20 73 65 65 73 20 61 6e 20 49 4e 53  n it sees an INS
3de0: 45 52 54 20 69 6e 73 69 64 65 20 74 68 65 0a 2a  ERT inside the.*
3df0: 2a 20 62 6f 64 79 20 6f 66 20 61 20 74 72 69 67  * body of a trig
3e00: 67 65 72 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53  ger..*/.TriggerS
3e10: 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67  tep *sqlite3Trig
3e20: 67 65 72 49 6e 73 65 72 74 53 74 65 70 28 0a 20  gerInsertStep(. 
3e30: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3e40: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 2a       /* Parser *
3e50: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
3e60: 65 4e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  eName,  /* Name 
3e70: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  of the table int
3e80: 6f 20 77 68 69 63 68 20 77 65 20 69 6e 73 65 72  o which we inser
3e90: 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  t */.  IdList *p
3ea0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20 4c 69  Column,    /* Li
3eb0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
3ec0: 20 70 54 61 62 6c 65 4e 61 6d 65 20 74 6f 20 69   pTableName to i
3ed0: 6e 73 65 72 74 20 69 6e 74 6f 20 2a 2f 0a 20 20  nsert into */.  
3ee0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
3ef0: 20 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20      /* A SELECT 
3f00: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 73  statement that s
3f10: 75 70 70 6c 69 65 73 20 76 61 6c 75 65 73 20 2a  upplies values *
3f20: 2f 0a 20 20 75 38 20 6f 72 63 6f 6e 66 2c 20 20  /.  u8 orconf,  
3f30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
3f40: 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68  onflict algorith
3f50: 6d 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  m (OE_Abort, OE_
3f60: 52 65 70 6c 61 63 65 2c 20 65 74 63 2e 29 20 2a  Replace, etc.) *
3f70: 2f 0a 20 20 55 70 73 65 72 74 20 2a 70 55 70 73  /.  Upsert *pUps
3f80: 65 72 74 2c 20 20 20 20 2f 2a 20 4f 4e 20 43 4f  ert,    /* ON CO
3f90: 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 66  NFLICT clauses f
3fa0: 6f 72 20 75 70 73 65 72 74 20 2a 2f 0a 20 20 63  or upsert */.  c
3fb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72  onst char *zStar
3fc0: 74 2c 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 53  t, /* Start of S
3fd0: 51 4c 20 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  QL text */.  con
3fe0: 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20  st char *zEnd   
3ff0: 20 2f 2a 20 45 6e 64 20 6f 66 20 53 51 4c 20 74   /* End of SQL t
4000: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
4010: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4020: 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 53  ->db;.  TriggerS
4030: 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65  tep *pTriggerSte
4040: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 70 53 65  p;..  assert(pSe
4050: 6c 65 63 74 20 21 3d 20 30 20 7c 7c 20 64 62 2d  lect != 0 || db-
4060: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a  >mallocFailed);.
4070: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 20  .  pTriggerStep 
4080: 3d 20 74 72 69 67 67 65 72 53 74 65 70 41 6c 6c  = triggerStepAll
4090: 6f 63 61 74 65 28 70 50 61 72 73 65 2c 20 54 4b  ocate(pParse, TK
40a0: 5f 49 4e 53 45 52 54 2c 20 70 54 61 62 6c 65 4e  _INSERT, pTableN
40b0: 61 6d 65 2c 7a 53 74 61 72 74 2c 7a 45 6e 64 29  ame,zStart,zEnd)
40c0: 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  ;.  if( pTrigger
40d0: 53 74 65 70 20 29 7b 0a 20 20 20 20 69 66 28 20  Step ){.    if( 
40e0: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
40f0: 20 29 7b 0a 20 20 20 20 20 20 70 54 72 69 67 67   ){.      pTrigg
4100: 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20  erStep->pSelect 
4110: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  = pSelect;.     
4120: 20 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20   pSelect = 0;.  
4130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
4140: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53 65  TriggerStep->pSe
4150: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
4160: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c  lectDup(db, pSel
4170: 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ect, EXPRDUP_RED
4180: 55 43 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UCE);.    }.    
4190: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 49  pTriggerStep->pI
41a0: 64 4c 69 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b  dList = pColumn;
41b0: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
41c0: 70 2d 3e 70 55 70 73 65 72 74 20 3d 20 70 55 70  p->pUpsert = pUp
41d0: 73 65 72 74 3b 0a 20 20 20 20 70 54 72 69 67 67  sert;.    pTrigg
41e0: 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d  erStep->orconf =
41f0: 20 6f 72 63 6f 6e 66 3b 0a 20 20 7d 65 6c 73 65   orconf;.  }else
4200: 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
4210: 70 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73  pColumn );.    s
4220: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
4230: 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b  te(db, pColumn);
4240: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
4250: 55 70 73 65 72 74 20 29 3b 0a 20 20 20 20 73 71  Upsert );.    sq
4260: 6c 69 74 65 33 55 70 73 65 72 74 44 65 6c 65 74  lite3UpsertDelet
4270: 65 28 64 62 2c 20 70 55 70 73 65 72 74 29 3b 0a  e(db, pUpsert);.
4280: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
4290: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
42a0: 65 6c 65 63 74 29 3b 0a 0a 20 20 72 65 74 75 72  elect);..  retur
42b0: 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a  n pTriggerStep;.
42c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
42d0: 63 74 20 61 20 74 72 69 67 67 65 72 20 73 74 65  ct a trigger ste
42e0: 70 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  p that implement
42f0: 73 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  s an UPDATE stat
4300: 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  ement and return
4310: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
4320: 20 74 68 61 74 20 74 72 69 67 67 65 72 20 73 74   that trigger st
4330: 65 70 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ep.  The parser 
4340: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
4350: 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73 65  ne when it.** se
4360: 65 73 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  es an UPDATE sta
4370: 74 65 6d 65 6e 74 20 69 6e 73 69 64 65 20 74 68  tement inside th
4380: 65 20 62 6f 64 79 20 6f 66 20 61 20 43 52 45 41  e body of a CREA
4390: 54 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a 54  TE TRIGGER..*/.T
43a0: 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69  riggerStep *sqli
43b0: 74 65 33 54 72 69 67 67 65 72 55 70 64 61 74 65  te3TriggerUpdate
43c0: 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Step(.  Parse *p
43d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
43e0: 2f 2a 20 50 61 72 73 65 72 20 2a 2f 0a 20 20 54  /* Parser */.  T
43f0: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
4400: 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
4410: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 75  he table to be u
4420: 70 64 61 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  pdated */.  Expr
4430: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
4440: 20 2f 2a 20 54 68 65 20 53 45 54 20 63 6c 61 75   /* The SET clau
4450: 73 65 3a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  se: list of colu
4460: 6d 6e 20 61 6e 64 20 6e 65 77 20 76 61 6c 75 65  mn and new value
4470: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  s */.  Expr *pWh
4480: 65 72 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ere,        /* T
4490: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
44a0: 2a 2f 0a 20 20 75 38 20 6f 72 63 6f 6e 66 2c 20  */.  u8 orconf, 
44b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
44c0: 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69   conflict algori
44d0: 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20  thm. (OE_Abort, 
44e0: 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 20  OE_Ignore, etc) 
44f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
4500: 2a 7a 53 74 61 72 74 2c 20 20 2f 2a 20 53 74 61  *zStart,  /* Sta
4510: 72 74 20 6f 66 20 53 51 4c 20 74 65 78 74 20 2a  rt of SQL text *
4520: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4530: 7a 45 6e 64 20 20 20 20 20 2f 2a 20 45 6e 64 20  zEnd     /* End 
4540: 6f 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 29  of SQL text */.)
4550: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
4560: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4570: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72  TriggerStep *pTr
4580: 69 67 67 65 72 53 74 65 70 3b 0a 0a 20 20 70 54  iggerStep;..  pT
4590: 72 69 67 67 65 72 53 74 65 70 20 3d 20 74 72 69  riggerStep = tri
45a0: 67 67 65 72 53 74 65 70 41 6c 6c 6f 63 61 74 65  ggerStepAllocate
45b0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 55 50 44 41  (pParse, TK_UPDA
45c0: 54 45 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 7a  TE, pTableName,z
45d0: 53 74 61 72 74 2c 7a 45 6e 64 29 3b 0a 20 20 69  Start,zEnd);.  i
45e0: 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70 20  f( pTriggerStep 
45f0: 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45  ){.    if( IN_RE
4600: 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
4610: 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65       pTriggerSte
4620: 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 70  p->pExprList = p
4630: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 54 72  EList;.      pTr
4640: 69 67 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72  iggerStep->pWher
4650: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
4660: 20 20 70 45 4c 69 73 74 20 3d 20 30 3b 0a 20 20    pEList = 0;.  
4670: 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
4680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4690: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
46a0: 45 78 70 72 4c 69 73 74 20 3d 20 73 71 6c 69 74  ExprList = sqlit
46b0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
46c0: 2c 20 70 45 4c 69 73 74 2c 20 45 58 50 52 44 55  , pEList, EXPRDU
46d0: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
46e0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
46f0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
4700: 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72  xprDup(db, pWher
4710: 65 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  e, EXPRDUP_REDUC
4720: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  E);.    }.    pT
4730: 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f  riggerStep->orco
4740: 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 7d  nf = orconf;.  }
4750: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
4760: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
4770: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ist);.  sqlite3E
4780: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57  xprDelete(db, pW
4790: 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  here);.  return 
47a0: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a  pTriggerStep;.}.
47b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
47c0: 20 61 20 74 72 69 67 67 65 72 20 73 74 65 70 20   a trigger step 
47d0: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
47e0: 61 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  a DELETE stateme
47f0: 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  nt and return.**
4800: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4810: 61 74 20 74 72 69 67 67 65 72 20 73 74 65 70 2e  at trigger step.
4820: 20 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c    The parser cal
4830: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
4840: 77 68 65 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20  when it.** sees 
4850: 61 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  a DELETE stateme
4860: 6e 74 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f  nt inside the bo
4870: 64 79 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  dy of a CREATE T
4880: 52 49 47 47 45 52 2e 0a 2a 2f 0a 54 72 69 67 67  RIGGER..*/.Trigg
4890: 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54  erStep *sqlite3T
48a0: 72 69 67 67 65 72 44 65 6c 65 74 65 53 74 65 70  riggerDeleteStep
48b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
48c0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
48d0: 61 72 73 65 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e  arser */.  Token
48e0: 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20   *pTableName,   
48f0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
4900: 66 72 6f 6d 20 77 68 69 63 68 20 72 6f 77 73 20  from which rows 
4910: 61 72 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  are deleted */. 
4920: 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
4930: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4940: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
4950: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
4960: 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74 61  tart,     /* Sta
4970: 72 74 20 6f 66 20 53 51 4c 20 74 65 78 74 20 2a  rt of SQL text *
4980: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4990: 7a 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20 45  zEnd        /* E
49a0: 6e 64 20 6f 66 20 53 51 4c 20 74 65 78 74 20 2a  nd of SQL text *
49b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
49c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
49d0: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
49e0: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 0a 20  pTriggerStep;.. 
49f0: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20   pTriggerStep = 
4a00: 74 72 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63  triggerStepAlloc
4a10: 61 74 65 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  ate(pParse, TK_D
4a20: 45 4c 45 54 45 2c 20 70 54 61 62 6c 65 4e 61 6d  ELETE, pTableNam
4a30: 65 2c 7a 53 74 61 72 74 2c 7a 45 6e 64 29 3b 0a  e,zStart,zEnd);.
4a40: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
4a50: 65 70 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e  ep ){.    if( IN
4a60: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
4a70: 7b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  {.      pTrigger
4a80: 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d 20 70  Step->pWhere = p
4a90: 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 57 68  Where;.      pWh
4aa0: 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ere = 0;.    }el
4ab0: 73 65 7b 0a 20 20 20 20 20 20 70 54 72 69 67 67  se{.      pTrigg
4ac0: 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d  erStep->pWhere =
4ad0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4ae0: 64 62 2c 20 70 57 68 65 72 65 2c 20 45 58 50 52  db, pWhere, EXPR
4af0: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
4b00: 20 7d 0a 20 20 20 20 70 54 72 69 67 67 65 72 53   }.    pTriggerS
4b10: 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45  tep->orconf = OE
4b20: 5f 44 65 66 61 75 6c 74 3b 0a 20 20 7d 0a 20 20  _Default;.  }.  
4b30: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4b40: 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b 0a 20  e(db, pWhere);. 
4b50: 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72   return pTrigger
4b60: 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  Step;.}../* .** 
4b70: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
4b80: 74 65 20 61 20 54 72 69 67 67 65 72 20 73 74 72  te a Trigger str
4b90: 75 63 74 75 72 65 0a 2a 2f 0a 76 6f 69 64 20 73  ucture.*/.void s
4ba0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
4bb0: 67 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ger(sqlite3 *db,
4bc0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
4bd0: 65 72 29 7b 0a 20 20 69 66 28 20 70 54 72 69 67  er){.  if( pTrig
4be0: 67 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ger==0 ) return;
4bf0: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
4c00: 54 72 69 67 67 65 72 53 74 65 70 28 64 62 2c 20  TriggerStep(db, 
4c10: 70 54 72 69 67 67 65 72 2d 3e 73 74 65 70 5f 6c  pTrigger->step_l
4c20: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ist);.  sqlite3D
4c30: 62 46 72 65 65 28 64 62 2c 20 70 54 72 69 67 67  bFree(db, pTrigg
4c40: 65 72 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  er->zName);.  sq
4c50: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4c60: 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 29  pTrigger->table)
4c70: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
4c80: 45 4e 41 42 4c 45 5f 53 48 41 52 45 44 5f 53 43  ENABLE_SHARED_SC
4c90: 48 45 4d 41 0a 20 20 73 71 6c 69 74 65 33 44 62  HEMA.  sqlite3Db
4ca0: 46 72 65 65 28 64 62 2c 20 70 54 72 69 67 67 65  Free(db, pTrigge
4cb0: 72 2d 3e 7a 54 61 62 53 63 68 65 6d 61 29 3b 0a  r->zTabSchema);.
4cc0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
4cd0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4ce0: 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b  Trigger->pWhen);
4cf0: 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
4d00: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 72 69 67  Delete(db, pTrig
4d10: 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 29 3b 0a  ger->pColumns);.
4d20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4d30: 64 62 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 7d  db, pTrigger);.}
4d40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
4d50: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
4d60: 74 6f 20 64 72 6f 70 20 61 20 74 72 69 67 67 65  to drop a trigge
4d70: 72 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  r from the datab
4d80: 61 73 65 20 73 63 68 65 6d 61 2e 20 0a 2a 2a 0a  ase schema. .**.
4d90: 2a 2a 20 54 68 69 73 20 6d 61 79 20 62 65 20 63  ** This may be c
4da0: 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 66  alled directly f
4db0: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 20 61  rom the parser a
4dc0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 69 64 65  nd therefore ide
4dd0: 6e 74 69 66 69 65 73 0a 2a 2a 20 74 68 65 20 74  ntifies.** the t
4de0: 72 69 67 67 65 72 20 62 79 20 6e 61 6d 65 2e 20  rigger by name. 
4df0: 20 54 68 65 20 73 71 6c 69 74 65 33 44 72 6f 70   The sqlite3Drop
4e00: 54 72 69 67 67 65 72 50 74 72 28 29 20 72 6f 75  TriggerPtr() rou
4e10: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 0a 2a 2a  tine does the.**
4e20: 20 73 61 6d 65 20 6a 6f 62 20 61 73 20 74 68 69   same job as thi
4e30: 73 20 72 6f 75 74 69 6e 65 20 65 78 63 65 70 74  s routine except
4e40: 20 69 74 20 74 61 6b 65 73 20 61 20 70 6f 69 6e   it takes a poin
4e50: 74 65 72 20 74 6f 20 74 68 65 20 74 72 69 67 67  ter to the trigg
4e60: 65 72 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  er.** instead of
4e70: 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d   the trigger nam
4e80: 65 2e 0a 2a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  e..**/.void sqli
4e90: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28 50  te3DropTrigger(P
4ea0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
4eb0: 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
4ec0: 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 72 69 67  t noErr){.  Trig
4ed0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
4ee0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  0;.  int i;.  co
4ef0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
4f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4f10: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  me;.  sqlite3 *d
4f20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4f30: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
4f40: 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 64  cFailed ) goto d
4f50: 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61  rop_trigger_clea
4f60: 6e 75 70 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  nup;.  if( SQLIT
4f70: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
4f80: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
4f90: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 72 6f 70  ){.    goto drop
4fa0: 5f 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70  _trigger_cleanup
4fb0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
4fc0: 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
4fd0: 29 3b 0a 20 20 7a 44 62 20 3d 20 70 4e 61 6d 65  );.  zDb = pName
4fe0: 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
4ff0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 4e 61 6d  ;.  zName = pNam
5000: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a 20  e->a[0].zName;. 
5010: 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20   assert( zDb!=0 
5020: 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  || sqlite3BtreeH
5030: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
5040: 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  b) );.  for(i=OM
5050: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
5060: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
5070: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
5080: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
5090: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
50a0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
50b0: 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74  zDb && sqlite3St
50c0: 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 6a 5d  rICmp(db->aDb[j]
50d0: 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 44 62 29 20  .zDbSName, zDb) 
50e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
50f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
5100: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
5110: 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, j, 0) );.    
5120: 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
5130: 65 33 48 61 73 68 46 69 6e 64 28 26 28 64 62 2d  e3HashFind(&(db-
5140: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[j].pSchema-
5150: 3e 74 72 69 67 48 61 73 68 29 2c 20 7a 4e 61 6d  >trigHash), zNam
5160: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72 69  e);.    if( pTri
5170: 67 67 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  gger ) break;.  
5180: 7d 0a 20 20 69 66 28 20 21 70 54 72 69 67 67 65  }.  if( !pTrigge
5190: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6e 6f  r ){.    if( !no
51a0: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
51b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
51c0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 72  rse, "no such tr
51d0: 69 67 67 65 72 3a 20 25 53 22 2c 20 70 4e 61 6d  igger: %S", pNam
51e0: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
51f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
5200: 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
5210: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 7a 44 62  hema(pParse, zDb
5220: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
5230: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
5240: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 64   = 1;.    goto d
5250: 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61  rop_trigger_clea
5260: 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nup;.  }.  sqlit
5270: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
5280: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
5290: 72 29 3b 0a 0a 64 72 6f 70 5f 74 72 69 67 67 65  r);..drop_trigge
52a0: 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  r_cleanup:.  sql
52b0: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
52c0: 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
52d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
52e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
52f0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  able structure f
5300: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  or the table tha
5310: 74 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69  t a trigger.** i
5320: 73 20 73 65 74 20 6f 6e 2e 0a 2a 2f 0a 73 74 61  s set on..*/.sta
5330: 74 69 63 20 54 61 62 6c 65 20 2a 74 61 62 6c 65  tic Table *table
5340: 4f 66 54 72 69 67 67 65 72 28 54 72 69 67 67 65  OfTrigger(Trigge
5350: 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 20  r *pTrigger){.  
5360: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 48 61  return sqlite3Ha
5370: 73 68 46 69 6e 64 28 26 70 54 72 69 67 67 65 72  shFind(&pTrigger
5380: 2d 3e 70 54 61 62 53 63 68 65 6d 61 2d 3e 74 62  ->pTabSchema->tb
5390: 6c 48 61 73 68 2c 20 70 54 72 69 67 67 65 72 2d  lHash, pTrigger-
53a0: 3e 74 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  >table);.}.../*.
53b0: 2a 2a 20 44 72 6f 70 20 61 20 74 72 69 67 67 65  ** Drop a trigge
53c0: 72 20 67 69 76 65 6e 20 61 20 70 6f 69 6e 74 65  r given a pointe
53d0: 72 20 74 6f 20 74 68 61 74 20 74 72 69 67 67 65  r to that trigge
53e0: 72 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  r. .*/.void sqli
53f0: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74  te3DropTriggerPt
5400: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
5410: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
5420: 65 72 29 7b 0a 20 20 54 61 62 6c 65 20 20 20 2a  er){.  Table   *
5430: 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a  pTable;.  Vdbe *
5440: 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
5450: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
5460: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 44 62   int iDb;..  iDb
5470: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
5480: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
5490: 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 53  db, pTrigger->pS
54a0: 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
54b0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
54c0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 73 71 6c  db->nDb );.  sql
54d0: 69 74 65 33 53 63 68 65 6d 61 57 72 69 74 61 62  ite3SchemaWritab
54e0: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
54f0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 74 61 62 6c  .  pTable = tabl
5500: 65 4f 66 54 72 69 67 67 65 72 28 70 54 72 69 67  eOfTrigger(pTrig
5510: 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
5520: 70 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  pTable );.  asse
5530: 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  rt( pTable->pSch
5540: 65 6d 61 3d 3d 70 54 72 69 67 67 65 72 2d 3e 70  ema==pTrigger->p
5550: 53 63 68 65 6d 61 20 7c 7c 20 69 44 62 3d 3d 31  Schema || iDb==1
5560: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
5570: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
5580: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
5590: 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
55a0: 44 52 4f 50 5f 54 52 49 47 47 45 52 3b 0a 20 20  DROP_TRIGGER;.  
55b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
55c0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
55d0: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63  .zDbSName;.    c
55e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
55f0: 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
5600: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  Db);.    if( iDb
5610: 3d 3d 31 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  ==1 ) code = SQL
5620: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
5630: 49 47 47 45 52 3b 0a 20 20 20 20 69 66 28 20 73  IGGER;.    if( s
5640: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
5650: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
5660: 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 2c 20 70  rigger->zName, p
5670: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 44  Table->zName, zD
5680: 62 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  b) ||.      sqli
5690: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
56a0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
56b0: 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
56c0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
56d0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  n;.    }.  }.#en
56e0: 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
56f0: 74 65 20 63 6f 64 65 20 74 6f 20 64 65 73 74 72  te code to destr
5700: 6f 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  oy the database 
5710: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 74 72  record of the tr
5720: 69 67 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 61 73  igger..  */.  as
5730: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
5740: 29 3b 0a 20 20 69 66 28 20 28 76 20 3d 20 73 71  );.  if( (v = sq
5750: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
5760: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
5770: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
5780: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
5790: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
57a0: 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
57b0: 25 51 20 41 4e 44 20 74 79 70 65 3d 27 74 72 69  %Q AND type='tri
57c0: 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 64  gger'",.       d
57d0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
57e0: 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
57f0: 45 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61  E, pTrigger->zNa
5800: 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  me.    );.    sq
5810: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
5820: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
5830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5840: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
5850: 54 72 69 67 67 65 72 2c 20 69 44 62 2c 20 30 2c  Trigger, iDb, 0,
5860: 20 30 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e   0, pTrigger->zN
5870: 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  ame, 0);.  }.}..
5880: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 20 74  /*.** Remove a t
5890: 72 69 67 67 65 72 20 66 72 6f 6d 20 74 68 65 20  rigger from the 
58a0: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 20 74  hash tables of t
58b0: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
58c0: 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
58d0: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
58e0: 74 65 54 72 69 67 67 65 72 28 73 71 6c 69 74 65  teTrigger(sqlite
58f0: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
5900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
5910: 65 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70  e){.  Trigger *p
5920: 54 72 69 67 67 65 72 3b 0a 20 20 48 61 73 68 20  Trigger;.  Hash 
5930: 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72  *pHash;..  asser
5940: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
5950: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
5960: 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68  b, 0) );.  pHash
5970: 20 3d 20 26 28 64 62 2d 3e 61 44 62 5b 69 44 62   = &(db->aDb[iDb
5980: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48  ].pSchema->trigH
5990: 61 73 68 29 3b 0a 20 20 70 54 72 69 67 67 65 72  ash);.  pTrigger
59a0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
59b0: 73 65 72 74 28 70 48 61 73 68 2c 20 7a 4e 61 6d  sert(pHash, zNam
59c0: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57  e, 0);.  if( ALW
59d0: 41 59 53 28 70 54 72 69 67 67 65 72 29 20 29 7b  AYS(pTrigger) ){
59e0: 0a 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65  .    if( pTrigge
59f0: 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 72 69  r->pSchema==pTri
5a00: 67 67 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61  gger->pTabSchema
5a10: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
5a20: 2a 70 54 61 62 20 3d 20 74 61 62 6c 65 4f 66 54  *pTab = tableOfT
5a30: 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29  rigger(pTrigger)
5a40: 3b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 20  ;.      Trigger 
5a50: 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  **pp;.      for(
5a60: 70 70 3d 26 70 54 61 62 2d 3e 70 54 72 69 67 67  pp=&pTab->pTrigg
5a70: 65 72 3b 20 2a 70 70 21 3d 70 54 72 69 67 67 65  er; *pp!=pTrigge
5a80: 72 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  r; pp=&((*pp)->p
5a90: 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 2a 70  Next));.      *p
5aa0: 70 20 3d 20 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p = (*pp)->pNext
5ab0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5ac0: 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72  te3DeleteTrigger
5ad0: 28 64 62 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  (db, pTrigger);.
5ae0: 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
5af0: 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
5b00: 61 43 68 61 6e 67 65 3b 0a 20 20 7d 0a 7d 0a 0a  aChange;.  }.}..
5b10: 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20  /*.** pEList is 
5b20: 74 68 65 20 53 45 54 20 63 6c 61 75 73 65 20 6f  the SET clause o
5b30: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
5b40: 65 6d 65 6e 74 2e 20 20 45 61 63 68 20 65 6e 74  ement.  Each ent
5b50: 72 79 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20  ry.** in pEList 
5b60: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 61 74  is of the format
5b70: 20 3c 69 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49   <id>=<expr>.  I
5b80: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 6e 74  f any of the ent
5b90: 72 69 65 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73  ries.** in pELis
5ba0: 74 20 68 61 76 65 20 61 6e 20 3c 69 64 3e 20 77  t have an <id> w
5bb0: 68 69 63 68 20 6d 61 74 63 68 65 73 20 61 6e 20  hich matches an 
5bc0: 69 64 65 6e 74 69 66 69 65 72 20 69 6e 20 70 49  identifier in pI
5bd0: 64 4c 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72  dList,.** then r
5be0: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
5bf0: 70 49 64 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74  pIdList==NULL, t
5c00: 68 65 6e 20 69 74 20 69 73 20 63 6f 6e 73 69 64  hen it is consid
5c10: 65 72 65 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61  ered a.** wildca
5c20: 72 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  rd that matches 
5c30: 61 6e 79 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77  anything.  Likew
5c40: 69 73 65 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e  ise if pEList==N
5c50: 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d  ULL then.** it m
5c60: 61 74 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20  atches anything 
5c70: 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  so always return
5c80: 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66   true.  Return f
5c90: 61 6c 73 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alse only.** if 
5ca0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
5cb0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
5cc0: 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72   checkColumnOver
5cd0: 6c 61 70 28 49 64 4c 69 73 74 20 2a 70 49 64 4c  lap(IdList *pIdL
5ce0: 69 73 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ist, ExprList *p
5cf0: 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b  EList){.  int e;
5d00: 0a 20 20 69 66 28 20 70 49 64 4c 69 73 74 3d 3d  .  if( pIdList==
5d10: 30 20 7c 7c 20 4e 45 56 45 52 28 70 45 4c 69 73  0 || NEVER(pELis
5d20: 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 31  t==0) ) return 1
5d30: 3b 0a 20 20 66 6f 72 28 65 3d 30 3b 20 65 3c 70  ;.  for(e=0; e<p
5d40: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 65 2b  EList->nExpr; e+
5d50: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
5d60: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
5d70: 49 64 4c 69 73 74 2c 20 70 45 4c 69 73 74 2d 3e  IdList, pEList->
5d80: 61 5b 65 5d 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29  a[e].zName)>=0 )
5d90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
5da0: 20 72 65 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f   return 0; .}../
5db0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69  *.** Return a li
5dc0: 73 74 20 6f 66 20 61 6c 6c 20 74 72 69 67 67 65  st of all trigge
5dd0: 72 73 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62  rs on table pTab
5de0: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
5df0: 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65   at least.** one
5e00: 20 74 72 69 67 67 65 72 20 74 68 61 74 20 6d 75   trigger that mu
5e10: 73 74 20 62 65 20 66 69 72 65 64 20 77 68 65 6e  st be fired when
5e20: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66   an operation of
5e30: 20 74 79 70 65 20 27 6f 70 27 20 69 73 20 0a 2a   type 'op' is .*
5e40: 2a 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  * performed on t
5e50: 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 2c 20 69  he table, and, i
5e60: 66 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  f that operation
5e70: 20 69 73 20 61 6e 20 55 50 44 41 54 45 2c 20 69   is an UPDATE, i
5e80: 66 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 6f 6e  f at.** least on
5e90: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  e of the columns
5ea0: 20 69 6e 20 70 43 68 61 6e 67 65 73 20 69 73 20   in pChanges is 
5eb0: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a  being modified..
5ec0: 2a 2f 0a 54 72 69 67 67 65 72 20 2a 73 71 6c 69  */.Trigger *sqli
5ed0: 74 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74  te3TriggersExist
5ee0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5ef0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
5f00: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
5f10: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
5f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5f30: 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6e 74 61   table the conta
5f40: 69 6e 73 20 74 68 65 20 74 72 69 67 67 65 72 73  ins the triggers
5f50: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f70: 20 6f 6e 65 20 6f 66 20 54 4b 5f 44 45 4c 45 54   one of TK_DELET
5f80: 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b  E, TK_INSERT, TK
5f90: 5f 55 50 44 41 54 45 20 2a 2f 0a 20 20 45 78 70  _UPDATE */.  Exp
5fa0: 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c  rList *pChanges,
5fb0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20       /* Columns 
5fc0: 74 68 61 74 20 63 68 61 6e 67 65 20 69 6e 20 61  that change in a
5fd0: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
5fe0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4d 61  nt */.  int *pMa
5ff0: 73 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  sk              
6000: 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
6010: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 7c 54  TRIGGER_BEFORE|T
6020: 52 49 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a  RIGGER_AFTER */.
6030: 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20  ){.  int mask = 
6040: 30 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4c  0;.  Trigger *pL
6050: 69 73 74 20 3d 20 30 3b 0a 20 20 54 72 69 67 67  ist = 0;.  Trigg
6060: 65 72 20 2a 70 3b 0a 0a 20 20 69 66 28 20 28 70  er *p;..  if( (p
6070: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
6080: 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65   & SQLITE_Enable
6090: 54 72 69 67 67 65 72 29 21 3d 30 20 29 7b 0a 20  Trigger)!=0 ){. 
60a0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
60b0: 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50  e3TriggerList(pP
60c0: 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  arse, pTab);.  }
60d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
60e0: 3d 3d 30 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  ==0 || IsVirtual
60f0: 28 70 54 61 62 29 3d 3d 30 20 29 3b 0a 20 20 66  (pTab)==0 );.  f
6100: 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
6110: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
6120: 69 66 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26  if( p->op==op &&
6130: 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72   checkColumnOver
6140: 6c 61 70 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c  lap(p->pColumns,
6150: 20 70 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20   pChanges) ){.  
6160: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 70 2d 3e 74      mask |= p->t
6170: 72 5f 74 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r_tm;.    }.  }.
6180: 20 20 69 66 28 20 70 4d 61 73 6b 20 29 7b 0a 20    if( pMask ){. 
6190: 20 20 20 2a 70 4d 61 73 6b 20 3d 20 6d 61 73 6b     *pMask = mask
61a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
61b0: 6d 61 73 6b 20 3f 20 70 4c 69 73 74 20 3a 20 30  mask ? pList : 0
61c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  );.}../*.** Conv
61d0: 65 72 74 20 74 68 65 20 70 53 74 65 70 2d 3e 7a  ert the pStep->z
61e0: 54 61 72 67 65 74 20 73 74 72 69 6e 67 20 69 6e  Target string in
61f0: 74 6f 20 61 20 53 72 63 4c 69 73 74 20 61 6e 64  to a SrcList and
6200: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
6210: 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 53 72 63  r.** to that Src
6220: 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  List..**.** This
6230: 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20   routine adds a 
6240: 73 70 65 63 69 66 69 63 20 64 61 74 61 62 61 73  specific databas
6250: 65 20 6e 61 6d 65 2c 20 69 66 20 6e 65 65 64 65  e name, if neede
6260: 64 2c 20 74 6f 20 74 68 65 20 74 61 72 67 65 74  d, to the target
6270: 20 77 68 65 6e 0a 2a 2a 20 66 6f 72 6d 69 6e 67   when.** forming
6280: 20 74 68 65 20 53 72 63 4c 69 73 74 2e 20 20 54   the SrcList.  T
6290: 68 69 73 20 70 72 65 76 65 6e 74 73 20 61 20 74  his prevents a t
62a0: 72 69 67 67 65 72 20 69 6e 20 6f 6e 65 20 64 61  rigger in one da
62b0: 74 61 62 61 73 65 20 66 72 6f 6d 0a 2a 2a 20 72  tabase from.** r
62c0: 65 66 65 72 72 69 6e 67 20 74 6f 20 61 20 74 61  eferring to a ta
62d0: 72 67 65 74 20 69 6e 20 61 6e 6f 74 68 65 72 20  rget in another 
62e0: 64 61 74 61 62 61 73 65 2e 20 20 41 6e 20 65 78  database.  An ex
62f0: 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20  ception is when 
6300: 74 68 65 0a 2a 2a 20 74 72 69 67 67 65 72 20 69  the.** trigger i
6310: 73 20 69 6e 20 54 45 4d 50 20 69 6e 20 77 68 69  s in TEMP in whi
6320: 63 68 20 63 61 73 65 20 69 74 20 63 61 6e 20 72  ch case it can r
6330: 65 66 65 72 20 74 6f 20 61 6e 79 20 6f 74 68 65  efer to any othe
6340: 72 20 64 61 74 61 62 61 73 65 20 69 74 0a 2a 2a  r database it.**
6350: 20 77 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69   wants..*/.stati
6360: 63 20 53 72 63 4c 69 73 74 20 2a 74 61 72 67 65  c SrcList *targe
6370: 74 53 72 63 4c 69 73 74 28 0a 20 20 50 61 72 73  tSrcList(.  Pars
6380: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6390: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
63a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69  context */.  Tri
63b0: 67 67 65 72 53 74 65 70 20 2a 70 53 74 65 70 20  ggerStep *pStep 
63c0: 20 20 2f 2a 20 54 68 65 20 74 72 69 67 67 65 72    /* The trigger
63d0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
63e0: 74 61 72 67 65 74 20 74 6f 6b 65 6e 20 2a 2f 0a  target token */.
63f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
6400: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6410: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
6420: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
6430: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
6440: 6f 20 75 73 65 20 2a 2f 0a 20 20 53 72 63 4c 69  o use */.  SrcLi
6450: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20  st *pSrc;       
6460: 2f 2a 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65  /* SrcList to be
6470: 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 0a 20 20   returned */..  
6480: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
6490: 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  cListAppend(pPar
64a0: 73 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  se, 0, 0, 0);.  
64b0: 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
64c0: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53  assert( pSrc->nS
64d0: 72 63 3e 30 20 29 3b 0a 20 20 20 20 70 53 72 63  rc>0 );.    pSrc
64e0: 2d 3e 61 5b 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ->a[pSrc->nSrc-1
64f0: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
6500: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53  3DbStrDup(db, pS
6510: 74 65 70 2d 3e 7a 54 61 72 67 65 74 29 3b 0a 20  tep->zTarget);. 
6520: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
6530: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
6540: 2c 20 70 53 74 65 70 2d 3e 70 54 72 69 67 2d 3e  , pStep->pTrig->
6550: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66  pSchema);.    if
6560: 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e  ( iDb==0 || iDb>
6570: 3d 32 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =2 ){.      cons
6580: 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20  t char *zDb;.   
6590: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64     assert( iDb<d
65a0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20  b->nDb );.      
65b0: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
65c0: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
65d0: 20 20 20 70 53 72 63 2d 3e 61 5b 70 53 72 63 2d     pSrc->a[pSrc-
65e0: 3e 6e 53 72 63 2d 31 5d 2e 7a 44 61 74 61 62 61  >nSrc-1].zDataba
65f0: 73 65 20 3d 20 20 73 71 6c 69 74 65 33 44 62 53  se =  sqlite3DbS
6600: 74 72 44 75 70 28 64 62 2c 20 7a 44 62 29 3b 0a  trDup(db, zDb);.
6610: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6620: 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pSrc;.}../*.*
6630: 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
6640: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61  code for the sta
6650: 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 20 74  tements inside t
6660: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 73 69 6e  he body of a sin
6670: 67 6c 65 20 0a 2a 2a 20 74 72 69 67 67 65 72 2e  gle .** trigger.
6680: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
6690: 6f 64 65 54 72 69 67 67 65 72 50 72 6f 67 72 61  odeTriggerProgra
66a0: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
66b0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
66c0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
66d0: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
66e0: 72 53 74 65 70 20 2a 70 53 74 65 70 4c 69 73 74  rStep *pStepList
66f0: 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 73  ,   /* List of s
6700: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
6710: 20 74 68 65 20 74 72 69 67 67 65 72 20 62 6f 64   the trigger bod
6720: 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e  y */.  int orcon
6730: 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
6740: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 61 6c 67   /* Conflict alg
6750: 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72  orithm. (OE_Abor
6760: 74 2c 20 65 74 63 29 20 2a 2f 20 20 0a 29 7b 0a  t, etc) */  .){.
6770: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
6780: 53 74 65 70 3b 0a 20 20 56 64 62 65 20 2a 76 20  Step;.  Vdbe *v 
6790: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
67a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
67b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
67c0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
67d0: 70 54 72 69 67 67 65 72 54 61 62 20 26 26 20 70  pTriggerTab && p
67e0: 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
67f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
6800: 74 65 70 4c 69 73 74 20 29 3b 0a 20 20 61 73 73  tepList );.  ass
6810: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 66  ert( v!=0 );.  f
6820: 6f 72 28 70 53 74 65 70 3d 70 53 74 65 70 4c 69  or(pStep=pStepLi
6830: 73 74 3b 20 70 53 74 65 70 3b 20 70 53 74 65 70  st; pStep; pStep
6840: 3d 70 53 74 65 70 2d 3e 70 4e 65 78 74 29 7b 0a  =pStep->pNext){.
6850: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
6860: 74 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  t the ON CONFLIC
6870: 54 20 70 6f 6c 69 63 79 20 74 68 61 74 20 77 69  T policy that wi
6880: 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ll be used for t
6890: 68 69 73 20 73 74 65 70 0a 20 20 20 20 2a 2a 20  his step.    ** 
68a0: 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20 70  of the trigger p
68b0: 72 6f 67 72 61 6d 2e 20 49 66 20 74 68 65 20 73  rogram. If the s
68c0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 63 61  tatement that ca
68d0: 75 73 65 64 20 74 68 69 73 20 74 72 69 67 67 65  used this trigge
68e0: 72 0a 20 20 20 20 2a 2a 20 74 6f 20 66 69 72 65  r.    ** to fire
68f0: 20 68 61 64 20 61 6e 20 65 78 70 6c 69 63 69 74   had an explicit
6900: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 2c 20 74 68   ON CONFLICT, th
6910: 65 6e 20 75 73 65 20 69 74 2e 20 4f 74 68 65 72  en use it. Other
6920: 77 69 73 65 2c 20 75 73 65 0a 20 20 20 20 2a 2a  wise, use.    **
6930: 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
6940: 20 70 6f 6c 69 63 79 20 74 68 61 74 20 77 61 73   policy that was
6950: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
6960: 72 74 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  rt of the trigge
6970: 72 0a 20 20 20 20 2a 2a 20 73 74 65 70 20 73 74  r.    ** step st
6980: 61 74 65 6d 65 6e 74 2e 20 45 78 61 6d 70 6c 65  atement. Example
6990: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
69a0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
69b0: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
69c0: 20 74 31 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a   t1 BEGIN;.    *
69d0: 2a 20 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20  *     INSERT OR 
69e0: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 32 20  REPLACE INTO t2 
69f0: 56 41 4c 55 45 53 28 6e 65 77 2e 61 2c 20 6e 65  VALUES(new.a, ne
6a00: 77 2e 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 45  w.b);.    **   E
6a10: 4e 44 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ND;.    **.    *
6a20: 2a 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  *   INSERT INTO 
6a30: 74 31 20 2e 2e 2e 20 3b 20 20 20 20 20 20 20 20  t1 ... ;        
6a40: 20 20 20 20 2d 2d 20 69 6e 73 65 72 74 20 69 6e      -- insert in
6a50: 74 6f 20 74 32 20 75 73 65 73 20 52 45 50 4c 41  to t2 uses REPLA
6a60: 43 45 20 70 6f 6c 69 63 79 0a 20 20 20 20 2a 2a  CE policy.    **
6a70: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e     INSERT OR IGN
6a80: 4f 52 45 20 49 4e 54 4f 20 74 31 20 2e 2e 2e 20  ORE INTO t1 ... 
6a90: 3b 20 20 2d 2d 20 69 6e 73 65 72 74 20 69 6e 74  ;  -- insert int
6aa0: 6f 20 74 32 20 75 73 65 73 20 49 47 4e 4f 52 45  o t2 uses IGNORE
6ab0: 20 70 6f 6c 69 63 79 0a 20 20 20 20 2a 2f 0a 20   policy.    */. 
6ac0: 20 20 20 70 50 61 72 73 65 2d 3e 65 4f 72 63 6f     pParse->eOrco
6ad0: 6e 66 20 3d 20 28 6f 72 63 6f 6e 66 3d 3d 4f 45  nf = (orconf==OE
6ae0: 5f 44 65 66 61 75 6c 74 29 3f 70 53 74 65 70 2d  _Default)?pStep-
6af0: 3e 6f 72 63 6f 6e 66 3a 28 75 38 29 6f 72 63 6f  >orconf:(u8)orco
6b00: 6e 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nf;.    assert( 
6b10: 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
6b20: 61 63 74 6f 72 3d 3d 30 20 29 3b 0a 0a 23 69 66  actor==0 );..#if
6b30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6b40: 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 70  _TRACE.    if( p
6b50: 53 74 65 70 2d 3e 7a 53 70 61 6e 20 29 7b 0a 20  Step->zSpan ){. 
6b60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6b70: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 54 72 61  AddOp4(v, OP_Tra
6b80: 63 65 2c 20 30 78 37 66 66 66 66 66 66 66 2c 20  ce, 0x7fffffff, 
6b90: 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
6ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
6bb0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
6bc0: 20 22 2d 2d 20 25 73 22 2c 20 70 53 74 65 70 2d   "-- %s", pStep-
6bd0: 3e 7a 53 70 61 6e 29 2c 0a 20 20 20 20 20 20 20  >zSpan),.       
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
6c00: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
6c10: 73 77 69 74 63 68 28 20 70 53 74 65 70 2d 3e 6f  switch( pStep->o
6c20: 70 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  p ){.      case 
6c30: 54 4b 5f 55 50 44 41 54 45 3a 20 7b 0a 20 20 20  TK_UPDATE: {.   
6c40: 20 20 20 20 20 73 71 6c 69 74 65 33 55 70 64 61       sqlite3Upda
6c50: 74 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  te(pParse, .    
6c60: 20 20 20 20 20 20 74 61 72 67 65 74 53 72 63 4c        targetSrcL
6c70: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 74 65  ist(pParse, pSte
6c80: 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  p),.          sq
6c90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
6ca0: 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 45 78 70  (db, pStep->pExp
6cb0: 72 4c 69 73 74 2c 20 30 29 2c 20 0a 20 20 20 20  rList, 0), .    
6cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6cd0: 72 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e  rDup(db, pStep->
6ce0: 70 57 68 65 72 65 2c 20 30 29 2c 20 0a 20 20 20  pWhere, 0), .   
6cf0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 65         pParse->e
6d00: 4f 72 63 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 0a  Orconf, 0, 0, 0.
6d10: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
6d20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6d30: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
6d40: 49 4e 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20  INSERT: {.      
6d50: 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74 28    sqlite3Insert(
6d60: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
6d70: 20 20 20 74 61 72 67 65 74 53 72 63 4c 69 73 74     targetSrcList
6d80: 28 70 50 61 72 73 65 2c 20 70 53 74 65 70 29 2c  (pParse, pStep),
6d90: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6da0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
6db0: 70 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 2c 20  pStep->pSelect, 
6dc0: 30 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  0), .          s
6dd0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
6de0: 64 62 2c 20 70 53 74 65 70 2d 3e 70 49 64 4c 69  db, pStep->pIdLi
6df0: 73 74 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  st), .          
6e00: 70 50 61 72 73 65 2d 3e 65 4f 72 63 6f 6e 66 2c  pParse->eOrconf,
6e10: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6e20: 65 33 55 70 73 65 72 74 44 75 70 28 64 62 2c 20  e3UpsertDup(db, 
6e30: 70 53 74 65 70 2d 3e 70 55 70 73 65 72 74 29 0a  pStep->pUpsert).
6e40: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
6e50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6e60: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
6e70: 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20 20 20  DELETE: {.      
6e80: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 46    sqlite3DeleteF
6e90: 72 6f 6d 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rom(pParse, .   
6ea0: 20 20 20 20 20 20 20 74 61 72 67 65 74 53 72 63         targetSrc
6eb0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 74  List(pParse, pSt
6ec0: 65 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ep),.          s
6ed0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6ee0: 2c 20 70 53 74 65 70 2d 3e 70 57 68 65 72 65 2c  , pStep->pWhere,
6ef0: 20 30 29 2c 20 30 2c 20 30 0a 20 20 20 20 20 20   0), 0, 0.      
6f00: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65    );.        bre
6f10: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6f20: 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
6f30: 74 28 20 70 53 74 65 70 2d 3e 6f 70 3d 3d 54 4b  t( pStep->op==TK
6f40: 5f 53 45 4c 45 43 54 20 29 3b 20 7b 0a 20 20 20  _SELECT ); {.   
6f50: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
6f60: 73 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20 53  sDest;.        S
6f70: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
6f80: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
6f90: 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 53 65  p(db, pStep->pSe
6fa0: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
6fb0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
6fc0: 65 73 74 49 6e 69 74 28 26 73 44 65 73 74 2c 20  estInit(&sDest, 
6fd0: 53 52 54 5f 44 69 73 63 61 72 64 2c 20 30 29 3b  SRT_Discard, 0);
6fe0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6ff0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
7000: 53 65 6c 65 63 74 2c 20 26 73 44 65 73 74 29 3b  Select, &sDest);
7010: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7020: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
7030: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20   pSelect);.     
7040: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7050: 7d 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28  }.    } .    if(
7060: 20 70 53 74 65 70 2d 3e 6f 70 21 3d 54 4b 5f 53   pStep->op!=TK_S
7070: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73  ELECT ){.      s
7080: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7090: 28 76 2c 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e  (v, OP_ResetCoun
70a0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
70b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
70c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
70d0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
70e0: 4e 54 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  NTS./*.** This f
70f0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
7100: 74 6f 20 61 64 64 20 56 64 62 65 43 6f 6d 6d 65  to add VdbeComme
7110: 6e 74 28 29 20 61 6e 6e 6f 74 61 74 69 6f 6e 73  nt() annotations
7120: 20 74 6f 20 61 20 56 44 42 45 0a 2a 2a 20 70 72   to a VDBE.** pr
7130: 6f 67 72 61 6d 2e 20 49 74 20 69 73 20 6e 6f 74  ogram. It is not
7140: 20 75 73 65 64 20 69 6e 20 70 72 6f 64 75 63 74   used in product
7150: 69 6f 6e 20 63 6f 64 65 2c 20 6f 6e 6c 79 20 66  ion code, only f
7160: 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f  or debugging..*/
7170: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7180: 61 72 20 2a 6f 6e 45 72 72 6f 72 54 65 78 74 28  ar *onErrorText(
7190: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
71a0: 73 77 69 74 63 68 28 20 6f 6e 45 72 72 6f 72 20  switch( onError 
71b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 41  ){.    case OE_A
71c0: 62 6f 72 74 3a 20 20 20 20 72 65 74 75 72 6e 20  bort:    return 
71d0: 22 61 62 6f 72 74 22 3b 0a 20 20 20 20 63 61 73  "abort";.    cas
71e0: 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 72  e OE_Rollback: r
71f0: 65 74 75 72 6e 20 22 72 6f 6c 6c 62 61 63 6b 22  eturn "rollback"
7200: 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61  ;.    case OE_Fa
7210: 69 6c 3a 20 20 20 20 20 72 65 74 75 72 6e 20 22  il:     return "
7220: 66 61 69 6c 22 3b 0a 20 20 20 20 63 61 73 65 20  fail";.    case 
7230: 4f 45 5f 52 65 70 6c 61 63 65 3a 20 20 72 65 74  OE_Replace:  ret
7240: 75 72 6e 20 22 72 65 70 6c 61 63 65 22 3b 0a 20  urn "replace";. 
7250: 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72     case OE_Ignor
7260: 65 3a 20 20 20 72 65 74 75 72 6e 20 22 69 67 6e  e:   return "ign
7270: 6f 72 65 22 3b 0a 20 20 20 20 63 61 73 65 20 4f  ore";.    case O
7280: 45 5f 44 65 66 61 75 6c 74 3a 20 20 72 65 74 75  E_Default:  retu
7290: 72 6e 20 22 64 65 66 61 75 6c 74 22 3b 0a 20 20  rn "default";.  
72a0: 7d 0a 20 20 72 65 74 75 72 6e 20 22 6e 2f 61 22  }.  return "n/a"
72b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
72c0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
72d0: 73 74 72 75 63 74 75 72 65 20 70 46 72 6f 6d 20  structure pFrom 
72e0: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 75 73  has just been us
72f0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 73  ed to create a s
7300: 75 62 2d 76 64 62 65 0a 2a 2a 20 28 74 72 69 67  ub-vdbe.** (trig
7310: 67 65 72 20 70 72 6f 67 72 61 6d 29 2e 20 49 66  ger program). If
7320: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
7330: 63 75 72 72 65 64 2c 20 74 72 61 6e 73 66 65 72  curred, transfer
7340: 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
7350: 6f 6e 0a 2a 2a 20 66 72 6f 6d 20 70 46 72 6f 6d  on.** from pFrom
7360: 20 74 6f 20 70 54 6f 2e 0a 2a 2f 0a 73 74 61 74   to pTo..*/.stat
7370: 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72  ic void transfer
7380: 50 61 72 73 65 45 72 72 6f 72 28 50 61 72 73 65  ParseError(Parse
7390: 20 2a 70 54 6f 2c 20 50 61 72 73 65 20 2a 70 46   *pTo, Parse *pF
73a0: 72 6f 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20  rom){.  assert( 
73b0: 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67 3d 3d  pFrom->zErrMsg==
73c0: 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 6e 45 72 72  0 || pFrom->nErr
73d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
73e0: 6f 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30 20 7c 7c  o->zErrMsg==0 ||
73f0: 20 70 54 6f 2d 3e 6e 45 72 72 20 29 3b 0a 20 20   pTo->nErr );.  
7400: 69 66 28 20 70 54 6f 2d 3e 6e 45 72 72 3d 3d 30  if( pTo->nErr==0
7410: 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 45 72   ){.    pTo->zEr
7420: 72 4d 73 67 20 3d 20 70 46 72 6f 6d 2d 3e 7a 45  rMsg = pFrom->zE
7430: 72 72 4d 73 67 3b 0a 20 20 20 20 70 54 6f 2d 3e  rrMsg;.    pTo->
7440: 6e 45 72 72 20 3d 20 70 46 72 6f 6d 2d 3e 6e 45  nErr = pFrom->nE
7450: 72 72 3b 0a 20 20 20 20 70 54 6f 2d 3e 72 63 20  rr;.    pTo->rc 
7460: 3d 20 70 46 72 6f 6d 2d 3e 72 63 3b 0a 20 20 7d  = pFrom->rc;.  }
7470: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
7480: 33 44 62 46 72 65 65 28 70 46 72 6f 6d 2d 3e 64  3DbFree(pFrom->d
7490: 62 2c 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73  b, pFrom->zErrMs
74a0: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
74b0: 20 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70 75   Create and popu
74c0: 6c 61 74 65 20 61 20 6e 65 77 20 54 72 69 67 67  late a new Trigg
74d0: 65 72 50 72 67 20 6f 62 6a 65 63 74 20 77 69 74  erPrg object wit
74e0: 68 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  h a sub-program 
74f0: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  .** implementing
7500: 20 74 72 69 67 67 65 72 20 70 54 72 69 67 67 65   trigger pTrigge
7510: 72 20 77 69 74 68 20 4f 4e 20 43 4f 4e 46 4c 49  r with ON CONFLI
7520: 43 54 20 70 6f 6c 69 63 79 20 6f 72 63 6f 6e 66  CT policy orconf
7530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67  ..*/.static Trig
7540: 67 65 72 50 72 67 20 2a 63 6f 64 65 52 6f 77 54  gerPrg *codeRowT
7550: 72 69 67 67 65 72 28 0a 20 20 50 61 72 73 65 20  rigger(.  Parse 
7560: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
7570: 2a 20 43 75 72 72 65 6e 74 20 70 61 72 73 65 20  * Current parse 
7580: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69  context */.  Tri
7590: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20  gger *pTrigger, 
75a0: 20 20 2f 2a 20 54 72 69 67 67 65 72 20 74 6f 20    /* Trigger to 
75b0: 63 6f 64 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  code */.  Table 
75c0: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  *pTab,         /
75d0: 2a 20 54 68 65 20 74 61 62 6c 65 20 70 54 72 69  * The table pTri
75e0: 67 67 65 72 20 69 73 20 61 74 74 61 63 68 65 64  gger is attached
75f0: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63   to */.  int orc
7600: 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a  onf           /*
7610: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c   ON CONFLICT pol
7620: 69 63 79 20 74 6f 20 63 6f 64 65 20 74 72 69 67  icy to code trig
7630: 67 65 72 20 70 72 6f 67 72 61 6d 20 77 69 74 68  ger program with
7640: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
7650: 70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 50 61  pTop = sqlite3Pa
7660: 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
7670: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se);.  sqlite3 *
7680: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7690: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
76a0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 72 69 67 67  andle */.  Trigg
76b0: 65 72 50 72 67 20 2a 70 50 72 67 3b 20 20 20 20  erPrg *pPrg;    
76c0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
76d0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 45  to return */.  E
76e0: 78 70 72 20 2a 70 57 68 65 6e 20 3d 20 30 3b 20  xpr *pWhen = 0; 
76f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
7700: 70 6c 69 63 61 74 65 20 6f 66 20 74 72 69 67 67  plicate of trigg
7710: 65 72 20 57 48 45 4e 20 65 78 70 72 65 73 73 69  er WHEN expressi
7720: 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  on */.  Vdbe *v;
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
7750: 20 56 4d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e   VM */.  NameCon
7760: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
7770: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
7780: 74 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64 62  text for sub-vdb
7790: 65 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  e */.  SubProgra
77a0: 6d 20 2a 70 50 72 6f 67 72 61 6d 20 3d 20 30 3b  m *pProgram = 0;
77b0: 20 20 20 2f 2a 20 53 75 62 2d 76 64 62 65 20 66     /* Sub-vdbe f
77c0: 6f 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  or trigger progr
77d0: 61 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  am */.  Parse *p
77e0: 53 75 62 50 61 72 73 65 3b 20 20 20 20 20 20 20  SubParse;       
77f0: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
7800: 74 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64 62  text for sub-vdb
7810: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 54  e */.  int iEndT
7820: 72 69 67 67 65 72 20 3d 20 30 3b 20 20 20 20 20  rigger = 0;     
7830: 20 20 20 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 6a     /* Label to j
7840: 75 6d 70 20 74 6f 20 69 66 20 57 48 45 4e 20 69  ump to if WHEN i
7850: 73 20 66 61 6c 73 65 20 2a 2f 0a 0a 20 20 61 73  s false */..  as
7860: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e  sert( pTrigger->
7870: 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 54 61 62  zName==0 || pTab
7880: 3d 3d 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72  ==tableOfTrigger
7890: 28 70 54 72 69 67 67 65 72 29 20 29 3b 0a 20 20  (pTrigger) );.  
78a0: 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 70 56  assert( pTop->pV
78b0: 64 62 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  dbe );..  /* All
78c0: 6f 63 61 74 65 20 74 68 65 20 54 72 69 67 67 65  ocate the Trigge
78d0: 72 50 72 67 20 61 6e 64 20 53 75 62 50 72 6f 67  rPrg and SubProg
78e0: 72 61 6d 20 6f 62 6a 65 63 74 73 2e 20 54 6f 20  ram objects. To 
78f0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 79  ensure that they
7900: 0a 20 20 2a 2a 20 61 72 65 20 66 72 65 65 64 20  .  ** are freed 
7910: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
7920: 72 73 2c 20 6c 69 6e 6b 20 74 68 65 6d 20 69 6e  rs, link them in
7930: 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 54 72  to the Parse.pTr
7940: 69 67 67 65 72 50 72 67 20 0a 20 20 2a 2a 20 6c  iggerPrg .  ** l
7950: 69 73 74 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  ist of the top-l
7960: 65 76 65 6c 20 50 61 72 73 65 20 6f 62 6a 65 63  evel Parse objec
7970: 74 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  t sooner rather 
7980: 74 68 61 6e 20 6c 61 74 65 72 2e 20 20 2a 2f 0a  than later.  */.
7990: 20 20 70 50 72 67 20 3d 20 73 71 6c 69 74 65 33    pPrg = sqlite3
79a0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
79b0: 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 50   sizeof(TriggerP
79c0: 72 67 29 29 3b 0a 20 20 69 66 28 20 21 70 50 72  rg));.  if( !pPr
79d0: 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  g ) return 0;.  
79e0: 70 50 72 67 2d 3e 70 4e 65 78 74 20 3d 20 70 54  pPrg->pNext = pT
79f0: 6f 70 2d 3e 70 54 72 69 67 67 65 72 50 72 67 3b  op->pTriggerPrg;
7a00: 0a 20 20 70 54 6f 70 2d 3e 70 54 72 69 67 67 65  .  pTop->pTrigge
7a10: 72 50 72 67 20 3d 20 70 50 72 67 3b 0a 20 20 70  rPrg = pPrg;.  p
7a20: 50 72 67 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20  Prg->pProgram = 
7a30: 70 50 72 6f 67 72 61 6d 20 3d 20 73 71 6c 69 74  pProgram = sqlit
7a40: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
7a50: 62 2c 20 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  b, sizeof(SubPro
7a60: 67 72 61 6d 29 29 3b 0a 20 20 69 66 28 20 21 70  gram));.  if( !p
7a70: 50 72 6f 67 72 61 6d 20 29 20 72 65 74 75 72 6e  Program ) return
7a80: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   0;.  sqlite3Vdb
7a90: 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28  eLinkSubProgram(
7aa0: 70 54 6f 70 2d 3e 70 56 64 62 65 2c 20 70 50 72  pTop->pVdbe, pPr
7ab0: 6f 67 72 61 6d 29 3b 0a 20 20 70 50 72 67 2d 3e  ogram);.  pPrg->
7ac0: 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
7ad0: 67 65 72 3b 0a 20 20 70 50 72 67 2d 3e 6f 72 63  ger;.  pPrg->orc
7ae0: 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20  onf = orconf;.  
7af0: 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b 30  pPrg->aColmask[0
7b00: 5d 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  ] = 0xffffffff;.
7b10: 20 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b    pPrg->aColmask
7b20: 5b 31 5d 20 3d 20 30 78 66 66 66 66 66 66 66 66  [1] = 0xffffffff
7b30: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
7b40: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 20   and populate a 
7b50: 6e 65 77 20 50 61 72 73 65 20 63 6f 6e 74 65 78  new Parse contex
7b60: 74 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f 64  t to use for cod
7b70: 69 6e 67 20 74 68 65 20 0a 20 20 2a 2a 20 74 72  ing the .  ** tr
7b80: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
7b90: 6d 2e 20 20 2a 2f 0a 20 20 70 53 75 62 50 61 72  m.  */.  pSubPar
7ba0: 73 65 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  se = sqlite3Stac
7bb0: 6b 41 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  kAllocZero(db, s
7bc0: 69 7a 65 6f 66 28 50 61 72 73 65 29 29 3b 0a 20  izeof(Parse));. 
7bd0: 20 69 66 28 20 21 70 53 75 62 50 61 72 73 65 20   if( !pSubParse 
7be0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65  ) return 0;.  me
7bf0: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
7c00: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
7c10: 43 2e 70 50 61 72 73 65 20 3d 20 70 53 75 62 50  C.pParse = pSubP
7c20: 61 72 73 65 3b 0a 20 20 70 53 75 62 50 61 72 73  arse;.  pSubPars
7c30: 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 53  e->db = db;.  pS
7c40: 75 62 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65  ubParse->pTrigge
7c50: 72 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 70  rTab = pTab;.  p
7c60: 53 75 62 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  SubParse->pTople
7c70: 76 65 6c 20 3d 20 70 54 6f 70 3b 0a 20 20 70 53  vel = pTop;.  pS
7c80: 75 62 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f  ubParse->zAuthCo
7c90: 6e 74 65 78 74 20 3d 20 70 54 72 69 67 67 65 72  ntext = pTrigger
7ca0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 70 53 75 62 50  ->zName;.  pSubP
7cb0: 61 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f 70  arse->eTriggerOp
7cc0: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 3b   = pTrigger->op;
7cd0: 0a 20 20 70 53 75 62 50 61 72 73 65 2d 3e 6e 51  .  pSubParse->nQ
7ce0: 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
7cf0: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
7d00: 20 70 53 75 62 50 61 72 73 65 2d 3e 64 69 73 61   pSubParse->disa
7d10: 62 6c 65 56 74 61 62 20 3d 20 70 50 61 72 73 65  bleVtab = pParse
7d20: 2d 3e 64 69 73 61 62 6c 65 56 74 61 62 3b 0a 0a  ->disableVtab;..
7d30: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
7d40: 56 64 62 65 28 70 53 75 62 50 61 72 73 65 29 3b  Vdbe(pSubParse);
7d50: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
7d60: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
7d70: 22 53 74 61 72 74 3a 20 25 73 2e 25 73 20 28 25  "Start: %s.%s (%
7d80: 73 20 25 73 25 73 25 73 20 4f 4e 20 25 73 29 22  s %s%s%s ON %s)"
7d90: 2c 20 0a 20 20 20 20 20 20 70 54 72 69 67 67 65  , .      pTrigge
7da0: 72 2d 3e 7a 4e 61 6d 65 2c 20 6f 6e 45 72 72 6f  r->zName, onErro
7db0: 72 54 65 78 74 28 6f 72 63 6f 6e 66 29 2c 0a 20  rText(orconf),. 
7dc0: 20 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e       (pTrigger->
7dd0: 74 72 5f 74 6d 3d 3d 54 52 49 47 47 45 52 5f 42  tr_tm==TRIGGER_B
7de0: 45 46 4f 52 45 20 3f 20 22 42 45 46 4f 52 45 22  EFORE ? "BEFORE"
7df0: 20 3a 20 22 41 46 54 45 52 22 29 2c 0a 20 20 20   : "AFTER"),.   
7e00: 20 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e       (pTrigger->
7e10: 6f 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 3f 20  op==TK_UPDATE ? 
7e20: 22 55 50 44 41 54 45 22 20 3a 20 22 22 29 2c 0a  "UPDATE" : ""),.
7e30: 20 20 20 20 20 20 20 20 28 70 54 72 69 67 67 65          (pTrigge
7e40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54  r->op==TK_INSERT
7e50: 20 3f 20 22 49 4e 53 45 52 54 22 20 3a 20 22 22   ? "INSERT" : ""
7e60: 29 2c 0a 20 20 20 20 20 20 20 20 28 70 54 72 69  ),.        (pTri
7e70: 67 67 65 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 45 4c  gger->op==TK_DEL
7e80: 45 54 45 20 3f 20 22 44 45 4c 45 54 45 22 20 3a  ETE ? "DELETE" :
7e90: 20 22 22 29 2c 0a 20 20 20 20 20 20 70 54 61 62   ""),.      pTab
7ea0: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
7eb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7ec0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66  MIT_TRACE.    if
7ed0: 28 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d  ( pTrigger->zNam
7ee0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
7ef0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
7f00: 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 73  , -1, .        s
7f10: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
7f20: 2c 20 22 2d 2d 20 54 52 49 47 47 45 52 20 25 73  , "-- TRIGGER %s
7f30: 22 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61  ", pTrigger->zNa
7f40: 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  me), P4_DYNAMIC.
7f50: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
7f60: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
7f70: 20 6f 6e 65 20 77 61 73 20 73 70 65 63 69 66 69   one was specifi
7f80: 65 64 2c 20 63 6f 64 65 20 74 68 65 20 57 48 45  ed, code the WHE
7f90: 4e 20 63 6c 61 75 73 65 2e 20 49 66 20 69 74 20  N clause. If it 
7fa0: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 66 61 6c  evaluates to fal
7fb0: 73 65 0a 20 20 20 20 2a 2a 20 28 6f 72 20 4e 55  se.    ** (or NU
7fc0: 4c 4c 29 20 74 68 65 20 73 75 62 2d 76 64 62 65  LL) the sub-vdbe
7fd0: 20 69 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   is immediately 
7fe0: 68 61 6c 74 65 64 20 62 79 20 6a 75 6d 70 69 6e  halted by jumpin
7ff0: 67 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  g to the .    **
8000: 20 4f 50 5f 48 61 6c 74 20 69 6e 73 65 72 74 65   OP_Halt inserte
8010: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
8020: 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 2a 2f  the program.  */
8030: 0a 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65  .    if( pTrigge
8040: 72 2d 3e 70 57 68 65 6e 20 29 7b 0a 20 20 20 20  r->pWhen ){.    
8050: 20 20 70 57 68 65 6e 20 3d 20 73 71 6c 69 74 65    pWhen = sqlite
8060: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 54 72  3ExprDup(db, pTr
8070: 69 67 67 65 72 2d 3e 70 57 68 65 6e 2c 20 30 29  igger->pWhen, 0)
8080: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
8090: 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 52 65  TE_OK==sqlite3Re
80a0: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26  solveExprNames(&
80b0: 73 4e 43 2c 20 70 57 68 65 6e 29 20 0a 20 20 20  sNC, pWhen) .   
80c0: 20 20 20 20 26 26 20 64 62 2d 3e 6d 61 6c 6c 6f      && db->mallo
80d0: 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20  cFailed==0 .    
80e0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 45 6e    ){.        iEn
80f0: 64 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  dTrigger = sqlit
8100: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
8110: 70 53 75 62 50 61 72 73 65 29 3b 0a 20 20 20 20  pSubParse);.    
8120: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
8130: 66 46 61 6c 73 65 28 70 53 75 62 50 61 72 73 65  fFalse(pSubParse
8140: 2c 20 70 57 68 65 6e 2c 20 69 45 6e 64 54 72 69  , pWhen, iEndTri
8150: 67 67 65 72 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  gger, SQLITE_JUM
8160: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
8170: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
8180: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57  xprDelete(db, pW
8190: 68 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  hen);.    }..   
81a0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 74 72 69   /* Code the tri
81b0: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 69 6e 74  gger program int
81c0: 6f 20 74 68 65 20 73 75 62 2d 76 64 62 65 2e 20  o the sub-vdbe. 
81d0: 2a 2f 0a 20 20 20 20 63 6f 64 65 54 72 69 67 67  */.    codeTrigg
81e0: 65 72 50 72 6f 67 72 61 6d 28 70 53 75 62 50 61  erProgram(pSubPa
81f0: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 73  rse, pTrigger->s
8200: 74 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e 66  tep_list, orconf
8210: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
8220: 74 20 61 6e 20 4f 50 5f 48 61 6c 74 20 61 74 20  t an OP_Halt at 
8230: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
8240: 75 62 2d 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20  ub-program. */. 
8250: 20 20 20 69 66 28 20 69 45 6e 64 54 72 69 67 67     if( iEndTrigg
8260: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
8270: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
8280: 62 65 6c 28 76 2c 20 69 45 6e 64 54 72 69 67 67  bel(v, iEndTrigg
8290: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
82a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
82b0: 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 20 20  (v, OP_Halt);.  
82c0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
82d0: 2c 20 22 45 6e 64 3a 20 25 73 2e 25 73 22 2c 20  , "End: %s.%s", 
82e0: 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 2c  pTrigger->zName,
82f0: 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72 63   onErrorText(orc
8300: 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 74 72 61  onf)));..    tra
8310: 6e 73 66 65 72 50 61 72 73 65 45 72 72 6f 72 28  nsferParseError(
8320: 70 50 61 72 73 65 2c 20 70 53 75 62 50 61 72 73  pParse, pSubPars
8330: 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  e);.    if( db->
8340: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
8350: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
8360: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 72 6f  =0 ){.      pPro
8370: 67 72 61 6d 2d 3e 61 4f 70 20 3d 20 73 71 6c 69  gram->aOp = sqli
8380: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
8390: 61 79 28 76 2c 20 26 70 50 72 6f 67 72 61 6d 2d  ay(v, &pProgram-
83a0: 3e 6e 4f 70 2c 20 26 70 54 6f 70 2d 3e 6e 4d 61  >nOp, &pTop->nMa
83b0: 78 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xArg);.    }.   
83c0: 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20   pProgram->nMem 
83d0: 3d 20 70 53 75 62 50 61 72 73 65 2d 3e 6e 4d 65  = pSubParse->nMe
83e0: 6d 3b 0a 20 20 20 20 70 50 72 6f 67 72 61 6d 2d  m;.    pProgram-
83f0: 3e 6e 43 73 72 20 3d 20 70 53 75 62 50 61 72 73  >nCsr = pSubPars
8400: 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 70 50 72  e->nTab;.    pPr
8410: 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 20 3d 20 28  ogram->token = (
8420: 76 6f 69 64 20 2a 29 70 54 72 69 67 67 65 72 3b  void *)pTrigger;
8430: 0a 20 20 20 20 70 50 72 67 2d 3e 61 43 6f 6c 6d  .    pPrg->aColm
8440: 61 73 6b 5b 30 5d 20 3d 20 70 53 75 62 50 61 72  ask[0] = pSubPar
8450: 73 65 2d 3e 6f 6c 64 6d 61 73 6b 3b 0a 20 20 20  se->oldmask;.   
8460: 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b   pPrg->aColmask[
8470: 31 5d 20 3d 20 70 53 75 62 50 61 72 73 65 2d 3e  1] = pSubParse->
8480: 6e 65 77 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c  newmask;.    sql
8490: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 76  ite3VdbeDelete(v
84a0: 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
84b0: 28 20 21 70 53 75 62 50 61 72 73 65 2d 3e 70 41  ( !pSubParse->pA
84c0: 69 6e 63 20 20 20 20 20 20 20 26 26 20 21 70 53  inc       && !pS
84d0: 75 62 50 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65  ubParse->pZombie
84e0: 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Tab );.  assert(
84f0: 20 21 70 53 75 62 50 61 72 73 65 2d 3e 70 54 72   !pSubParse->pTr
8500: 69 67 67 65 72 50 72 67 20 26 26 20 21 70 53 75  iggerPrg && !pSu
8510: 62 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 20  bParse->nMaxArg 
8520: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 72 73  );.  sqlite3Pars
8530: 65 72 52 65 73 65 74 28 70 53 75 62 50 61 72 73  erReset(pSubPars
8540: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 61  e);.  sqlite3Sta
8550: 63 6b 46 72 65 65 28 64 62 2c 20 70 53 75 62 50  ckFree(db, pSubP
8560: 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e  arse);..  return
8570: 20 70 50 72 67 3b 0a 7d 0a 20 20 20 20 0a 2f 2a   pPrg;.}.    ./*
8580: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
8590: 6e 74 65 72 20 74 6f 20 61 20 54 72 69 67 67 65  nter to a Trigge
85a0: 72 50 72 67 20 6f 62 6a 65 63 74 20 63 6f 6e 74  rPrg object cont
85b0: 61 69 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 70  aining the sub-p
85c0: 72 6f 67 72 61 6d 20 66 6f 72 0a 2a 2a 20 74 72  rogram for.** tr
85d0: 69 67 67 65 72 20 70 54 72 69 67 67 65 72 20 77  igger pTrigger w
85e0: 69 74 68 20 64 65 66 61 75 6c 74 20 4f 4e 20 43  ith default ON C
85f0: 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72 69 74 68  ONFLICT algorith
8600: 6d 20 6f 72 63 6f 6e 66 2e 20 49 66 20 6e 6f 20  m orconf. If no 
8610: 73 75 63 68 0a 2a 2a 20 54 72 69 67 67 65 72 50  such.** TriggerP
8620: 72 67 20 6f 62 6a 65 63 74 20 65 78 69 73 74 73  rg object exists
8630: 2c 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  , a new object i
8640: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
8650: 70 6f 70 75 6c 61 74 65 64 20 62 65 66 6f 72 65  populated before
8660: 0a 2a 2a 20 62 65 69 6e 67 20 72 65 74 75 72 6e  .** being return
8670: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72  ed..*/.static Tr
8680: 69 67 67 65 72 50 72 67 20 2a 67 65 74 52 6f 77  iggerPrg *getRow
8690: 54 72 69 67 67 65 72 28 0a 20 20 50 61 72 73 65  Trigger(.  Parse
86a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
86b0: 2f 2a 20 43 75 72 72 65 6e 74 20 70 61 72 73 65  /* Current parse
86c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72   context */.  Tr
86d0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c  igger *pTrigger,
86e0: 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 74 6f     /* Trigger to
86f0: 20 63 6f 64 65 20 2a 2f 0a 20 20 54 61 62 6c 65   code */.  Table
8700: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
8710: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 72 69  /* The table tri
8720: 67 67 65 72 20 70 54 72 69 67 67 65 72 20 69 73  gger pTrigger is
8730: 20 61 74 74 61 63 68 65 64 20 74 6f 20 2a 2f 0a   attached to */.
8740: 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20    int orconf    
8750: 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e         /* ON CON
8760: 46 4c 49 43 54 20 61 6c 67 6f 72 69 74 68 6d 2e  FLICT algorithm.
8770: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
8780: 70 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 50  pRoot = sqlite3P
8790: 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
87a0: 72 73 65 29 3b 0a 20 20 54 72 69 67 67 65 72 50  rse);.  TriggerP
87b0: 72 67 20 2a 70 50 72 67 3b 0a 0a 20 20 61 73 73  rg *pPrg;..  ass
87c0: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 7a  ert( pTrigger->z
87d0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 54 61 62 3d  Name==0 || pTab=
87e0: 3d 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28  =tableOfTrigger(
87f0: 70 54 72 69 67 67 65 72 29 20 29 3b 0a 0a 20 20  pTrigger) );..  
8800: 2f 2a 20 49 74 20 6d 61 79 20 62 65 20 74 68 61  /* It may be tha
8810: 74 20 74 68 69 73 20 74 72 69 67 67 65 72 20 68  t this trigger h
8820: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
8830: 63 6f 64 65 64 20 28 6f 72 20 69 73 20 69 6e 20  coded (or is in 
8840: 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  the.  ** process
8850: 20 6f 66 20 62 65 69 6e 67 20 63 6f 64 65 64 29   of being coded)
8860: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
8870: 20 63 61 73 65 2c 20 74 68 65 6e 20 61 6e 20 65   case, then an e
8880: 6e 74 72 79 20 77 69 74 68 0a 20 20 2a 2a 20 61  ntry with.  ** a
8890: 20 6d 61 74 63 68 69 6e 67 20 54 72 69 67 67 65   matching Trigge
88a0: 72 50 72 67 2e 70 54 72 69 67 67 65 72 20 66 69  rPrg.pTrigger fi
88b0: 65 6c 64 20 77 69 6c 6c 20 62 65 20 70 72 65 73  eld will be pres
88c0: 65 6e 74 20 73 6f 6d 65 77 68 65 72 65 0a 20 20  ent somewhere.  
88d0: 2a 2a 20 69 6e 20 74 68 65 20 50 61 72 73 65 2e  ** in the Parse.
88e0: 70 54 72 69 67 67 65 72 50 72 67 20 6c 69 73 74  pTriggerPrg list
88f0: 2e 20 53 65 61 72 63 68 20 66 6f 72 20 73 75 63  . Search for suc
8900: 68 20 61 6e 20 65 6e 74 72 79 2e 20 20 2a 2f 0a  h an entry.  */.
8910: 20 20 66 6f 72 28 70 50 72 67 3d 70 52 6f 6f 74    for(pPrg=pRoot
8920: 2d 3e 70 54 72 69 67 67 65 72 50 72 67 3b 20 0a  ->pTriggerPrg; .
8930: 20 20 20 20 20 20 70 50 72 67 20 26 26 20 28 70        pPrg && (p
8940: 50 72 67 2d 3e 70 54 72 69 67 67 65 72 21 3d 70  Prg->pTrigger!=p
8950: 54 72 69 67 67 65 72 20 7c 7c 20 70 50 72 67 2d  Trigger || pPrg-
8960: 3e 6f 72 63 6f 6e 66 21 3d 6f 72 63 6f 6e 66 29  >orconf!=orconf)
8970: 3b 20 0a 20 20 20 20 20 20 70 50 72 67 3d 70 50  ; .      pPrg=pP
8980: 72 67 2d 3e 70 4e 65 78 74 0a 20 20 29 3b 0a 0a  rg->pNext.  );..
8990: 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 69 73 74    /* If an exist
89a0: 69 6e 67 20 54 72 69 67 67 65 72 50 72 67 20 63  ing TriggerPrg c
89b0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6c 6f 63 61  ould not be loca
89c0: 74 65 64 2c 20 63 72 65 61 74 65 20 61 20 6e 65  ted, create a ne
89d0: 77 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 28 20  w one. */.  if( 
89e0: 21 70 50 72 67 20 29 7b 0a 20 20 20 20 70 50 72  !pPrg ){.    pPr
89f0: 67 20 3d 20 63 6f 64 65 52 6f 77 54 72 69 67 67  g = codeRowTrigg
8a00: 65 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  er(pParse, pTrig
8a10: 67 65 72 2c 20 70 54 61 62 2c 20 6f 72 63 6f 6e  ger, pTab, orcon
8a20: 66 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  f);.  }..  retur
8a30: 6e 20 70 50 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pPrg;.}../*.**
8a40: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
8a50: 6f 72 20 74 68 65 20 74 72 69 67 67 65 72 20 70  or the trigger p
8a60: 72 6f 67 72 61 6d 20 61 73 73 6f 63 69 61 74 65  rogram associate
8a70: 64 20 77 69 74 68 20 74 72 69 67 67 65 72 20 70  d with trigger p
8a80: 20 6f 6e 20 0a 2a 2a 20 74 61 62 6c 65 20 70 54   on .** table pT
8a90: 61 62 2e 20 54 68 65 20 72 65 67 2c 20 6f 72 63  ab. The reg, orc
8aa0: 6f 6e 66 20 61 6e 64 20 69 67 6e 6f 72 65 4a 75  onf and ignoreJu
8ab0: 6d 70 20 70 61 72 61 6d 65 74 65 72 73 20 70 61  mp parameters pa
8ac0: 73 73 65 64 20 74 6f 20 74 68 69 73 0a 2a 2a 20  ssed to this.** 
8ad0: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
8ae0: 20 73 61 6d 65 20 61 73 20 74 68 6f 73 65 20 64   same as those d
8af0: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
8b00: 68 65 61 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  header function 
8b10: 66 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 33 43 6f  for.** sqlite3Co
8b20: 64 65 52 6f 77 54 72 69 67 67 65 72 28 29 0a 2a  deRowTrigger().*
8b30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
8b40: 64 65 52 6f 77 54 72 69 67 67 65 72 44 69 72 65  deRowTriggerDire
8b50: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
8b60: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
8b70: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
8b80: 20 54 72 69 67 67 65 72 20 2a 70 2c 20 20 20 20   Trigger *p,    
8b90: 20 20 20 20 20 20 2f 2a 20 54 72 69 67 67 65 72        /* Trigger
8ba0: 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 54 61   to code */.  Ta
8bb0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
8bc0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
8bd0: 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 73  to code triggers
8be0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 72   from */.  int r
8bf0: 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eg,             
8c00: 2f 2a 20 52 65 67 20 61 72 72 61 79 20 63 6f 6e  /* Reg array con
8c10: 74 61 69 6e 69 6e 67 20 4f 4c 44 2e 2a 20 61 6e  taining OLD.* an
8c20: 64 20 4e 45 57 2e 2a 20 76 61 6c 75 65 73 20 2a  d NEW.* values *
8c30: 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 2c 20  /.  int orconf, 
8c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43           /* ON C
8c50: 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 2a  ONFLICT policy *
8c60: 2f 0a 20 20 69 6e 74 20 69 67 6e 6f 72 65 4a 75  /.  int ignoreJu
8c70: 6d 70 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74  mp       /* Inst
8c80: 72 75 63 74 69 6f 6e 20 74 6f 20 6a 75 6d 70 20  ruction to jump 
8c90: 74 6f 20 66 6f 72 20 52 41 49 53 45 28 49 47 4e  to for RAISE(IGN
8ca0: 4f 52 45 29 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ORE) */.){.  Vdb
8cb0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
8cc0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 2f  tVdbe(pParse); /
8cd0: 2a 20 4d 61 69 6e 20 56 4d 20 2a 2f 0a 20 20 54  * Main VM */.  T
8ce0: 72 69 67 67 65 72 50 72 67 20 2a 70 50 72 67 3b  riggerPrg *pPrg;
8cf0: 0a 20 20 70 50 72 67 20 3d 20 67 65 74 52 6f 77  .  pPrg = getRow
8d00: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20  Trigger(pParse, 
8d10: 70 2c 20 70 54 61 62 2c 20 6f 72 63 6f 6e 66 29  p, pTab, orconf)
8d20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 67  ;.  assert( pPrg
8d30: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
8d40: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
8d50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
8d60: 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f  .  /* Code the O
8d70: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
8d80: 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 56   in the parent V
8d90: 44 42 45 2e 20 50 34 20 6f 66 20 74 68 65 20 4f  DBE. P4 of the O
8da0: 50 5f 50 72 6f 67 72 61 6d 20 0a 20 20 2a 2a 20  P_Program .  ** 
8db0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
8dc0: 74 68 65 20 73 75 62 2d 76 64 62 65 20 63 6f 6e  the sub-vdbe con
8dd0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 72 69 67  taining the trig
8de0: 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 20 2a 2f  ger program.  */
8df0: 0a 20 20 69 66 28 20 70 50 72 67 20 29 7b 0a 20  .  if( pPrg ){. 
8e00: 20 20 20 69 6e 74 20 62 52 65 63 75 72 73 69 76     int bRecursiv
8e10: 65 20 3d 20 28 70 2d 3e 7a 4e 61 6d 65 20 26 26  e = (p->zName &&
8e20: 20 30 3d 3d 28 70 50 61 72 73 65 2d 3e 64 62 2d   0==(pParse->db-
8e30: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
8e40: 63 54 72 69 67 67 65 72 73 29 29 3b 0a 0a 20 20  cTriggers));..  
8e50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8e60: 4f 70 34 28 76 2c 20 4f 50 5f 50 72 6f 67 72 61  Op4(v, OP_Progra
8e70: 6d 2c 20 72 65 67 2c 20 69 67 6e 6f 72 65 4a 75  m, reg, ignoreJu
8e80: 6d 70 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  mp, ++pParse->nM
8e90: 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  em,.            
8ea0: 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74            (const
8eb0: 20 63 68 61 72 20 2a 29 70 50 72 67 2d 3e 70 50   char *)pPrg->pP
8ec0: 72 6f 67 72 61 6d 2c 20 50 34 5f 53 55 42 50 52  rogram, P4_SUBPR
8ed0: 4f 47 52 41 4d 29 3b 0a 20 20 20 20 56 64 62 65  OGRAM);.    Vdbe
8ee0: 43 6f 6d 6d 65 6e 74 28 0a 20 20 20 20 20 20 20  Comment(.       
8ef0: 20 28 76 2c 20 22 43 61 6c 6c 3a 20 25 73 2e 25   (v, "Call: %s.%
8f00: 73 22 2c 20 28 70 2d 3e 7a 4e 61 6d 65 3f 70 2d  s", (p->zName?p-
8f10: 3e 7a 4e 61 6d 65 3a 22 66 6b 65 79 22 29 2c 20  >zName:"fkey"), 
8f20: 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72 63 6f  onErrorText(orco
8f30: 6e 66 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  nf)));..    /* S
8f40: 65 74 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e  et the P5 operan
8f50: 64 20 6f 66 20 74 68 65 20 4f 50 5f 50 72 6f 67  d of the OP_Prog
8f60: 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ram instruction 
8f70: 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 20  to non-zero if. 
8f80: 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20     ** recursive 
8f90: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
8fa0: 69 73 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  is trigger progr
8fb0: 61 6d 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  am is disallowed
8fc0: 2e 20 52 65 63 75 72 73 69 76 65 0a 20 20 20 20  . Recursive.    
8fd0: 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 69 73  ** invocation is
8fe0: 20 64 69 73 61 6c 6c 6f 77 65 64 20 69 66 20 28   disallowed if (
8ff0: 61 29 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  a) the sub-progr
9000: 61 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 74  am is really a t
9010: 72 69 67 67 65 72 2c 0a 20 20 20 20 2a 2a 20 6e  rigger,.    ** n
9020: 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  ot a foreign key
9030: 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 28 62 29   action, and (b)
9040: 20 74 68 65 20 66 6c 61 67 20 74 6f 20 65 6e 61   the flag to ena
9050: 62 6c 65 20 72 65 63 75 72 73 69 76 65 20 74 72  ble recursive tr
9060: 69 67 67 65 72 73 0a 20 20 20 20 2a 2a 20 69 73  iggers.    ** is
9070: 20 63 6c 65 61 72 2e 20 20 2a 2f 0a 20 20 20 20   clear.  */.    
9080: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
9090: 65 50 35 28 76 2c 20 28 75 38 29 62 52 65 63 75  eP5(v, (u8)bRecu
90a0: 72 73 69 76 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rsive);.  }.}../
90b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
90c0: 6c 65 64 20 74 6f 20 63 6f 64 65 20 74 68 65 20  led to code the 
90d0: 72 65 71 75 69 72 65 64 20 46 4f 52 20 45 41 43  required FOR EAC
90e0: 48 20 52 4f 57 20 74 72 69 67 67 65 72 73 20 66  H ROW triggers f
90f0: 6f 72 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a  or an operation.
9100: 2a 2a 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62  ** on table pTab
9110: 2e 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  . The operation 
9120: 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 73  to code triggers
9130: 20 66 6f 72 20 28 49 4e 53 45 52 54 2c 20 55 50   for (INSERT, UP
9140: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 29 0a  DATE or DELETE).
9150: 2a 2a 20 69 73 20 67 69 76 65 6e 20 62 79 20 74  ** is given by t
9160: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
9170: 20 54 68 65 20 74 72 5f 74 6d 20 70 61 72 61 6d   The tr_tm param
9180: 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
9190: 77 68 65 74 68 65 72 20 74 68 65 0a 2a 2a 20 42  whether the.** B
91a0: 45 46 4f 52 45 20 6f 72 20 41 46 54 45 52 20 74  EFORE or AFTER t
91b0: 72 69 67 67 65 72 73 20 61 72 65 20 63 6f 64 65  riggers are code
91c0: 64 2e 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  d. If the operat
91d0: 69 6f 6e 20 69 73 20 61 6e 20 55 50 44 41 54 45  ion is an UPDATE
91e0: 2c 20 74 68 65 6e 0a 2a 2a 20 70 61 72 61 6d 65  , then.** parame
91f0: 74 65 72 20 70 43 68 61 6e 67 65 73 20 69 73 20  ter pChanges is 
9200: 70 61 73 73 65 64 20 74 68 65 20 6c 69 73 74 20  passed the list 
9210: 6f 66 20 63 6f 6c 75 6d 6e 73 20 62 65 69 6e 67  of columns being
9220: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
9230: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
9240: 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20 66   triggers that f
9250: 69 72 65 20 61 74 20 74 68 65 20 73 70 65 63 69  ire at the speci
9260: 66 69 65 64 20 74 69 6d 65 20 66 6f 72 20 74 68  fied time for th
9270: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 6f  e specified.** o
9280: 70 65 72 61 74 69 6f 6e 20 6f 6e 20 70 54 61 62  peration on pTab
9290: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
92a0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
92b0: 2a 20 54 68 65 20 72 65 67 20 61 72 67 75 6d 65  * The reg argume
92c0: 6e 74 20 69 73 20 74 68 65 20 61 64 64 72 65 73  nt is the addres
92d0: 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 69  s of the first i
92e0: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
92f0: 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74  gisters .** that
9300: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 76 61 6c   contain the val
9310: 75 65 73 20 73 75 62 73 74 69 74 75 74 65 64 20  ues substituted 
9320: 66 6f 72 20 74 68 65 20 6e 65 77 2e 2a 20 61 6e  for the new.* an
9330: 64 20 6f 6c 64 2e 2a 20 72 65 66 65 72 65 6e 63  d old.* referenc
9340: 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 74 72 69  es.** in the tri
9350: 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 66  gger program. If
9360: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
9370: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
9380: 61 62 6c 65 20 70 54 61 62 0a 2a 2a 20 28 61 20  able pTab.** (a 
9390: 63 6f 70 79 20 6f 66 20 70 54 61 62 2d 3e 6e 43  copy of pTab->nC
93a0: 6f 6c 29 2c 20 74 68 65 6e 20 72 65 67 69 73 74  ol), then regist
93b0: 65 72 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  ers are populate
93c0: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
93d0: 0a 2a 2a 20 20 20 52 65 67 69 73 74 65 72 20 20  .**   Register  
93e0: 20 20 20 20 20 43 6f 6e 74 61 69 6e 73 0a 2a 2a       Contains.**
93f0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
9400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 72  ---------.**   r
9430: 65 67 2b 30 20 20 20 20 20 20 20 20 20 20 4f 4c  eg+0          OL
9440: 44 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72 65 67  D.rowid.**   reg
9450: 2b 31 20 20 20 20 20 20 20 20 20 20 4f 4c 44 2e  +1          OLD.
9460: 2a 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 2d  * value of left-
9470: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  most column of p
9480: 54 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20 20  Tab.**   ...    
9490: 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
94a0: 20 72 65 67 2b 4e 20 20 20 20 20 20 20 20 20 20   reg+N          
94b0: 4f 4c 44 2e 2a 20 76 61 6c 75 65 20 6f 66 20 72  OLD.* value of r
94c0: 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
94d0: 20 6f 66 20 70 54 61 62 0a 2a 2a 20 20 20 72 65   of pTab.**   re
94e0: 67 2b 4e 2b 31 20 20 20 20 20 20 20 20 4e 45 57  g+N+1        NEW
94f0: 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72 65 67 2b  .rowid.**   reg+
9500: 4e 2b 32 20 20 20 20 20 20 20 20 4f 4c 44 2e 2a  N+2        OLD.*
9510: 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 2d 6d   value of left-m
9520: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 54  ost column of pT
9530: 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20 20 20  ab.**   ...     
9540: 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
9550: 72 65 67 2b 4e 2b 4e 2b 31 20 20 20 20 20 20 4e  reg+N+N+1      N
9560: 45 57 2e 2a 20 76 61 6c 75 65 20 6f 66 20 72 69  EW.* value of ri
9570: 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
9580: 6f 66 20 70 54 61 62 0a 2a 2a 0a 2a 2a 20 46 6f  of pTab.**.** Fo
9590: 72 20 4f 4e 20 44 45 4c 45 54 45 20 74 72 69 67  r ON DELETE trig
95a0: 67 65 72 73 2c 20 74 68 65 20 72 65 67 69 73 74  gers, the regist
95b0: 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ers containing t
95c0: 68 65 20 4e 45 57 2e 2a 20 76 61 6c 75 65 73 20  he NEW.* values 
95d0: 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65  will.** never be
95e0: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
95f0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
9600: 2c 20 73 6f 20 74 68 65 79 20 61 72 65 20 6e 6f  , so they are no
9610: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 0a  t allocated or .
9620: 2a 2a 20 70 6f 70 75 6c 61 74 65 64 20 62 79 20  ** populated by 
9630: 74 68 65 20 63 61 6c 6c 65 72 20 28 74 68 65 72  the caller (ther
9640: 65 20 69 73 20 6e 6f 20 64 61 74 61 20 74 6f 20  e is no data to 
9650: 70 6f 70 75 6c 61 74 65 20 74 68 65 6d 20 77 69  populate them wi
9660: 74 68 20 61 6e 79 77 61 79 29 2e 20 0a 2a 2a 20  th anyway). .** 
9670: 53 69 6d 69 6c 61 72 6c 79 2c 20 66 6f 72 20 4f  Similarly, for O
9680: 4e 20 49 4e 53 45 52 54 20 74 72 69 67 67 65 72  N INSERT trigger
9690: 73 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  s the values sto
96a0: 72 65 64 20 69 6e 20 74 68 65 20 4f 4c 44 2e 2a  red in the OLD.*
96b0: 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 61 72   registers.** ar
96c0: 65 20 6e 65 76 65 72 20 61 63 63 65 73 73 65 64  e never accessed
96d0: 2c 20 61 6e 64 20 73 6f 20 61 72 65 20 6e 6f 74  , and so are not
96e0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
96f0: 65 20 63 61 6c 6c 65 72 2e 20 53 6f 2c 20 66 6f  e caller. So, fo
9700: 72 20 61 6e 0a 2a 2a 20 4f 4e 20 49 4e 53 45 52  r an.** ON INSER
9710: 54 20 74 72 69 67 67 65 72 2c 20 74 68 65 20 76  T trigger, the v
9720: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 74  alue passed to t
9730: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20  his function as 
9740: 70 61 72 61 6d 65 74 65 72 20 72 65 67 0a 2a 2a  parameter reg.**
9750: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 64 61 62   is not a readab
9760: 6c 65 20 72 65 67 69 73 74 65 72 2c 20 61 6c 74  le register, alt
9770: 68 6f 75 67 68 20 72 65 67 69 73 74 65 72 73 20  hough registers 
9780: 28 72 65 67 2b 4e 29 20 74 68 72 6f 75 67 68 20  (reg+N) through 
9790: 0a 2a 2a 20 28 72 65 67 2b 4e 2b 4e 2b 31 29 20  .** (reg+N+N+1) 
97a0: 61 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  are..**.** Param
97b0: 65 74 65 72 20 6f 72 63 6f 6e 66 20 69 73 20 74  eter orconf is t
97c0: 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 66 6c  he default confl
97d0: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
97e0: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 74 68 65  lgorithm for the
97f0: 0a 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67  .** trigger prog
9800: 72 61 6d 20 74 6f 20 75 73 65 20 28 52 45 50 4c  ram to use (REPL
9810: 41 43 45 2c 20 49 47 4e 4f 52 45 20 65 74 63 2e  ACE, IGNORE etc.
9820: 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69 67 6e  ). Parameter ign
9830: 6f 72 65 4a 75 6d 70 0a 2a 2a 20 69 73 20 74 68  oreJump.** is th
9840: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  e instruction th
9850: 61 74 20 63 6f 6e 74 72 6f 6c 20 73 68 6f 75 6c  at control shoul
9860: 64 20 6a 75 6d 70 20 74 6f 20 69 66 20 61 20 74  d jump to if a t
9870: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 0a 2a  rigger program.*
9880: 2a 20 72 61 69 73 65 73 20 61 6e 20 49 47 4e 4f  * raises an IGNO
9890: 52 45 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f  RE exception..*/
98a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
98b0: 65 52 6f 77 54 72 69 67 67 65 72 28 0a 20 20 50  eRowTrigger(.  P
98c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
98d0: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
98e0: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
98f0: 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f  r *pTrigger,   /
9900: 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65  * List of trigge
9910: 72 73 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62  rs on table pTab
9920: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
9930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
9940: 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c 20  e of TK_UPDATE, 
9950: 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 44 45  TK_INSERT, TK_DE
9960: 4c 45 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69  LETE */.  ExprLi
9970: 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f  st *pChanges,  /
9980: 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74 20 66  * Changes list f
9990: 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20 4f 46  or any UPDATE OF
99a0: 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69   triggers */.  i
99b0: 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20  nt tr_tm,       
99c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 52      /* One of TR
99d0: 49 47 47 45 52 5f 42 45 46 4f 52 45 2c 20 54 52  IGGER_BEFORE, TR
99e0: 49 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 20  IGGER_AFTER */. 
99f0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
9a00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
9a10: 6c 65 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67  le to code trigg
9a20: 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ers from */.  in
9a30: 74 20 72 65 67 2c 20 20 20 20 20 20 20 20 20 20  t reg,          
9a40: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
9a50: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
9a60: 65 67 69 73 74 65 72 73 20 28 73 65 65 20 61 62  egisters (see ab
9a70: 6f 76 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  ove) */.  int or
9a80: 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20 2f  conf,          /
9a90: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f  * ON CONFLICT po
9aa0: 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67  licy */.  int ig
9ab0: 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20 20 20 2f  noreJump       /
9ac0: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  * Instruction to
9ad0: 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52 41 49   jump to for RAI
9ae0: 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 29 7b  SE(IGNORE) */.){
9af0: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 3b 20 20  .  Trigger *p;  
9b00: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
9b10: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
9b20: 67 68 20 70 54 72 69 67 67 65 72 20 6c 69 73 74  gh pTrigger list
9b30: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f   */..  assert( o
9b40: 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20  p==TK_UPDATE || 
9b50: 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 7c 7c  op==TK_INSERT ||
9b60: 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 29   op==TK_DELETE )
9b70: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 5f 74  ;.  assert( tr_t
9b80: 6d 3d 3d 54 52 49 47 47 45 52 5f 42 45 46 4f 52  m==TRIGGER_BEFOR
9b90: 45 20 7c 7c 20 74 72 5f 74 6d 3d 3d 54 52 49 47  E || tr_tm==TRIG
9ba0: 47 45 52 5f 41 46 54 45 52 20 29 3b 0a 20 20 61  GER_AFTER );.  a
9bb0: 73 73 65 72 74 28 20 28 6f 70 3d 3d 54 4b 5f 55  ssert( (op==TK_U
9bc0: 50 44 41 54 45 29 3d 3d 28 70 43 68 61 6e 67 65  PDATE)==(pChange
9bd0: 73 21 3d 30 29 20 29 3b 0a 0a 20 20 66 6f 72 28  s!=0) );..  for(
9be0: 70 3d 70 54 72 69 67 67 65 72 3b 20 70 3b 20 70  p=pTrigger; p; p
9bf0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 0a 20 20 20  =p->pNext){..   
9c00: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
9c10: 69 6e 67 3a 20 20 54 68 65 20 73 63 68 65 6d 61  ing:  The schema
9c20: 20 66 6f 72 20 74 68 65 20 74 72 69 67 67 65 72   for the trigger
9c30: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 61 62   and for the tab
9c40: 6c 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c  le are.    ** al
9c50: 77 61 79 73 20 64 65 66 69 6e 65 64 2e 20 20 54  ways defined.  T
9c60: 68 65 20 74 72 69 67 67 65 72 20 6d 75 73 74 20  he trigger must 
9c70: 62 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 73  be in the same s
9c80: 63 68 65 6d 61 20 61 73 20 74 68 65 20 74 61 62  chema as the tab
9c90: 6c 65 0a 20 20 20 20 2a 2a 20 6f 72 20 65 6c 73  le.    ** or els
9ca0: 65 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 54  e it must be a T
9cb0: 45 4d 50 20 74 72 69 67 67 65 72 2e 20 2a 2f 0a  EMP trigger. */.
9cc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
9cd0: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
9ce0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62   assert( p->pTab
9cf0: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
9d00: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68   assert( p->pSch
9d10: 65 6d 61 3d 3d 70 2d 3e 70 54 61 62 53 63 68 65  ema==p->pTabSche
9d20: 6d 61 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ma .         || 
9d30: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 50 61 72  p->pSchema==pPar
9d40: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  se->db->aDb[1].p
9d50: 53 63 68 65 6d 61 20 29 3b 0a 0a 20 20 20 20 2f  Schema );..    /
9d60: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
9d70: 68 65 72 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  her we should co
9d80: 64 65 20 74 68 69 73 20 74 72 69 67 67 65 72 20  de this trigger 
9d90: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  */.    if( p->op
9da0: 3d 3d 6f 70 20 0a 20 20 20 20 20 26 26 20 70 2d  ==op .     && p-
9db0: 3e 74 72 5f 74 6d 3d 3d 74 72 5f 74 6d 20 0a 20  >tr_tm==tr_tm . 
9dc0: 20 20 20 20 26 26 20 63 68 65 63 6b 43 6f 6c 75      && checkColu
9dd0: 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f  mnOverlap(p->pCo
9de0: 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67 65 73 29  lumns, pChanges)
9df0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
9e00: 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67  lite3CodeRowTrig
9e10: 67 65 72 44 69 72 65 63 74 28 70 50 61 72 73 65  gerDirect(pParse
9e20: 2c 20 70 2c 20 70 54 61 62 2c 20 72 65 67 2c 20  , p, pTab, reg, 
9e30: 6f 72 63 6f 6e 66 2c 20 69 67 6e 6f 72 65 4a 75  orconf, ignoreJu
9e40: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  mp);.    }.  }.}
9e50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 69 67 67 65 72 73  ../*.** Triggers
9e60: 20 6d 61 79 20 61 63 63 65 73 73 20 76 61 6c 75   may access valu
9e70: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
9e80: 20 6f 6c 64 2e 2a 20 6f 72 20 6e 65 77 2e 2a 20   old.* or new.* 
9e90: 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 0a 2a  pseudo-table. .*
9ea0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9eb0: 72 65 74 75 72 6e 73 20 61 20 33 32 2d 62 69 74  returns a 32-bit
9ec0: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
9ed0: 69 6e 67 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  ing which column
9ee0: 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 6c 64  s of the .** old
9ef0: 2e 2a 20 6f 72 20 6e 65 77 2e 2a 20 74 61 62 6c  .* or new.* tabl
9f00: 65 73 20 61 63 74 75 61 6c 6c 79 20 61 72 65 20  es actually are 
9f10: 75 73 65 64 20 62 79 20 74 72 69 67 67 65 72 73  used by triggers
9f20: 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
9f30: 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73  on .** may be us
9f40: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
9f50: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
9f60: 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74  o avoid having t
9f70: 6f 20 6c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  o load the entir
9f80: 65 0a 2a 2a 20 6f 6c 64 2e 2a 20 72 65 63 6f 72  e.** old.* recor
9f90: 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 77 68  d into memory wh
9fa0: 65 6e 20 65 78 65 63 75 74 69 6e 67 20 61 6e 20  en executing an 
9fb0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
9fc0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
9fd0: 42 69 74 20 30 20 6f 66 20 74 68 65 20 72 65 74  Bit 0 of the ret
9fe0: 75 72 6e 65 64 20 6d 61 73 6b 20 69 73 20 73 65  urned mask is se
9ff0: 74 20 69 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f  t if the left-mo
a000: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
a010: 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 62 65  .** table may be
a020: 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20   accessed using 
a030: 61 6e 20 5b 6f 6c 64 7c 6e 65 77 5d 2e 3c 63 6f  an [old|new].<co
a040: 6c 3e 20 72 65 66 65 72 65 6e 63 65 2e 20 42 69  l> reference. Bi
a050: 74 20 31 20 69 73 20 73 65 74 20 69 66 0a 2a 2a  t 1 is set if.**
a060: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74   the second left
a070: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  most column valu
a080: 65 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 61  e is required, a
a090: 6e 64 20 73 6f 20 6f 6e 2e 20 49 66 20 74 68 65  nd so on. If the
a0a0: 72 65 0a 2a 2a 20 61 72 65 20 6d 6f 72 65 20 74  re.** are more t
a0b0: 68 61 6e 20 33 32 20 63 6f 6c 75 6d 6e 73 20 69  han 32 columns i
a0c0: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64  n the table, and
a0d0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
a0e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20   the columns.** 
a0f0: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72  with an index gr
a100: 65 61 74 65 72 20 74 68 61 6e 20 33 32 20 6d 61  eater than 32 ma
a110: 79 20 62 65 20 61 63 63 65 73 73 65 64 2c 20 30  y be accessed, 0
a120: 78 66 66 66 66 66 66 66 66 20 69 73 20 72 65 74  xffffffff is ret
a130: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  urned..**.** It 
a140: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
a150: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
a160: 74 68 65 20 6f 6c 64 2e 72 6f 77 69 64 20 6f 72  the old.rowid or
a170: 20 6e 65 77 2e 72 6f 77 69 64 20 63 6f 6c 75 6d   new.rowid colum
a180: 6e 20 69 73 20 0a 2a 2a 20 61 63 63 65 73 73 65  n is .** accesse
a190: 64 20 62 79 20 74 72 69 67 67 65 72 73 2e 20 54  d by triggers. T
a1a0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 61  he caller must a
a1b0: 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74 68 61  lways assume tha
a1c0: 74 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 50  t it is..**.** P
a1d0: 61 72 61 6d 65 74 65 72 20 69 73 4e 65 77 20 6d  arameter isNew m
a1e0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 31 20  ust be either 1 
a1f0: 6f 72 20 30 2e 20 49 66 20 69 74 20 69 73 20 30  or 0. If it is 0
a200: 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 73 6b 20  , then the mask 
a210: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 70 70 6c  returned.** appl
a220: 69 65 73 20 74 6f 20 74 68 65 20 6f 6c 64 2e 2a  ies to the old.*
a230: 20 74 61 62 6c 65 2e 20 49 66 20 31 2c 20 74 68   table. If 1, th
a240: 65 20 6e 65 77 2e 2a 20 74 61 62 6c 65 2e 0a 2a  e new.* table..*
a250: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 74  *.** Parameter t
a260: 72 5f 74 6d 20 6d 75 73 74 20 62 65 20 61 20 6d  r_tm must be a m
a270: 61 73 6b 20 77 69 74 68 20 6f 6e 65 20 6f 72 20  ask with one or 
a280: 62 6f 74 68 20 6f 66 20 74 68 65 20 54 52 49 47  both of the TRIG
a290: 47 45 52 5f 42 45 46 4f 52 45 0a 2a 2a 20 61 6e  GER_BEFORE.** an
a2a0: 64 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20  d TRIGGER_AFTER 
a2b0: 62 69 74 73 20 73 65 74 2e 20 56 61 6c 75 65 73  bits set. Values
a2c0: 20 61 63 63 65 73 73 65 64 20 62 79 20 42 45 46   accessed by BEF
a2d0: 4f 52 45 20 74 72 69 67 67 65 72 73 20 61 72 65  ORE triggers are
a2e0: 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63 6c 75 64 65   only.** include
a2f0: 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  d in the returne
a300: 64 20 6d 61 73 6b 20 69 66 20 74 68 65 20 54 52  d mask if the TR
a310: 49 47 47 45 52 5f 42 45 46 4f 52 45 20 62 69 74  IGGER_BEFORE bit
a320: 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 0a 2a   is set in the.*
a330: 2a 20 74 72 5f 74 6d 20 70 61 72 61 6d 65 74 65  * tr_tm paramete
a340: 72 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 76 61  r. Similarly, va
a350: 6c 75 65 73 20 61 63 63 65 73 73 65 64 20 62 79  lues accessed by
a360: 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73 20   AFTER triggers 
a370: 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63 6c  are only.** incl
a380: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
a390: 72 6e 65 64 20 6d 61 73 6b 20 69 66 20 74 68 65  rned mask if the
a3a0: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20 62   TRIGGER_AFTER b
a3b0: 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 72 5f  it is set in tr_
a3c0: 74 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  tm..*/.u32 sqlit
a3d0: 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61 73 6b  e3TriggerColmask
a3e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a3f0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
a400: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
a410: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
a420: 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  ,   /* List of t
a430: 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65  riggers on table
a440: 20 70 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c   pTab */.  ExprL
a450: 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20  ist *pChanges,  
a460: 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74 20  /* Changes list 
a470: 66 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20 4f  for any UPDATE O
a480: 46 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20  F triggers */.  
a490: 69 6e 74 20 69 73 4e 65 77 2c 20 20 20 20 20 20  int isNew,      
a4a0: 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 6e 65       /* 1 for ne
a4b0: 77 2e 2a 20 72 65 66 20 6d 61 73 6b 2c 20 30 20  w.* ref mask, 0 
a4c0: 66 6f 72 20 6f 6c 64 2e 2a 20 72 65 66 20 6d 61  for old.* ref ma
a4d0: 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74  sk */.  int tr_t
a4e0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
a4f0: 4d 61 73 6b 20 6f 66 20 54 52 49 47 47 45 52 5f  Mask of TRIGGER_
a500: 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52 5f 41  BEFORE|TRIGGER_A
a510: 46 54 45 52 20 2a 2f 0a 20 20 54 61 62 6c 65 20  FTER */.  Table 
a520: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  *pTab,         /
a530: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 63  * The table to c
a540: 6f 64 65 20 74 72 69 67 67 65 72 73 20 66 72 6f  ode triggers fro
a550: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e  m */.  int orcon
a560: 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  f           /* D
a570: 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c 49  efault ON CONFLI
a580: 43 54 20 70 6f 6c 69 63 79 20 66 6f 72 20 74 72  CT policy for tr
a590: 69 67 67 65 72 20 73 74 65 70 73 20 2a 2f 0a 29  igger steps */.)
a5a0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 70  {.  const int op
a5b0: 20 3d 20 70 43 68 61 6e 67 65 73 20 3f 20 54 4b   = pChanges ? TK
a5c0: 5f 55 50 44 41 54 45 20 3a 20 54 4b 5f 44 45 4c  _UPDATE : TK_DEL
a5d0: 45 54 45 3b 0a 20 20 75 33 32 20 6d 61 73 6b 20  ETE;.  u32 mask 
a5e0: 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  = 0;.  Trigger *
a5f0: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  p;..  assert( is
a600: 4e 65 77 3d 3d 31 20 7c 7c 20 69 73 4e 65 77 3d  New==1 || isNew=
a610: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 54  =0 );.  for(p=pT
a620: 72 69 67 67 65 72 3b 20 70 3b 20 70 3d 70 2d 3e  rigger; p; p=p->
a630: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
a640: 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 28 74 72  p->op==op && (tr
a650: 5f 74 6d 26 70 2d 3e 74 72 5f 74 6d 29 0a 20 20  _tm&p->tr_tm).  
a660: 20 20 20 26 26 20 63 68 65 63 6b 43 6f 6c 75 6d     && checkColum
a670: 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f 6c  nOverlap(p->pCol
a680: 75 6d 6e 73 2c 70 43 68 61 6e 67 65 73 29 0a 20  umns,pChanges). 
a690: 20 20 20 29 7b 0a 20 20 20 20 20 20 54 72 69 67     ){.      Trig
a6a0: 67 65 72 50 72 67 20 2a 70 50 72 67 3b 0a 20 20  gerPrg *pPrg;.  
a6b0: 20 20 20 20 70 50 72 67 20 3d 20 67 65 74 52 6f      pPrg = getRo
a6c0: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
a6d0: 20 70 2c 20 70 54 61 62 2c 20 6f 72 63 6f 6e 66   p, pTab, orconf
a6e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
a6f0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  g ){.        mas
a700: 6b 20 7c 3d 20 70 50 72 67 2d 3e 61 43 6f 6c 6d  k |= pPrg->aColm
a710: 61 73 6b 5b 69 73 4e 65 77 5d 3b 0a 20 20 20 20  ask[isNew];.    
a720: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
a730: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
a740: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
a750: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a760: 54 52 49 47 47 45 52 29 20 2a 2f 0a              TRIGGER) */.