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

Artifact b6a3541d07a6a174f19f617405a96abff3e96365f97ff2edca1e1e7d31393e10:


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 21 7a 4e 61  ame);.  if( !zNa
1c10: 6d 65 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21  me || SQLITE_OK!
1c20: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
1c30: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
1c40: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
1c50: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
1c60: 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  up;.  }.  assert
1c70: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
1c80: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
1c90: 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 49  , 0) );.  if( !I
1ca0: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1cb0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1cc0: 65 33 48 61 73 68 46 69 6e 64 28 26 28 64 62 2d  e3HashFind(&(db-
1cd0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
1ce0: 61 2d 3e 74 72 69 67 48 61 73 68 29 2c 7a 4e 61  a->trigHash),zNa
1cf0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  me) ){.      if(
1d00: 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20   !noErr ){.     
1d10: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1d20: 73 67 28 70 50 61 72 73 65 2c 20 22 74 72 69 67  sg(pParse, "trig
1d30: 67 65 72 20 25 54 20 61 6c 72 65 61 64 79 20 65  ger %T already e
1d40: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
1d50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d60: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
1d70: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
1d80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
1d90: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
1da0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
1db0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1dc0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
1dd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1de0: 20 44 6f 20 6e 6f 74 20 63 72 65 61 74 65 20 61   Do not create a
1df0: 20 74 72 69 67 67 65 72 20 6f 6e 20 61 20 73 79   trigger on a sy
1e00: 73 74 65 6d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  stem table */.  
1e10: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
1e20: 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
1e30: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
1e40: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1e50: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1e60: 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "cannot create 
1e70: 74 72 69 67 67 65 72 20 6f 6e 20 73 79 73 74 65  trigger on syste
1e80: 6d 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  m table");.    g
1e90: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
1ea0: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  nup;.  }..  /* I
1eb0: 4e 53 54 45 41 44 20 6f 66 20 74 72 69 67 67 65  NSTEAD of trigge
1ec0: 72 73 20 61 72 65 20 6f 6e 6c 79 20 66 6f 72 20  rs are only for 
1ed0: 76 69 65 77 73 20 61 6e 64 20 76 69 65 77 73 20  views and views 
1ee0: 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 49 4e 53  only support INS
1ef0: 54 45 41 44 0a 20 20 2a 2a 20 6f 66 20 74 72 69  TEAD.  ** of tri
1f00: 67 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ggers..  */.  if
1f10: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
1f20: 26 26 20 74 72 5f 74 6d 21 3d 54 4b 5f 49 4e 53  && tr_tm!=TK_INS
1f30: 54 45 41 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  TEAD ){.    sqli
1f40: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1f50: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61  se, "cannot crea
1f60: 74 65 20 25 73 20 74 72 69 67 67 65 72 20 6f 6e  te %s trigger on
1f70: 20 76 69 65 77 3a 20 25 53 22 2c 20 0a 20 20 20   view: %S", .   
1f80: 20 20 20 20 20 28 74 72 5f 74 6d 20 3d 3d 20 54       (tr_tm == T
1f90: 4b 5f 42 45 46 4f 52 45 29 3f 22 42 45 46 4f 52  K_BEFORE)?"BEFOR
1fa0: 45 22 3a 22 41 46 54 45 52 22 2c 20 70 54 61 62  E":"AFTER", pTab
1fb0: 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  leName, 0);.    
1fc0: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
1fd0: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20  anup;.  }.  if( 
1fe0: 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
1ff0: 26 20 74 72 5f 74 6d 3d 3d 54 4b 5f 49 4e 53 54  & tr_tm==TK_INST
2000: 45 41 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EAD ){.    sqlit
2010: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2020: 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74  e, "cannot creat
2030: 65 20 49 4e 53 54 45 41 44 20 4f 46 22 0a 20 20  e INSTEAD OF".  
2040: 20 20 20 20 20 20 22 20 74 72 69 67 67 65 72 20        " trigger 
2050: 6f 6e 20 74 61 62 6c 65 3a 20 25 53 22 2c 20 70  on table: %S", p
2060: 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a 20  TableName, 0);. 
2070: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
2080: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 23 69  cleanup;.  }..#i
2090: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20a0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
20b0: 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45    if( !IN_RENAME
20c0: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 69  _OBJECT ){.    i
20d0: 6e 74 20 69 54 61 62 44 62 20 3d 20 73 71 6c 69  nt iTabDb = sqli
20e0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
20f0: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
2100: 6d 61 29 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  ma);.    int cod
2110: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
2120: 45 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 63  E_TRIGGER;.    c
2130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
2140: 20 64 62 2d 3e 61 44 62 5b 69 54 61 62 44 62 5d   db->aDb[iTabDb]
2150: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63  .zDbSName;.    c
2160: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 54 72  onst char *zDbTr
2170: 69 67 20 3d 20 69 73 54 65 6d 70 20 3f 20 64 62  ig = isTemp ? db
2180: 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[1].zDbSNam
2190: 65 20 3a 20 7a 44 62 3b 0a 20 20 20 20 69 66 28  e : zDb;.    if(
21a0: 20 69 54 61 62 44 62 3d 3d 31 20 7c 7c 20 69 73   iTabDb==1 || is
21b0: 54 65 6d 70 20 29 20 63 6f 64 65 20 3d 20 53 51  Temp ) code = SQ
21c0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
21d0: 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 69 66  _TRIGGER;.    if
21e0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
21f0: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
2200: 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
2210: 61 6d 65 2c 20 7a 44 62 54 72 69 67 29 20 29 7b  ame, zDbTrig) ){
2220: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
2230: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
2240: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
2250: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
2260: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
2270: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
2280: 69 54 61 62 44 62 29 2c 30 2c 7a 44 62 29 29 7b  iTabDb),0,zDb)){
2290: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
22a0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
22b0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
22c0: 20 2f 2a 20 49 4e 53 54 45 41 44 20 4f 46 20 74   /* INSTEAD OF t
22d0: 72 69 67 67 65 72 73 20 63 61 6e 20 6f 6e 6c 79  riggers can only
22e0: 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73   appear on views
22f0: 20 61 6e 64 20 42 45 46 4f 52 45 20 74 72 69 67   and BEFORE trig
2300: 67 65 72 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74  gers.  ** cannot
2310: 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73   appear on views
2320: 2e 20 20 53 6f 20 77 65 20 6d 69 67 68 74 20 61  .  So we might a
2330: 73 20 77 65 6c 6c 20 74 72 61 6e 73 6c 61 74 65  s well translate
2340: 20 65 76 65 72 79 0a 20 20 2a 2a 20 49 4e 53 54   every.  ** INST
2350: 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 20 69  EAD OF trigger i
2360: 6e 74 6f 20 61 20 42 45 46 4f 52 45 20 74 72 69  nto a BEFORE tri
2370: 67 67 65 72 2e 20 20 49 74 20 73 69 6d 70 6c 69  gger.  It simpli
2380: 66 69 65 73 20 63 6f 64 65 0a 20 20 2a 2a 20 65  fies code.  ** e
2390: 6c 73 65 77 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  lsewhere..  */. 
23a0: 20 69 66 20 28 74 72 5f 74 6d 20 3d 3d 20 54 4b   if (tr_tm == TK
23b0: 5f 49 4e 53 54 45 41 44 29 7b 0a 20 20 20 20 74  _INSTEAD){.    t
23c0: 72 5f 74 6d 20 3d 20 54 4b 5f 42 45 46 4f 52 45  r_tm = TK_BEFORE
23d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c  ;.  }..  /* Buil
23e0: 64 20 74 68 65 20 54 72 69 67 67 65 72 20 6f 62  d the Trigger ob
23f0: 6a 65 63 74 20 2a 2f 0a 20 20 70 54 72 69 67 67  ject */.  pTrigg
2400: 65 72 20 3d 20 28 54 72 69 67 67 65 72 2a 29 73  er = (Trigger*)s
2410: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2420: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72  ro(db, sizeof(Tr
2430: 69 67 67 65 72 29 29 3b 0a 20 20 69 66 28 20 70  igger));.  if( p
2440: 54 72 69 67 67 65 72 3d 3d 30 20 29 20 67 6f 74  Trigger==0 ) got
2450: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
2460: 70 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 7a  p;.  pTrigger->z
2470: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
2480: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 72  zName = 0;.  pTr
2490: 69 67 67 65 72 2d 3e 74 61 62 6c 65 20 3d 20 73  igger->table = s
24a0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
24b0: 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61  b, pTableName->a
24c0: 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 23 69 66 64  [0].zName);.#ifd
24d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
24e0: 5f 53 48 41 52 45 44 5f 53 43 48 45 4d 41 0a 20  _SHARED_SCHEMA. 
24f0: 20 69 66 28 20 49 73 53 68 61 72 65 64 53 63 68   if( IsSharedSch
2500: 65 6d 61 28 64 62 29 20 26 26 20 69 44 62 3d 3d  ema(db) && iDb==
2510: 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 61  1 ){.    int iTa
2520: 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  bDb = sqlite3Sch
2530: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
2540: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
2550: 20 20 20 70 54 72 69 67 67 65 72 2d 3e 7a 54 61     pTrigger->zTa
2560: 62 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  bSchema = sqlite
2570: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 64 62  3DbStrDup(db, db
2580: 2d 3e 61 44 62 5b 69 54 61 62 44 62 5d 2e 7a 44  ->aDb[iTabDb].zD
2590: 62 53 4e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e  bSName);.  }.#en
25a0: 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
25b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 48 41 52 45  ITE_ENABLE_SHARE
25c0: 44 5f 53 43 48 45 4d 41 20 2a 2f 0a 20 20 70 54  D_SCHEMA */.  pT
25d0: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20  rigger->pSchema 
25e0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
25f0: 53 63 68 65 6d 61 3b 0a 20 20 70 54 72 69 67 67  Schema;.  pTrigg
2600: 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 3d  er->pTabSchema =
2610: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
2620: 20 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 20 3d    pTrigger->op =
2630: 20 28 75 38 29 6f 70 3b 0a 20 20 70 54 72 69 67   (u8)op;.  pTrig
2640: 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 20 74 72 5f  ger->tr_tm = tr_
2650: 74 6d 3d 3d 54 4b 5f 42 45 46 4f 52 45 20 3f 20  tm==TK_BEFORE ? 
2660: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 3a  TRIGGER_BEFORE :
2670: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 3b 0a   TRIGGER_AFTER;.
2680: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
2690: 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71  OBJECT ){.    sq
26a0: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
26b0: 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 70 54  Remap(pParse, pT
26c0: 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 2c 20 70  rigger->table, p
26d0: 54 61 62 6c 65 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  TableName->a[0].
26e0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 72 69  zName);.    pTri
26f0: 67 67 65 72 2d 3e 70 57 68 65 6e 20 3d 20 70 57  gger->pWhen = pW
2700: 68 65 6e 3b 0a 20 20 20 20 70 57 68 65 6e 20 3d  hen;.    pWhen =
2710: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2720: 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e   pTrigger->pWhen
2730: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
2740: 70 28 64 62 2c 20 70 57 68 65 6e 2c 20 45 58 50  p(db, pWhen, EXP
2750: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
2760: 7d 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70 43  }.  pTrigger->pC
2770: 6f 6c 75 6d 6e 73 20 3d 20 70 43 6f 6c 75 6d 6e  olumns = pColumn
2780: 73 3b 0a 20 20 70 43 6f 6c 75 6d 6e 73 20 3d 20  s;.  pColumns = 
2790: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
27a0: 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72  rse->pNewTrigger
27b0: 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ==0 );.  pParse-
27c0: 3e 70 4e 65 77 54 72 69 67 67 65 72 20 3d 20 70  >pNewTrigger = p
27d0: 54 72 69 67 67 65 72 3b 0a 0a 74 72 69 67 67 65  Trigger;..trigge
27e0: 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  r_cleanup:.  sql
27f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2800: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
2810: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
2820: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  , pTableName);. 
2830: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
2840: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e  lete(db, pColumn
2850: 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  s);.  sqlite3Exp
2860: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65  rDelete(db, pWhe
2870: 6e 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  n);.  if( !pPars
2880: 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20 29  e->pNewTrigger )
2890: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  {.    sqlite3Del
28a0: 65 74 65 54 72 69 67 67 65 72 28 64 62 2c 20 70  eteTrigger(db, p
28b0: 54 72 69 67 67 65 72 29 3b 0a 20 20 7d 65 6c 73  Trigger);.  }els
28c0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
28d0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67  Parse->pNewTrigg
28e0: 65 72 3d 3d 70 54 72 69 67 67 65 72 20 29 3b 0a  er==pTrigger );.
28f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2910: 6c 65 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  led after all of
2920: 20 74 68 65 20 74 72 69 67 67 65 72 20 61 63 74   the trigger act
2930: 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 70  ions have been p
2940: 61 72 73 65 64 0a 2a 2a 20 69 6e 20 6f 72 64 65  arsed.** in orde
2950: 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
2960: 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 75 69  e process of bui
2970: 6c 64 69 6e 67 20 74 68 65 20 74 72 69 67 67 65  lding the trigge
2980: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
2990: 65 33 46 69 6e 69 73 68 54 72 69 67 67 65 72 28  e3FinishTrigger(
29a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
29b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
29c0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
29d0: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
29e0: 53 74 65 70 4c 69 73 74 2c 20 2f 2a 20 54 68 65  StepList, /* The
29f0: 20 74 72 69 67 67 65 72 65 64 20 70 72 6f 67 72   triggered progr
2a00: 61 6d 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  am */.  Token *p
2a10: 41 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  All             
2a20: 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74 20 64 65  /* Token that de
2a30: 73 63 72 69 62 65 73 20 74 68 65 20 63 6f 6d 70  scribes the comp
2a40: 6c 65 74 65 20 43 52 45 41 54 45 20 54 52 49 47  lete CREATE TRIG
2a50: 47 45 52 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  GER */.){.  Trig
2a60: 67 65 72 20 2a 70 54 72 69 67 20 3d 20 70 50 61  ger *pTrig = pPa
2a70: 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72  rse->pNewTrigger
2a80: 3b 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 62  ;   /* Trigger b
2a90: 65 69 6e 67 20 66 69 6e 69 73 68 65 64 20 2a 2f  eing finished */
2aa0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2ad0: 6d 65 20 6f 66 20 74 72 69 67 67 65 72 20 2a 2f  me of trigger */
2ae0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2af0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
2b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2b10: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2b20: 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 78 65 72          /* Fixer
2b50: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2b60: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2b90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2ba0: 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 54 6f 6b  trigger */.  Tok
2bb0: 65 6e 20 6e 61 6d 65 54 6f 6b 65 6e 3b 20 20 20  en nameToken;   
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 20 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20       /* Trigger 
2be0: 6e 61 6d 65 20 66 6f 72 20 65 72 72 6f 72 20 72  name for error r
2bf0: 65 70 6f 72 74 69 6e 67 20 2a 2f 0a 0a 20 20 70  eporting */..  p
2c00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67  Parse->pNewTrigg
2c10: 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 4e 45  er = 0;.  if( NE
2c20: 56 45 52 28 70 50 61 72 73 65 2d 3e 6e 45 72 72  VER(pParse->nErr
2c30: 29 20 7c 7c 20 21 70 54 72 69 67 20 29 20 67 6f  ) || !pTrig ) go
2c40: 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69 73 68  to triggerfinish
2c50: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7a 4e 61 6d  _cleanup;.  zNam
2c60: 65 20 3d 20 70 54 72 69 67 2d 3e 7a 4e 61 6d 65  e = pTrig->zName
2c70: 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
2c80: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
2c90: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 72 69 67  Parse->db, pTrig
2ca0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 70 54  ->pSchema);.  pT
2cb0: 72 69 67 2d 3e 73 74 65 70 5f 6c 69 73 74 20 3d  rig->step_list =
2cc0: 20 70 53 74 65 70 4c 69 73 74 3b 0a 20 20 77 68   pStepList;.  wh
2cd0: 69 6c 65 28 20 70 53 74 65 70 4c 69 73 74 20 29  ile( pStepList )
2ce0: 7b 0a 20 20 20 20 70 53 74 65 70 4c 69 73 74 2d  {.    pStepList-
2cf0: 3e 70 54 72 69 67 20 3d 20 70 54 72 69 67 3b 0a  >pTrig = pTrig;.
2d00: 20 20 20 20 70 53 74 65 70 4c 69 73 74 20 3d 20      pStepList = 
2d10: 70 53 74 65 70 4c 69 73 74 2d 3e 70 4e 65 78 74  pStepList->pNext
2d20: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
2d30: 6f 6b 65 6e 49 6e 69 74 28 26 6e 61 6d 65 54 6f  okenInit(&nameTo
2d40: 6b 65 6e 2c 20 70 54 72 69 67 2d 3e 7a 4e 61 6d  ken, pTrig->zNam
2d50: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78  e);.  sqlite3Fix
2d60: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
2d70: 73 65 2c 20 69 44 62 2c 20 22 74 72 69 67 67 65  se, iDb, "trigge
2d80: 72 22 2c 20 26 6e 61 6d 65 54 6f 6b 65 6e 29 3b  r", &nameToken);
2d90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
2da0: 78 54 72 69 67 67 65 72 53 74 65 70 28 26 73 46  xTriggerStep(&sF
2db0: 69 78 2c 20 70 54 72 69 67 2d 3e 73 74 65 70 5f  ix, pTrig->step_
2dc0: 6c 69 73 74 29 20 0a 20 20 20 7c 7c 20 73 71 6c  list) .   || sql
2dd0: 69 74 65 33 46 69 78 45 78 70 72 28 26 73 46 69  ite3FixExpr(&sFi
2de0: 78 2c 20 70 54 72 69 67 2d 3e 70 57 68 65 6e 29  x, pTrig->pWhen)
2df0: 20 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   .  ){.    goto 
2e00: 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c  triggerfinish_cl
2e10: 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 23 69 66 6e  eanup;.  }..#ifn
2e20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e30: 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 69 66 28  ALTERTABLE.  if(
2e40: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
2e50: 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
2e60: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
2e70: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  );.    pParse->p
2e80: 4e 65 77 54 72 69 67 67 65 72 20 3d 20 70 54 72  NewTrigger = pTr
2e90: 69 67 3b 0a 20 20 20 20 70 54 72 69 67 20 3d 20  ig;.    pTrig = 
2ea0: 30 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  0;.  }else.#endi
2eb0: 66 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 72  f..  /* if we ar
2ec0: 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  e not initializi
2ed0: 6e 67 2c 0a 20 20 2a 2a 20 62 75 69 6c 64 20 74  ng,.  ** build t
2ee0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
2ef0: 20 65 6e 74 72 79 0a 20 20 2a 2f 0a 20 20 69 66   entry.  */.  if
2f00: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
2f10: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   ){.    Vdbe *v;
2f20: 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  .    char *z;.. 
2f30: 20 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     /* Make an en
2f40: 74 72 79 20 69 6e 20 74 68 65 20 73 71 6c 69 74  try in the sqlit
2f50: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e_master table *
2f60: 2f 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  /.    v = sqlite
2f70: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
2f80: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
2f90: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e   goto triggerfin
2fa0: 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ish_cleanup;.   
2fb0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
2fc0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
2fd0: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
2fe0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74   z = sqlite3DbSt
2ff0: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
3000: 29 70 41 6c 6c 2d 3e 7a 2c 20 70 41 6c 6c 2d 3e  )pAll->z, pAll->
3010: 6e 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  n);.    testcase
3020: 28 20 7a 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  ( z==0 );.    sq
3030: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
3040: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
3050: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e  "INSERT INTO %Q.
3060: 25 73 20 56 41 4c 55 45 53 28 27 74 72 69 67 67  %s VALUES('trigg
3070: 65 72 27 2c 25 51 2c 25 51 2c 30 2c 27 43 52 45  er',%Q,%Q,0,'CRE
3080: 41 54 45 20 54 52 49 47 47 45 52 20 25 71 27 29  ATE TRIGGER %q')
3090: 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
30a0: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
30b0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 7a 4e   MASTER_NAME, zN
30c0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 70 54 72 69  ame,.       pTri
30d0: 67 2d 3e 74 61 62 6c 65 2c 20 7a 29 3b 0a 20 20  g->table, z);.  
30e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
30f0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  db, z);.    sqli
3100: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
3110: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
3120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3130: 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 70 50  ParseSchemaOp(pP
3140: 61 72 73 65 2c 20 69 44 62 2c 0a 20 20 20 20 20  arse, iDb,.     
3150: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
3160: 66 28 64 62 2c 20 22 74 79 70 65 3d 27 74 72 69  f(db, "type='tri
3170: 67 67 65 72 27 20 41 4e 44 20 6e 61 6d 65 3d 27  gger' AND name='
3180: 25 71 27 22 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20  %q'", zName));. 
3190: 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   }..  if( db->in
31a0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54  it.busy ){.    T
31b0: 72 69 67 67 65 72 20 2a 70 4c 69 6e 6b 20 3d 20  rigger *pLink = 
31c0: 70 54 72 69 67 3b 0a 20 20 20 20 48 61 73 68 20  pTrig;.    Hash 
31d0: 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44  *pHash = &db->aD
31e0: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
31f0: 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20 61 73  trigHash;.    as
3200: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3210: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3220: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
3230: 61 73 73 65 72 74 28 20 70 4c 69 6e 6b 21 3d 30  assert( pLink!=0
3240: 20 29 3b 0a 20 20 20 20 70 54 72 69 67 20 3d 20   );.    pTrig = 
3250: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
3260: 74 28 70 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  t(pHash, zName, 
3270: 70 54 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20  pTrig);.    if( 
3280: 70 54 72 69 67 20 29 7b 0a 20 20 20 20 20 20 73  pTrig ){.      s
3290: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
32a0: 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  b);.    }else if
32b0: 28 20 70 4c 69 6e 6b 2d 3e 70 53 63 68 65 6d 61  ( pLink->pSchema
32c0: 3d 3d 70 4c 69 6e 6b 2d 3e 70 54 61 62 53 63 68  ==pLink->pTabSch
32d0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ema ){.      Tab
32e0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
32f0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 48 61  pTab = sqlite3Ha
3300: 73 68 46 69 6e 64 28 26 70 4c 69 6e 6b 2d 3e 70  shFind(&pLink->p
3310: 54 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  TabSchema->tblHa
3320: 73 68 2c 20 70 4c 69 6e 6b 2d 3e 74 61 62 6c 65  sh, pLink->table
3330: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3340: 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
3350: 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d    pLink->pNext =
3360: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b   pTab->pTrigger;
3370: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 54 72  .      pTab->pTr
3380: 69 67 67 65 72 20 3d 20 70 4c 69 6e 6b 3b 0a 20  igger = pLink;. 
3390: 20 20 20 7d 0a 20 20 7d 0a 0a 74 72 69 67 67 65     }.  }..trigge
33a0: 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3a  rfinish_cleanup:
33b0: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
33c0: 54 72 69 67 67 65 72 28 64 62 2c 20 70 54 72 69  Trigger(db, pTri
33d0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 49 4e  g);.  assert( IN
33e0: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 7c  _RENAME_OBJECT |
33f0: 7c 20 21 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  | !pParse->pNewT
3400: 72 69 67 67 65 72 20 29 3b 0a 20 20 73 71 6c 69  rigger );.  sqli
3410: 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72  te3DeleteTrigger
3420: 53 74 65 70 28 64 62 2c 20 70 53 74 65 70 4c 69  Step(db, pStepLi
3430: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75  st);.}../*.** Du
3440: 70 6c 69 63 61 74 65 20 61 20 72 61 6e 67 65 20  plicate a range 
3450: 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20  of text from an 
3460: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  SQL statement, t
3470: 68 65 6e 20 63 6f 6e 76 65 72 74 20 61 6c 6c 0a  hen convert all.
3480: 2a 2a 20 77 68 69 74 65 73 70 61 63 65 20 63 68  ** whitespace ch
3490: 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20 6f 72  aracters into or
34a0: 64 69 6e 61 72 79 20 73 70 61 63 65 20 63 68 61  dinary space cha
34b0: 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  racters..*/.stat
34c0: 69 63 20 63 68 61 72 20 2a 74 72 69 67 67 65 72  ic char *trigger
34d0: 53 70 61 6e 44 75 70 28 73 71 6c 69 74 65 33 20  SpanDup(sqlite3 
34e0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
34f0: 2a 7a 53 74 61 72 74 2c 20 63 6f 6e 73 74 20 63  *zStart, const c
3500: 68 61 72 20 2a 7a 45 6e 64 29 7b 0a 20 20 63 68  har *zEnd){.  ch
3510: 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 44  ar *z = sqlite3D
3520: 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74  bSpanDup(db, zSt
3530: 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 69 6e  art, zEnd);.  in
3540: 74 20 69 3b 0a 20 20 69 66 28 20 7a 20 29 20 66  t i;.  if( z ) f
3550: 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
3560: 2b 29 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  +) if( sqlite3Is
3570: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 20 7a 5b  space(z[i]) ) z[
3580: 69 5d 20 3d 20 27 20 27 3b 0a 20 20 72 65 74 75  i] = ' ';.  retu
3590: 72 6e 20 7a 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn z;.}    ../*.
35a0: 2a 2a 20 54 75 72 6e 20 61 20 53 45 4c 45 43 54  ** Turn a SELECT
35b0: 20 73 74 61 74 65 6d 65 6e 74 20 28 74 68 61 74   statement (that
35c0: 20 74 68 65 20 70 53 65 6c 65 63 74 20 70 61 72   the pSelect par
35d0: 61 6d 65 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ameter points to
35e0: 29 20 69 6e 74 6f 0a 2a 2a 20 61 20 74 72 69 67  ) into.** a trig
35f0: 67 65 72 20 73 74 65 70 2e 20 20 52 65 74 75 72  ger step.  Retur
3600: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
3610: 20 54 72 69 67 67 65 72 53 74 65 70 20 73 74 72   TriggerStep str
3620: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
3630: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
3640: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3650: 20 69 74 20 66 69 6e 64 73 20 61 20 53 45 4c 45   it finds a SELE
3660: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 0a  CT statement in.
3670: 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  ** body of a TRI
3680: 47 47 45 52 2e 20 20 0a 2a 2f 0a 54 72 69 67 67  GGER.  .*/.Trigg
3690: 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54  erStep *sqlite3T
36a0: 72 69 67 67 65 72 53 65 6c 65 63 74 53 74 65 70  riggerSelectStep
36b0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
36e0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ection */.  Sele
36f0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
3700: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
3710: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3720: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
3730: 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 20 20 20  *zStart,        
3740: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 53 51 4c   /* Start of SQL
3750: 20 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74   text */.  const
3760: 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20   char *zEnd     
3770: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
3780: 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 29 7b 0a   SQL text */.){.
3790: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
37a0: 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 73 71  TriggerStep = sq
37b0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
37c0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72 69  o(db, sizeof(Tri
37d0: 67 67 65 72 53 74 65 70 29 29 3b 0a 20 20 69 66  ggerStep));.  if
37e0: 28 20 70 54 72 69 67 67 65 72 53 74 65 70 3d 3d  ( pTriggerStep==
37f0: 30 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  0 ) {.    sqlite
3800: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
3810: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
3820: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3830: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70  pTriggerStep->op
3840: 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
3850: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53  pTriggerStep->pS
3860: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
3870: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
3880: 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44 65 66  >orconf = OE_Def
3890: 61 75 6c 74 3b 0a 20 20 70 54 72 69 67 67 65 72  ault;.  pTrigger
38a0: 53 74 65 70 2d 3e 7a 53 70 61 6e 20 3d 20 74 72  Step->zSpan = tr
38b0: 69 67 67 65 72 53 70 61 6e 44 75 70 28 64 62 2c  iggerSpanDup(db,
38c0: 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a   zStart, zEnd);.
38d0: 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65    return pTrigge
38e0: 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rStep;.}../*.** 
38f0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74  Allocate space t
3900: 6f 20 68 6f 6c 64 20 61 20 6e 65 77 20 74 72 69  o hold a new tri
3910: 67 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20  gger step.  The 
3920: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 0a  allocated space.
3930: 2a 2a 20 68 6f 6c 64 73 20 62 6f 74 68 20 74 68  ** holds both th
3940: 65 20 54 72 69 67 67 65 72 53 74 65 70 20 6f 62  e TriggerStep ob
3950: 6a 65 63 74 20 61 6e 64 20 74 68 65 20 54 72 69  ject and the Tri
3960: 67 67 65 72 53 74 65 70 2e 74 61 72 67 65 74 2e  ggerStep.target.
3970: 7a 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  z string..**.** 
3980: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
3990: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
39a0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 64 62 2d  returned and db-
39b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 69 73  >mallocFailed is
39c0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
39d0: 54 72 69 67 67 65 72 53 74 65 70 20 2a 74 72 69  TriggerStep *tri
39e0: 67 67 65 72 53 74 65 70 41 6c 6c 6f 63 61 74 65  ggerStepAllocate
39f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3a00: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
3a10: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3a20: 74 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20  t */.  u8 op,   
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 6f 70     /* Trigger op
3a50: 63 6f 64 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  code */.  Token 
3a60: 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
3a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 72        /* The tar
3a80: 67 65 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  get name */.  co
3a90: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74  nst char *zStart
3aa0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ,         /* Sta
3ab0: 72 74 20 6f 66 20 53 51 4c 20 74 65 78 74 20 2a  rt of SQL text *
3ac0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3ad0: 7a 45 6e 64 20 20 20 20 20 20 20 20 20 20 20 20  zEnd            
3ae0: 2f 2a 20 45 6e 64 20 6f 66 20 53 51 4c 20 74 65  /* End of SQL te
3af0: 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  xt */.){.  sqlit
3b00: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
3b10: 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 53 74  >db;.  TriggerSt
3b20: 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65 70  ep *pTriggerStep
3b30: 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  ;..  pTriggerSte
3b40: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
3b50: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
3b60: 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29 20  of(TriggerStep) 
3b70: 2b 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 31 29 3b  + pName->n + 1);
3b80: 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53  .  if( pTriggerS
3b90: 74 65 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  tep ){.    char 
3ba0: 2a 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 54 72  *z = (char*)&pTr
3bb0: 69 67 67 65 72 53 74 65 70 5b 31 5d 3b 0a 20 20  iggerStep[1];.  
3bc0: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
3bd0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
3be0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
3bf0: 6f 74 65 28 7a 29 3b 0a 20 20 20 20 70 54 72 69  ote(z);.    pTri
3c00: 67 67 65 72 53 74 65 70 2d 3e 7a 54 61 72 67 65  ggerStep->zTarge
3c10: 74 20 3d 20 7a 3b 0a 20 20 20 20 70 54 72 69 67  t = z;.    pTrig
3c20: 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 6f 70  gerStep->op = op
3c30: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
3c40: 65 70 2d 3e 7a 53 70 61 6e 20 3d 20 74 72 69 67  ep->zSpan = trig
3c50: 67 65 72 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  gerSpanDup(db, z
3c60: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
3c70: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
3c80: 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
3c90: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
3ca0: 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 70 54  enMap(pParse, pT
3cb0: 72 69 67 67 65 72 53 74 65 70 2d 3e 7a 54 61 72  riggerStep->zTar
3cc0: 67 65 74 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  get, pName);.   
3cd0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3ce0: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a  pTriggerStep;.}.
3cf0: 0a 2f 2a 0a 2a 2a 20 42 75 69 6c 64 20 61 20 74  ./*.** Build a t
3d00: 72 69 67 67 65 72 20 73 74 65 70 20 6f 75 74 20  rigger step out 
3d10: 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 73 74 61  of an INSERT sta
3d20: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
3d30: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
3d40: 74 68 65 20 6e 65 77 20 74 72 69 67 67 65 72 20  the new trigger 
3d50: 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  step..**.** The 
3d60: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
3d70: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69  s routine when i
3d80: 74 20 73 65 65 73 20 61 6e 20 49 4e 53 45 52 54  t sees an INSERT
3d90: 20 69 6e 73 69 64 65 20 74 68 65 0a 2a 2a 20 62   inside the.** b
3da0: 6f 64 79 20 6f 66 20 61 20 74 72 69 67 67 65 72  ody of a trigger
3db0: 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70  ..*/.TriggerStep
3dc0: 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72   *sqlite3Trigger
3dd0: 49 6e 73 65 72 74 53 74 65 70 28 0a 20 20 50 61  InsertStep(.  Pa
3de0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3df0: 20 20 2f 2a 20 50 61 72 73 65 72 20 2a 2f 0a 20    /* Parser */. 
3e00: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
3e10: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
3e20: 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  the table into w
3e30: 68 69 63 68 20 77 65 20 69 6e 73 65 72 74 20 2a  hich we insert *
3e40: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c  /.  IdList *pCol
3e50: 75 6d 6e 2c 20 20 20 20 2f 2a 20 4c 69 73 74 20  umn,    /* List 
3e60: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 54  of columns in pT
3e70: 61 62 6c 65 4e 61 6d 65 20 74 6f 20 69 6e 73 65  ableName to inse
3e80: 72 74 20 69 6e 74 6f 20 2a 2f 0a 20 20 53 65 6c  rt into */.  Sel
3e90: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
3ea0: 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
3eb0: 74 65 6d 65 6e 74 20 74 68 61 74 20 73 75 70 70  tement that supp
3ec0: 6c 69 65 73 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lies values */. 
3ed0: 20 75 38 20 6f 72 63 6f 6e 66 2c 20 20 20 20 20   u8 orconf,     
3ee0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66       /* The conf
3ef0: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 28  lict algorithm (
3f00: 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 52 65 70  OE_Abort, OE_Rep
3f10: 6c 61 63 65 2c 20 65 74 63 2e 29 20 2a 2f 0a 20  lace, etc.) */. 
3f20: 20 55 70 73 65 72 74 20 2a 70 55 70 73 65 72 74   Upsert *pUpsert
3f30: 2c 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c  ,    /* ON CONFL
3f40: 49 43 54 20 63 6c 61 75 73 65 73 20 66 6f 72 20  ICT clauses for 
3f50: 75 70 73 65 72 74 20 2a 2f 0a 20 20 63 6f 6e 73  upsert */.  cons
3f60: 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20  t char *zStart, 
3f70: 2f 2a 20 53 74 61 72 74 20 6f 66 20 53 51 4c 20  /* Start of SQL 
3f80: 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  text */.  const 
3f90: 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 2f 2a  char *zEnd    /*
3fa0: 20 45 6e 64 20 6f 66 20 53 51 4c 20 74 65 78 74   End of SQL text
3fb0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
3fc0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
3fd0: 62 3b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  b;.  TriggerStep
3fe0: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a   *pTriggerStep;.
3ff0: 0a 20 20 61 73 73 65 72 74 28 70 53 65 6c 65 63  .  assert(pSelec
4000: 74 20 21 3d 20 30 20 7c 7c 20 64 62 2d 3e 6d 61  t != 0 || db->ma
4010: 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 0a 20 20  llocFailed);..  
4020: 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 74  pTriggerStep = t
4030: 72 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63 61  riggerStepAlloca
4040: 74 65 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  te(pParse, TK_IN
4050: 53 45 52 54 2c 20 70 54 61 62 6c 65 4e 61 6d 65  SERT, pTableName
4060: 2c 7a 53 74 61 72 74 2c 7a 45 6e 64 29 3b 0a 20  ,zStart,zEnd);. 
4070: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65   if( pTriggerSte
4080: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f  p ){.    if( IN_
4090: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
40a0: 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 53  .      pTriggerS
40b0: 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tep->pSelect = p
40c0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 70 53  Select;.      pS
40d0: 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 7d  elect = 0;.    }
40e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 72 69  else{.      pTri
40f0: 67 67 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63  ggerStep->pSelec
4100: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
4110: 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
4120: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
4130: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72  );.    }.    pTr
4140: 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c 69  iggerStep->pIdLi
4150: 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20  st = pColumn;.  
4160: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
4170: 70 55 70 73 65 72 74 20 3d 20 70 55 70 73 65 72  pUpsert = pUpser
4180: 74 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53  t;.    pTriggerS
4190: 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72  tep->orconf = or
41a0: 63 6f 6e 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  conf;.  }else{. 
41b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
41c0: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73 71 6c 69  lumn );.    sqli
41d0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
41e0: 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b 0a 20 20  db, pColumn);.  
41f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 55 70 73    testcase( pUps
4200: 65 72 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ert );.    sqlit
4210: 65 33 55 70 73 65 72 74 44 65 6c 65 74 65 28 64  e3UpsertDelete(d
4220: 62 2c 20 70 55 70 73 65 72 74 29 3b 0a 20 20 7d  b, pUpsert);.  }
4230: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
4240: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
4250: 63 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  ct);..  return p
4260: 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a  TriggerStep;.}..
4270: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
4280: 61 20 74 72 69 67 67 65 72 20 73 74 65 70 20 74  a trigger step t
4290: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  hat implements a
42a0: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
42b0: 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  nt and return.**
42c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
42d0: 61 74 20 74 72 69 67 67 65 72 20 73 74 65 70 2e  at trigger step.
42e0: 20 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c    The parser cal
42f0: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
4300: 77 68 65 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20  when it.** sees 
4310: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
4320: 65 6e 74 20 69 6e 73 69 64 65 20 74 68 65 20 62  ent inside the b
4330: 6f 64 79 20 6f 66 20 61 20 43 52 45 41 54 45 20  ody of a CREATE 
4340: 54 52 49 47 47 45 52 2e 0a 2a 2f 0a 54 72 69 67  TRIGGER..*/.Trig
4350: 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33  gerStep *sqlite3
4360: 54 72 69 67 67 65 72 55 70 64 61 74 65 53 74 65  TriggerUpdateSte
4370: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
4380: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
4390: 50 61 72 73 65 72 20 2a 2f 0a 20 20 54 6f 6b 65  Parser */.  Toke
43a0: 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20  n *pTableName,  
43b0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
43c0: 74 61 62 6c 65 20 74 6f 20 62 65 20 75 70 64 61  table to be upda
43d0: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
43e0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f 2a  t *pEList,    /*
43f0: 20 54 68 65 20 53 45 54 20 63 6c 61 75 73 65 3a   The SET clause:
4400: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20   list of column 
4410: 61 6e 64 20 6e 65 77 20 76 61 6c 75 65 73 20 2a  and new values *
4420: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
4430: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
4440: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
4450: 20 20 75 38 20 6f 72 63 6f 6e 66 2c 20 20 20 20    u8 orconf,    
4460: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
4470: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
4480: 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  . (OE_Abort, OE_
4490: 49 67 6e 6f 72 65 2c 20 65 74 63 29 20 2a 2f 0a  Ignore, etc) */.
44a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
44b0: 74 61 72 74 2c 20 20 2f 2a 20 53 74 61 72 74 20  tart,  /* Start 
44c0: 6f 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 20  of SQL text */. 
44d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
44e0: 64 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20  d     /* End of 
44f0: 53 51 4c 20 74 65 78 74 20 2a 2f 0a 29 7b 0a 20  SQL text */.){. 
4500: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4510: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69  Parse->db;.  Tri
4520: 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67  ggerStep *pTrigg
4530: 65 72 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67  erStep;..  pTrig
4540: 67 65 72 53 74 65 70 20 3d 20 74 72 69 67 67 65  gerStep = trigge
4550: 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 70 50  rStepAllocate(pP
4560: 61 72 73 65 2c 20 54 4b 5f 55 50 44 41 54 45 2c  arse, TK_UPDATE,
4570: 20 70 54 61 62 6c 65 4e 61 6d 65 2c 7a 53 74 61   pTableName,zSta
4580: 72 74 2c 7a 45 6e 64 29 3b 0a 20 20 69 66 28 20  rt,zEnd);.  if( 
4590: 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a  pTriggerStep ){.
45a0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
45b0: 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
45c0: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
45d0: 70 45 78 70 72 4c 69 73 74 20 3d 20 70 45 4c 69  pExprList = pELi
45e0: 73 74 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67  st;.      pTrigg
45f0: 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d  erStep->pWhere =
4600: 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70   pWhere;.      p
4610: 45 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  EList = 0;.     
4620: 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20   pWhere = 0;.   
4630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
4640: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70  riggerStep->pExp
4650: 72 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  rList = sqlite3E
4660: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
4670: 45 4c 69 73 74 2c 20 45 58 50 52 44 55 50 5f 52  EList, EXPRDUP_R
4680: 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 70 54  EDUCE);.      pT
4690: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57 68 65  riggerStep->pWhe
46a0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
46b0: 44 75 70 28 64 62 2c 20 70 57 68 65 72 65 2c 20  Dup(db, pWhere, 
46c0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
46d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72 69 67  .    }.    pTrig
46e0: 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20  gerStep->orconf 
46f0: 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 7d 0a 20 20  = orconf;.  }.  
4700: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4710: 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
4720: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
4730: 44 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65 72  Delete(db, pWher
4740: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 72  e);.  return pTr
4750: 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a  iggerStep;.}../*
4760: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
4770: 74 72 69 67 67 65 72 20 73 74 65 70 20 74 68 61  trigger step tha
4780: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 44  t implements a D
4790: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
47a0: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  and return.** a 
47b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
47c0: 74 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 54  trigger step.  T
47d0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
47e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
47f0: 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20 61 20 44  n it.** sees a D
4800: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
4810: 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79 20  inside the body 
4820: 6f 66 20 61 20 43 52 45 41 54 45 20 54 52 49 47  of a CREATE TRIG
4830: 47 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53  GER..*/.TriggerS
4840: 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67  tep *sqlite3Trig
4850: 67 65 72 44 65 6c 65 74 65 53 74 65 70 28 0a 20  gerDeleteStep(. 
4860: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4870: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
4880: 65 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  er */.  Token *p
4890: 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 20  TableName,      
48a0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72 6f  /* The table fro
48b0: 6d 20 77 68 69 63 68 20 72 6f 77 73 20 61 72 65  m which rows are
48c0: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 45 78   deleted */.  Ex
48d0: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
48e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
48f0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 63  RE clause */.  c
4900: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72  onst char *zStar
4910: 74 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  t,     /* Start 
4920: 6f 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 20  of SQL text */. 
4930: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
4940: 64 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  d        /* End 
4950: 6f 66 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 29  of SQL text */.)
4960: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
4970: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4980: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72  TriggerStep *pTr
4990: 69 67 67 65 72 53 74 65 70 3b 0a 0a 20 20 70 54  iggerStep;..  pT
49a0: 72 69 67 67 65 72 53 74 65 70 20 3d 20 74 72 69  riggerStep = tri
49b0: 67 67 65 72 53 74 65 70 41 6c 6c 6f 63 61 74 65  ggerStepAllocate
49c0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 45 4c 45  (pParse, TK_DELE
49d0: 54 45 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 7a  TE, pTableName,z
49e0: 53 74 61 72 74 2c 7a 45 6e 64 29 3b 0a 20 20 69  Start,zEnd);.  i
49f0: 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70 20  f( pTriggerStep 
4a00: 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45  ){.    if( IN_RE
4a10: 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
4a20: 20 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65       pTriggerSte
4a30: 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
4a40: 72 65 3b 0a 20 20 20 20 20 20 70 57 68 65 72 65  re;.      pWhere
4a50: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
4a60: 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 53  .      pTriggerS
4a70: 74 65 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  tep->pWhere = sq
4a80: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
4a90: 20 70 57 68 65 72 65 2c 20 45 58 50 52 44 55 50   pWhere, EXPRDUP
4aa0: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 7d 0a  _REDUCE);.    }.
4ab0: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
4ac0: 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44 65  ->orconf = OE_De
4ad0: 66 61 75 6c 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  fault;.  }.  sql
4ae0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4af0: 62 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 72 65  b, pWhere);.  re
4b00: 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65  turn pTriggerSte
4b10: 70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 63  p;.}../* .** Rec
4b20: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
4b30: 61 20 54 72 69 67 67 65 72 20 73 74 72 75 63 74  a Trigger struct
4b40: 75 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ure.*/.void sqli
4b50: 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72  te3DeleteTrigger
4b60: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 72  (sqlite3 *db, Tr
4b70: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 29  igger *pTrigger)
4b80: 7b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  {.  if( pTrigger
4b90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4ba0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
4bb0: 67 67 65 72 53 74 65 70 28 64 62 2c 20 70 54 72  ggerStep(db, pTr
4bc0: 69 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69 73 74  igger->step_list
4bd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4be0: 65 65 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d  ee(db, pTrigger-
4bf0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
4c00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 72  e3DbFree(db, pTr
4c10: 69 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 23  igger->table);.#
4c20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4c30: 42 4c 45 5f 53 48 41 52 45 44 5f 53 43 48 45 4d  BLE_SHARED_SCHEM
4c40: 41 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  A.  sqlite3DbFre
4c50: 65 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e  e(db, pTrigger->
4c60: 7a 54 61 62 53 63 68 65 6d 61 29 3b 0a 23 65 6e  zTabSchema);.#en
4c70: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70  dif.  sqlite3Exp
4c80: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54 72 69  rDelete(db, pTri
4c90: 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b 0a 20 20  gger->pWhen);.  
4ca0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
4cb0: 65 74 65 28 64 62 2c 20 70 54 72 69 67 67 65 72  ete(db, pTrigger
4cc0: 2d 3e 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73  ->pColumns);.  s
4cd0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4ce0: 20 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a 2f   pTrigger);.}../
4cf0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4d00: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
4d10: 64 72 6f 70 20 61 20 74 72 69 67 67 65 72 20 66  drop a trigger f
4d20: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4d30: 20 73 63 68 65 6d 61 2e 20 0a 2a 2a 0a 2a 2a 20   schema. .**.** 
4d40: 54 68 69 73 20 6d 61 79 20 62 65 20 63 61 6c 6c  This may be call
4d50: 65 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ed directly from
4d60: 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20   the parser and 
4d70: 74 68 65 72 65 66 6f 72 65 20 69 64 65 6e 74 69  therefore identi
4d80: 66 69 65 73 0a 2a 2a 20 74 68 65 20 74 72 69 67  fies.** the trig
4d90: 67 65 72 20 62 79 20 6e 61 6d 65 2e 20 20 54 68  ger by name.  Th
4da0: 65 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69  e sqlite3DropTri
4db0: 67 67 65 72 50 74 72 28 29 20 72 6f 75 74 69 6e  ggerPtr() routin
4dc0: 65 20 64 6f 65 73 20 74 68 65 0a 2a 2a 20 73 61  e does the.** sa
4dd0: 6d 65 20 6a 6f 62 20 61 73 20 74 68 69 73 20 72  me job as this r
4de0: 6f 75 74 69 6e 65 20 65 78 63 65 70 74 20 69 74  outine except it
4df0: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
4e00: 20 74 6f 20 74 68 65 20 74 72 69 67 67 65 72 0a   to the trigger.
4e10: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ** instead of th
4e20: 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 2e 0a  e trigger name..
4e30: 2a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  **/.void sqlite3
4e40: 44 72 6f 70 54 72 69 67 67 65 72 28 50 61 72 73  DropTrigger(Pars
4e50: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
4e60: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 6e  st *pName, int n
4e70: 6f 45 72 72 29 7b 0a 20 20 54 72 69 67 67 65 72  oErr){.  Trigger
4e80: 20 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a   *pTrigger = 0;.
4e90: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
4ea0: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f   char *zDb;.  co
4eb0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
4ec0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4ed0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
4ee0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
4ef0: 69 6c 65 64 20 29 20 67 6f 74 6f 20 64 72 6f 70  iled ) goto drop
4f00: 5f 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70  _trigger_cleanup
4f10: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
4f20: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
4f30: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
4f40: 20 20 20 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72      goto drop_tr
4f50: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
4f60: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e   }..  assert( pN
4f70: 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
4f80: 20 20 7a 44 62 20 3d 20 70 4e 61 6d 65 2d 3e 61    zDb = pName->a
4f90: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20  [0].zDatabase;. 
4fa0: 20 7a 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e   zName = pName->
4fb0: 61 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 61 73  a[0].zName;.  as
4fc0: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
4fd0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
4fe0: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
4ff0: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
5000: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
5010: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
5020: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
5030: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
5040: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
5050: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62  N */.    if( zDb
5060: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
5070: 6d 70 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44  mp(db->aDb[j].zD
5080: 62 53 4e 61 6d 65 2c 20 7a 44 62 29 20 29 20 63  bSName, zDb) ) c
5090: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
50a0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
50b0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
50c0: 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 72  j, 0) );.    pTr
50d0: 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 48  igger = sqlite3H
50e0: 61 73 68 46 69 6e 64 28 26 28 64 62 2d 3e 61 44  ashFind(&(db->aD
50f0: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72  b[j].pSchema->tr
5100: 69 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65 29 3b  igHash), zName);
5110: 0a 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65  .    if( pTrigge
5120: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  r ) break;.  }. 
5130: 20 69 66 28 20 21 70 54 72 69 67 67 65 72 20 29   if( !pTrigger )
5140: 7b 0a 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72  {.    if( !noErr
5150: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5160: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5170: 2c 20 22 6e 6f 20 73 75 63 68 20 74 72 69 67 67  , "no such trigg
5180: 65 72 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  er: %S", pName, 
5190: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
51a0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
51b0: 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
51c0: 61 28 70 50 61 72 73 65 2c 20 7a 44 62 29 3b 0a  a(pParse, zDb);.
51d0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
51e0: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
51f0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 64 72 6f 70  1;.    goto drop
5200: 5f 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70  _trigger_cleanup
5210: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
5220: 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
5230: 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
5240: 0a 0a 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63  ..drop_trigger_c
5250: 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
5260: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
5270: 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
5280: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
5290: 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
52a0: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  e structure for 
52b0: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 61  the table that a
52c0: 20 74 72 69 67 67 65 72 0a 2a 2a 20 69 73 20 73   trigger.** is s
52d0: 65 74 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  et on..*/.static
52e0: 20 54 61 62 6c 65 20 2a 74 61 62 6c 65 4f 66 54   Table *tableOfT
52f0: 72 69 67 67 65 72 28 54 72 69 67 67 65 72 20 2a  rigger(Trigger *
5300: 70 54 72 69 67 67 65 72 29 7b 0a 20 20 72 65 74  pTrigger){.  ret
5310: 75 72 6e 20 73 71 6c 69 74 65 33 48 61 73 68 46  urn sqlite3HashF
5320: 69 6e 64 28 26 70 54 72 69 67 67 65 72 2d 3e 70  ind(&pTrigger->p
5330: 54 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  TabSchema->tblHa
5340: 73 68 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61  sh, pTrigger->ta
5350: 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ble);.}.../*.** 
5360: 44 72 6f 70 20 61 20 74 72 69 67 67 65 72 20 67  Drop a trigger g
5370: 69 76 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  iven a pointer t
5380: 6f 20 74 68 61 74 20 74 72 69 67 67 65 72 2e 20  o that trigger. 
5390: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
53a0: 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 50  DropTriggerPtr(P
53b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 72  arse *pParse, Tr
53c0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 29  igger *pTrigger)
53d0: 7b 0a 20 20 54 61 62 6c 65 20 20 20 2a 70 54 61  {.  Table   *pTa
53e0: 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ble;.  Vdbe *v;.
53f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5400: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
5410: 74 20 69 44 62 3b 0a 0a 20 20 69 44 62 20 3d 20  t iDb;..  iDb = 
5420: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
5430: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
5440: 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
5450: 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
5460: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
5470: 3e 6e 44 62 20 29 3b 0a 20 20 73 71 6c 69 74 65  >nDb );.  sqlite
5480: 33 53 63 68 65 6d 61 57 72 69 74 61 62 6c 65 28  3SchemaWritable(
5490: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
54a0: 70 54 61 62 6c 65 20 3d 20 74 61 62 6c 65 4f 66  pTable = tableOf
54b0: 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72  Trigger(pTrigger
54c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
54d0: 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
54e0: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
54f0: 3d 3d 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68  ==pTrigger->pSch
5500: 65 6d 61 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  ema || iDb==1 );
5510: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5520: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
5530: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
5540: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
5550: 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 63  P_TRIGGER;.    c
5560: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
5570: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
5580: 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  bSName;.    cons
5590: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
55a0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
55b0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31  ;.    if( iDb==1
55c0: 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
55d0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  _DROP_TEMP_TRIGG
55e0: 45 52 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ER;.    if( sqli
55f0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
5600: 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 72 69 67  rse, code, pTrig
5610: 67 65 72 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  ger->zName, pTab
5620: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  le->zName, zDb) 
5630: 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ||.      sqlite3
5640: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
5650: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
5660: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
5670: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
5680: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
5690: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
56a0: 63 6f 64 65 20 74 6f 20 64 65 73 74 72 6f 79 20  code to destroy 
56b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 63  the database rec
56c0: 6f 72 64 20 6f 66 20 74 68 65 20 74 72 69 67 67  ord of the trigg
56d0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  er..  */.  asser
56e0: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a  t( pTable!=0 );.
56f0: 20 20 69 66 28 20 28 76 20 3d 20 73 71 6c 69 74    if( (v = sqlit
5700: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
5710: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
5720: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
5730: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
5740: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
5750: 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20  s WHERE name=%Q 
5760: 41 4e 44 20 74 79 70 65 3d 27 74 72 69 67 67 65  AND type='trigge
5770: 72 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  r'",.       db->
5780: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
5790: 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
57a0: 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 0a  pTrigger->zName.
57b0: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
57c0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
57d0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
57e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
57f0: 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 72 69  p4(v, OP_DropTri
5800: 67 67 65 72 2c 20 69 44 62 2c 20 30 2c 20 30 2c  gger, iDb, 0, 0,
5810: 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65   pTrigger->zName
5820: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
5830: 2a 2a 20 52 65 6d 6f 76 65 20 61 20 74 72 69 67  ** Remove a trig
5840: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ger from the has
5850: 68 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  h tables of the 
5860: 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 2e  sqlite* pointer.
5870: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5880: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
5890: 72 69 67 67 65 72 28 73 71 6c 69 74 65 33 20 2a  rigger(sqlite3 *
58a0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
58b0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
58c0: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
58d0: 67 67 65 72 3b 0a 20 20 48 61 73 68 20 2a 70 48  gger;.  Hash *pH
58e0: 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ash;..  assert( 
58f0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
5900: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
5910: 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20  0) );.  pHash = 
5920: 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  &(db->aDb[iDb].p
5930: 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68  Schema->trigHash
5940: 29 3b 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  );.  pTrigger = 
5950: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
5960: 74 28 70 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  t(pHash, zName, 
5970: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
5980: 28 70 54 72 69 67 67 65 72 29 20 29 7b 0a 20 20  (pTrigger) ){.  
5990: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e    if( pTrigger->
59a0: 70 53 63 68 65 6d 61 3d 3d 70 54 72 69 67 67 65  pSchema==pTrigge
59b0: 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 29 7b  r->pTabSchema ){
59c0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
59d0: 61 62 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 67  ab = tableOfTrig
59e0: 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20  ger(pTrigger);. 
59f0: 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 2a 70       Trigger **p
5a00: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d  p;.      for(pp=
5a10: 26 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b  &pTab->pTrigger;
5a20: 20 2a 70 70 21 3d 70 54 72 69 67 67 65 72 3b 20   *pp!=pTrigger; 
5a30: 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78  pp=&((*pp)->pNex
5a40: 74 29 29 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d  t));.      *pp =
5a50: 20 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b 0a 20   (*pp)->pNext;. 
5a60: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5a70: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62  DeleteTrigger(db
5a80: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  , pTrigger);.   
5a90: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d   db->mDbFlags |=
5aa0: 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
5ab0: 61 6e 67 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ange;.  }.}../*.
5ac0: 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 74 68 65  ** pEList is the
5ad0: 20 53 45 54 20 63 6c 61 75 73 65 20 6f 66 20 61   SET clause of a
5ae0: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
5af0: 6e 74 2e 20 20 45 61 63 68 20 65 6e 74 72 79 0a  nt.  Each entry.
5b00: 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 69 73 20  ** in pEList is 
5b10: 6f 66 20 74 68 65 20 66 6f 72 6d 61 74 20 3c 69  of the format <i
5b20: 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49 66 20 61  d>=<expr>.  If a
5b30: 6e 79 20 6f 66 20 74 68 65 20 65 6e 74 72 69 65  ny of the entrie
5b40: 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 68  s.** in pEList h
5b50: 61 76 65 20 61 6e 20 3c 69 64 3e 20 77 68 69 63  ave an <id> whic
5b60: 68 20 6d 61 74 63 68 65 73 20 61 6e 20 69 64 65  h matches an ide
5b70: 6e 74 69 66 69 65 72 20 69 6e 20 70 49 64 4c 69  ntifier in pIdLi
5b80: 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  st,.** then retu
5b90: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 70 49 64  rn TRUE.  If pId
5ba0: 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  List==NULL, then
5bb0: 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65   it is considere
5bc0: 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61 72 64 20  d a.** wildcard 
5bd0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79  that matches any
5be0: 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77 69 73 65  thing.  Likewise
5bf0: 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55 4c 4c   if pEList==NULL
5c00: 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d 61 74 63   then.** it matc
5c10: 68 65 73 20 61 6e 79 74 68 69 6e 67 20 73 6f 20  hes anything so 
5c20: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 72  always return tr
5c30: 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ue.  Return fals
5c40: 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 65  e only.** if the
5c50: 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2e 0a  re is no match..
5c60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
5c70: 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70  eckColumnOverlap
5c80: 28 49 64 4c 69 73 74 20 2a 70 49 64 4c 69 73 74  (IdList *pIdList
5c90: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
5ca0: 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b 0a 20 20  st){.  int e;.  
5cb0: 69 66 28 20 70 49 64 4c 69 73 74 3d 3d 30 20 7c  if( pIdList==0 |
5cc0: 7c 20 4e 45 56 45 52 28 70 45 4c 69 73 74 3d 3d  | NEVER(pEList==
5cd0: 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
5ce0: 20 66 6f 72 28 65 3d 30 3b 20 65 3c 70 45 4c 69   for(e=0; e<pELi
5cf0: 73 74 2d 3e 6e 45 78 70 72 3b 20 65 2b 2b 29 7b  st->nExpr; e++){
5d00: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
5d10: 49 64 4c 69 73 74 49 6e 64 65 78 28 70 49 64 4c  IdListIndex(pIdL
5d20: 69 73 74 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 65  ist, pEList->a[e
5d30: 5d 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 20 72 65  ].zName)>=0 ) re
5d40: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
5d50: 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  turn 0; .}../*.*
5d60: 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  * Return a list 
5d70: 6f 66 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  of all triggers 
5d80: 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 20 69 66  on table pTab if
5d90: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 74   there exists at
5da0: 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 74 72   least.** one tr
5db0: 69 67 67 65 72 20 74 68 61 74 20 6d 75 73 74 20  igger that must 
5dc0: 62 65 20 66 69 72 65 64 20 77 68 65 6e 20 61 6e  be fired when an
5dd0: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 79   operation of ty
5de0: 70 65 20 27 6f 70 27 20 69 73 20 0a 2a 2a 20 70  pe 'op' is .** p
5df0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
5e00: 74 61 62 6c 65 2c 20 61 6e 64 2c 20 69 66 20 74  table, and, if t
5e10: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  hat operation is
5e20: 20 61 6e 20 55 50 44 41 54 45 2c 20 69 66 20 61   an UPDATE, if a
5e30: 74 0a 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20 6f  t.** least one o
5e40: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
5e50: 20 70 43 68 61 6e 67 65 73 20 69 73 20 62 65 69   pChanges is bei
5e60: 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a  ng modified..*/.
5e70: 54 72 69 67 67 65 72 20 2a 73 71 6c 69 74 65 33  Trigger *sqlite3
5e80: 54 72 69 67 67 65 72 73 45 78 69 73 74 28 0a 20  TriggersExist(. 
5e90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
5eb0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
5ec0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
5ed0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
5ee0: 62 6c 65 20 74 68 65 20 63 6f 6e 74 61 69 6e 73  ble the contains
5ef0: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 2a 2f   the triggers */
5f00: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
5f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e             /* on
5f20: 65 20 6f 66 20 54 4b 5f 44 45 4c 45 54 45 2c 20  e of TK_DELETE, 
5f30: 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50  TK_INSERT, TK_UP
5f40: 44 41 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69  DATE */.  ExprLi
5f50: 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 20  st *pChanges,   
5f60: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74 68 61    /* Columns tha
5f70: 74 20 63 68 61 6e 67 65 20 69 6e 20 61 6e 20 55  t change in an U
5f80: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
5f90: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4d 61 73 6b 20  */.  int *pMask 
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5fb0: 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 54 52 49  OUT: Mask of TRI
5fc0: 47 47 45 52 5f 42 45 46 4f 52 45 7c 54 52 49 47  GGER_BEFORE|TRIG
5fd0: 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 29 7b 0a  GER_AFTER */.){.
5fe0: 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a    int mask = 0;.
5ff0: 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 73 74    Trigger *pList
6000: 20 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72 20   = 0;.  Trigger 
6010: 2a 70 3b 0a 0a 20 20 69 66 28 20 28 70 50 61 72  *p;..  if( (pPar
6020: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
6030: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
6040: 67 67 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  gger)!=0 ){.    
6050: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 54  pList = sqlite3T
6060: 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73  riggerList(pPars
6070: 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20  e, pTab);.  }.  
6080: 61 73 73 65 72 74 28 20 70 4c 69 73 74 3d 3d 30  assert( pList==0
6090: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54   || IsVirtual(pT
60a0: 61 62 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ab)==0 );.  for(
60b0: 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
60c0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
60d0: 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 63 68   p->op==op && ch
60e0: 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70  eckColumnOverlap
60f0: 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70 43  (p->pColumns, pC
6100: 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20 20 20  hanges) ){.     
6110: 20 6d 61 73 6b 20 7c 3d 20 70 2d 3e 74 72 5f 74   mask |= p->tr_t
6120: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  m;.    }.  }.  i
6130: 66 28 20 70 4d 61 73 6b 20 29 7b 0a 20 20 20 20  f( pMask ){.    
6140: 2a 70 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 20  *pMask = mask;. 
6150: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 6d 61 73   }.  return (mas
6160: 6b 20 3f 20 70 4c 69 73 74 20 3a 20 30 29 3b 0a  k ? pList : 0);.
6170: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
6180: 20 74 68 65 20 70 53 74 65 70 2d 3e 7a 54 61 72   the pStep->zTar
6190: 67 65 74 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  get string into 
61a0: 61 20 53 72 63 4c 69 73 74 20 61 6e 64 20 72 65  a SrcList and re
61b0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
61c0: 2a 20 74 6f 20 74 68 61 74 20 53 72 63 4c 69 73  * to that SrcLis
61d0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
61e0: 75 74 69 6e 65 20 61 64 64 73 20 61 20 73 70 65  utine adds a spe
61f0: 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20 6e  cific database n
6200: 61 6d 65 2c 20 69 66 20 6e 65 65 64 65 64 2c 20  ame, if needed, 
6210: 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 77 68  to the target wh
6220: 65 6e 0a 2a 2a 20 66 6f 72 6d 69 6e 67 20 74 68  en.** forming th
6230: 65 20 53 72 63 4c 69 73 74 2e 20 20 54 68 69 73  e SrcList.  This
6240: 20 70 72 65 76 65 6e 74 73 20 61 20 74 72 69 67   prevents a trig
6250: 67 65 72 20 69 6e 20 6f 6e 65 20 64 61 74 61 62  ger in one datab
6260: 61 73 65 20 66 72 6f 6d 0a 2a 2a 20 72 65 66 65  ase from.** refe
6270: 72 72 69 6e 67 20 74 6f 20 61 20 74 61 72 67 65  rring to a targe
6280: 74 20 69 6e 20 61 6e 6f 74 68 65 72 20 64 61 74  t in another dat
6290: 61 62 61 73 65 2e 20 20 41 6e 20 65 78 63 65 70  abase.  An excep
62a0: 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 74 68 65  tion is when the
62b0: 0a 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20 69  .** trigger is i
62c0: 6e 20 54 45 4d 50 20 69 6e 20 77 68 69 63 68 20  n TEMP in which 
62d0: 63 61 73 65 20 69 74 20 63 61 6e 20 72 65 66 65  case it can refe
62e0: 72 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 64  r to any other d
62f0: 61 74 61 62 61 73 65 20 69 74 0a 2a 2a 20 77 61  atabase it.** wa
6300: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  nts..*/.static S
6310: 72 63 4c 69 73 74 20 2a 74 61 72 67 65 74 53 72  rcList *targetSr
6320: 63 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  cList(.  Parse *
6330: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
6340: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
6350: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
6360: 72 53 74 65 70 20 2a 70 53 74 65 70 20 20 20 2f  rStep *pStep   /
6370: 2a 20 54 68 65 20 74 72 69 67 67 65 72 20 63 6f  * The trigger co
6380: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 72  ntaining the tar
6390: 67 65 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  get token */.){.
63a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
63b0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
63c0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
63d0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 75  he database to u
63f0: 73 65 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  se */.  SrcList 
6400: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 2f 2a 20  *pSrc;       /* 
6410: 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 72 65  SrcList to be re
6420: 74 75 72 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  turned */..  pSr
6430: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
6440: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
6450: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
6460: 20 70 53 72 63 20 29 7b 0a 20 20 20 20 61 73 73   pSrc ){.    ass
6470: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
6480: 30 20 29 3b 0a 20 20 20 20 70 53 72 63 2d 3e 61  0 );.    pSrc->a
6490: 5b 70 53 72 63 2d 3e 6e 53 72 63 2d 31 5d 2e 7a  [pSrc->nSrc-1].z
64a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
64b0: 53 74 72 44 75 70 28 64 62 2c 20 70 53 74 65 70  StrDup(db, pStep
64c0: 2d 3e 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20  ->zTarget);.    
64d0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
64e0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
64f0: 53 74 65 70 2d 3e 70 54 72 69 67 2d 3e 70 53 63  Step->pTrig->pSc
6500: 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 69  hema);.    if( i
6510: 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 3d 32 20  Db==0 || iDb>=2 
6520: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
6530: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 20 20  har *zDb;.      
6540: 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
6550: 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 7a 44 62  nDb );.      zDb
6560: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
6570: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zDbSName;.      
6580: 70 53 72 63 2d 3e 61 5b 70 53 72 63 2d 3e 6e 53  pSrc->a[pSrc->nS
6590: 72 63 2d 31 5d 2e 7a 44 61 74 61 62 61 73 65 20  rc-1].zDatabase 
65a0: 3d 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44  =  sqlite3DbStrD
65b0: 75 70 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  up(db, zDb);.   
65c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
65d0: 70 53 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pSrc;.}../*.** G
65e0: 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
65f0: 65 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  e for the statem
6600: 65 6e 74 73 20 69 6e 73 69 64 65 20 74 68 65 20  ents inside the 
6610: 62 6f 64 79 20 6f 66 20 61 20 73 69 6e 67 6c 65  body of a single
6620: 20 0a 2a 2a 20 74 72 69 67 67 65 72 2e 0a 2a 2f   .** trigger..*/
6630: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
6640: 54 72 69 67 67 65 72 50 72 6f 67 72 61 6d 28 0a  TriggerProgram(.
6650: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6670: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
6680: 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74  t */.  TriggerSt
6690: 65 70 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 20  ep *pStepList,  
66a0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 73 74 61 74   /* List of stat
66b0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 20 74 68  ements inside th
66c0: 65 20 74 72 69 67 67 65 72 20 62 6f 64 79 20 2a  e trigger body *
66d0: 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20  /.  int orconf  
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
66f0: 20 43 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69   Conflict algori
6700: 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20  thm. (OE_Abort, 
6710: 65 74 63 29 20 2a 2f 20 20 0a 29 7b 0a 20 20 54  etc) */  .){.  T
6720: 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65  riggerStep *pSte
6730: 70 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  p;.  Vdbe *v = p
6740: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6750: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6760: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
6770: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 54 72  ert( pParse->pTr
6780: 69 67 67 65 72 54 61 62 20 26 26 20 70 50 61 72  iggerTab && pPar
6790: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 20 29 3b  se->pToplevel );
67a0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 74 65 70  .  assert( pStep
67b0: 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74  List );.  assert
67c0: 28 20 76 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ( v!=0 );.  for(
67d0: 70 53 74 65 70 3d 70 53 74 65 70 4c 69 73 74 3b  pStep=pStepList;
67e0: 20 70 53 74 65 70 3b 20 70 53 74 65 70 3d 70 53   pStep; pStep=pS
67f0: 74 65 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  tep->pNext){.   
6800: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
6810: 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70  he ON CONFLICT p
6820: 6f 6c 69 63 79 20 74 68 61 74 20 77 69 6c 6c 20  olicy that will 
6830: 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  be used for this
6840: 20 73 74 65 70 0a 20 20 20 20 2a 2a 20 6f 66 20   step.    ** of 
6850: 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
6860: 72 61 6d 2e 20 49 66 20 74 68 65 20 73 74 61 74  ram. If the stat
6870: 65 6d 65 6e 74 20 74 68 61 74 20 63 61 75 73 65  ement that cause
6880: 64 20 74 68 69 73 20 74 72 69 67 67 65 72 0a 20  d this trigger. 
6890: 20 20 20 2a 2a 20 74 6f 20 66 69 72 65 20 68 61     ** to fire ha
68a0: 64 20 61 6e 20 65 78 70 6c 69 63 69 74 20 4f 4e  d an explicit ON
68b0: 20 43 4f 4e 46 4c 49 43 54 2c 20 74 68 65 6e 20   CONFLICT, then 
68c0: 75 73 65 20 69 74 2e 20 4f 74 68 65 72 77 69 73  use it. Otherwis
68d0: 65 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  e, use.    ** th
68e0: 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f  e ON CONFLICT po
68f0: 6c 69 63 79 20 74 68 61 74 20 77 61 73 20 73 70  licy that was sp
6900: 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
6910: 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 0a 20  of the trigger. 
6920: 20 20 20 2a 2a 20 73 74 65 70 20 73 74 61 74 65     ** step state
6930: 6d 65 6e 74 2e 20 45 78 61 6d 70 6c 65 3a 0a 20  ment. Example:. 
6940: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43     **.    **   C
6950: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 41 46  REATE TRIGGER AF
6960: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
6970: 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20   BEGIN;.    **  
6980: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50     INSERT OR REP
6990: 4c 41 43 45 20 49 4e 54 4f 20 74 32 20 56 41 4c  LACE INTO t2 VAL
69a0: 55 45 53 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62  UES(new.a, new.b
69b0: 29 3b 0a 20 20 20 20 2a 2a 20 20 20 45 4e 44 3b  );.    **   END;
69c0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
69d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
69e0: 2e 2e 2e 20 3b 20 20 20 20 20 20 20 20 20 20 20  ... ;           
69f0: 20 2d 2d 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   -- insert into 
6a00: 74 32 20 75 73 65 73 20 52 45 50 4c 41 43 45 20  t2 uses REPLACE 
6a10: 70 6f 6c 69 63 79 0a 20 20 20 20 2a 2a 20 20 20  policy.    **   
6a20: 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
6a30: 20 49 4e 54 4f 20 74 31 20 2e 2e 2e 20 3b 20 20   INTO t1 ... ;  
6a40: 2d 2d 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74  -- insert into t
6a50: 32 20 75 73 65 73 20 49 47 4e 4f 52 45 20 70 6f  2 uses IGNORE po
6a60: 6c 69 63 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  licy.    */.    
6a70: 70 50 61 72 73 65 2d 3e 65 4f 72 63 6f 6e 66 20  pParse->eOrconf 
6a80: 3d 20 28 6f 72 63 6f 6e 66 3d 3d 4f 45 5f 44 65  = (orconf==OE_De
6a90: 66 61 75 6c 74 29 3f 70 53 74 65 70 2d 3e 6f 72  fault)?pStep->or
6aa0: 63 6f 6e 66 3a 28 75 38 29 6f 72 63 6f 6e 66 3b  conf:(u8)orconf;
6ab0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
6ac0: 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
6ad0: 6f 72 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65  or==0 );..#ifnde
6ae0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
6af0: 41 43 45 0a 20 20 20 20 69 66 28 20 70 53 74 65  ACE.    if( pSte
6b00: 70 2d 3e 7a 53 70 61 6e 20 29 7b 0a 20 20 20 20  p->zSpan ){.    
6b10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6b20: 4f 70 34 28 76 2c 20 4f 50 5f 54 72 61 63 65 2c  Op4(v, OP_Trace,
6b30: 20 30 78 37 66 66 66 66 66 66 66 2c 20 31 2c 20   0x7fffffff, 1, 
6b40: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
6b50: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6b60: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d  e3MPrintf(db, "-
6b70: 2d 20 25 73 22 2c 20 70 53 74 65 70 2d 3e 7a 53  - %s", pStep->zS
6b80: 70 61 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  pan),.          
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
6ba0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
6bb0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69  .#endif..    swi
6bc0: 74 63 68 28 20 70 53 74 65 70 2d 3e 6f 70 20 29  tch( pStep->op )
6bd0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  {.      case TK_
6be0: 55 50 44 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  UPDATE: {.      
6bf0: 20 20 73 71 6c 69 74 65 33 55 70 64 61 74 65 28    sqlite3Update(
6c00: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
6c10: 20 20 20 74 61 72 67 65 74 53 72 63 4c 69 73 74     targetSrcList
6c20: 28 70 50 61 72 73 65 2c 20 70 53 74 65 70 29 2c  (pParse, pStep),
6c30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6c40: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
6c50: 2c 20 70 53 74 65 70 2d 3e 70 45 78 70 72 4c 69  , pStep->pExprLi
6c60: 73 74 2c 20 30 29 2c 20 0a 20 20 20 20 20 20 20  st, 0), .       
6c70: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
6c80: 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 57 68  p(db, pStep->pWh
6c90: 65 72 65 2c 20 30 29 2c 20 0a 20 20 20 20 20 20  ere, 0), .      
6ca0: 20 20 20 20 70 50 61 72 73 65 2d 3e 65 4f 72 63      pParse->eOrc
6cb0: 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20  onf, 0, 0, 0.   
6cc0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
6cd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6ce0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 53       case TK_INS
6cf0: 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ERT: {.        s
6d00: 71 6c 69 74 65 33 49 6e 73 65 72 74 28 70 50 61  qlite3Insert(pPa
6d10: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
6d20: 74 61 72 67 65 74 53 72 63 4c 69 73 74 28 70 50  targetSrcList(pP
6d30: 61 72 73 65 2c 20 70 53 74 65 70 29 2c 0a 20 20  arse, pStep),.  
6d40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
6d50: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 74  electDup(db, pSt
6d60: 65 70 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 2c  ep->pSelect, 0),
6d70: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
6d80: 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c  te3IdListDup(db,
6d90: 20 70 53 74 65 70 2d 3e 70 49 64 4c 69 73 74 29   pStep->pIdList)
6da0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  , .          pPa
6db0: 72 73 65 2d 3e 65 4f 72 63 6f 6e 66 2c 0a 20 20  rse->eOrconf,.  
6dc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 55          sqlite3U
6dd0: 70 73 65 72 74 44 75 70 28 64 62 2c 20 70 53 74  psertDup(db, pSt
6de0: 65 70 2d 3e 70 55 70 73 65 72 74 29 0a 20 20 20  ep->pUpsert).   
6df0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
6e00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6e10: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 44 45 4c       case TK_DEL
6e20: 45 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ETE: {.        s
6e30: 71 6c 69 74 65 33 44 65 6c 65 74 65 46 72 6f 6d  qlite3DeleteFrom
6e40: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
6e50: 20 20 20 20 74 61 72 67 65 74 53 72 63 4c 69 73      targetSrcLis
6e60: 74 28 70 50 61 72 73 65 2c 20 70 53 74 65 70 29  t(pParse, pStep)
6e70: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
6e80: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
6e90: 53 74 65 70 2d 3e 70 57 68 65 72 65 2c 20 30 29  Step->pWhere, 0)
6ea0: 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 20 20 29  , 0, 0.        )
6eb0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6ec0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
6ed0: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
6ee0: 70 53 74 65 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pStep->op==TK_SE
6ef0: 4c 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  LECT ); {.      
6f00: 20 20 53 65 6c 65 63 74 44 65 73 74 20 73 44 65    SelectDest sDe
6f10: 73 74 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65  st;.        Sele
6f20: 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 73 71  ct *pSelect = sq
6f30: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
6f40: 62 2c 20 70 53 74 65 70 2d 3e 70 53 65 6c 65 63  b, pStep->pSelec
6f50: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 0);.        s
6f60: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
6f70: 49 6e 69 74 28 26 73 44 65 73 74 2c 20 53 52 54  Init(&sDest, SRT
6f80: 5f 44 69 73 63 61 72 64 2c 20 30 29 3b 0a 20 20  _Discard, 0);.  
6f90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
6fa0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
6fb0: 65 63 74 2c 20 26 73 44 65 73 74 29 3b 0a 20 20  ect, &sDest);.  
6fc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
6fd0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
6fe0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
6ff0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
7000: 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 70 53     } .    if( pS
7010: 74 65 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  tep->op!=TK_SELE
7020: 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT ){.      sqli
7030: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
7040: 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 29 3b   OP_ResetCount);
7050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
7060: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
7070: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7080: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
7090: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
70a0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
70b0: 61 64 64 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  add VdbeComment(
70c0: 29 20 61 6e 6e 6f 74 61 74 69 6f 6e 73 20 74 6f  ) annotations to
70d0: 20 61 20 56 44 42 45 0a 2a 2a 20 70 72 6f 67 72   a VDBE.** progr
70e0: 61 6d 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  am. It is not us
70f0: 65 64 20 69 6e 20 70 72 6f 64 75 63 74 69 6f 6e  ed in production
7100: 20 63 6f 64 65 2c 20 6f 6e 6c 79 20 66 6f 72 20   code, only for 
7110: 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 73 74  debugging..*/.st
7120: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
7130: 2a 6f 6e 45 72 72 6f 72 54 65 78 74 28 69 6e 74  *onErrorText(int
7140: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 73 77 69   onError){.  swi
7150: 74 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a  tch( onError ){.
7160: 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72      case OE_Abor
7170: 74 3a 20 20 20 20 72 65 74 75 72 6e 20 22 61 62  t:    return "ab
7180: 6f 72 74 22 3b 0a 20 20 20 20 63 61 73 65 20 4f  ort";.    case O
7190: 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 72 65 74 75  E_Rollback: retu
71a0: 72 6e 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 0a 20  rn "rollback";. 
71b0: 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a     case OE_Fail:
71c0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 66 61 69       return "fai
71d0: 6c 22 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  l";.    case OE_
71e0: 52 65 70 6c 61 63 65 3a 20 20 72 65 74 75 72 6e  Replace:  return
71f0: 20 22 72 65 70 6c 61 63 65 22 3b 0a 20 20 20 20   "replace";.    
7200: 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20  case OE_Ignore: 
7210: 20 20 72 65 74 75 72 6e 20 22 69 67 6e 6f 72 65    return "ignore
7220: 22 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 44  ";.    case OE_D
7230: 65 66 61 75 6c 74 3a 20 20 72 65 74 75 72 6e 20  efault:  return 
7240: 22 64 65 66 61 75 6c 74 22 3b 0a 20 20 7d 0a 20  "default";.  }. 
7250: 20 72 65 74 75 72 6e 20 22 6e 2f 61 22 3b 0a 7d   return "n/a";.}
7260: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
7270: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 73 74 72  arse context str
7280: 75 63 74 75 72 65 20 70 46 72 6f 6d 20 68 61 73  ucture pFrom has
7290: 20 6a 75 73 74 20 62 65 65 6e 20 75 73 65 64 20   just been used 
72a0: 74 6f 20 63 72 65 61 74 65 20 61 20 73 75 62 2d  to create a sub-
72b0: 76 64 62 65 0a 2a 2a 20 28 74 72 69 67 67 65 72  vdbe.** (trigger
72c0: 20 70 72 6f 67 72 61 6d 29 2e 20 49 66 20 61 6e   program). If an
72d0: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
72e0: 72 65 64 2c 20 74 72 61 6e 73 66 65 72 20 65 72  red, transfer er
72f0: 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ror information.
7300: 2a 2a 20 66 72 6f 6d 20 70 46 72 6f 6d 20 74 6f  ** from pFrom to
7310: 20 70 54 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pTo..*/.static 
7320: 76 6f 69 64 20 74 72 61 6e 73 66 65 72 50 61 72  void transferPar
7330: 73 65 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  seError(Parse *p
7340: 54 6f 2c 20 50 61 72 73 65 20 2a 70 46 72 6f 6d  To, Parse *pFrom
7350: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 72  ){.  assert( pFr
7360: 6f 6d 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30 20 7c  om->zErrMsg==0 |
7370: 7c 20 70 46 72 6f 6d 2d 3e 6e 45 72 72 20 29 3b  | pFrom->nErr );
7380: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 2d 3e  .  assert( pTo->
7390: 7a 45 72 72 4d 73 67 3d 3d 30 20 7c 7c 20 70 54  zErrMsg==0 || pT
73a0: 6f 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 69 66 28  o->nErr );.  if(
73b0: 20 70 54 6f 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b   pTo->nErr==0 ){
73c0: 0a 20 20 20 20 70 54 6f 2d 3e 7a 45 72 72 4d 73  .    pTo->zErrMs
73d0: 67 20 3d 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d  g = pFrom->zErrM
73e0: 73 67 3b 0a 20 20 20 20 70 54 6f 2d 3e 6e 45 72  sg;.    pTo->nEr
73f0: 72 20 3d 20 70 46 72 6f 6d 2d 3e 6e 45 72 72 3b  r = pFrom->nErr;
7400: 0a 20 20 20 20 70 54 6f 2d 3e 72 63 20 3d 20 70  .    pTo->rc = p
7410: 46 72 6f 6d 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73  From->rc;.  }els
7420: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
7430: 46 72 65 65 28 70 46 72 6f 6d 2d 3e 64 62 2c 20  Free(pFrom->db, 
7440: 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67 29 3b  pFrom->zErrMsg);
7450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
7460: 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  eate and populat
7470: 65 20 61 20 6e 65 77 20 54 72 69 67 67 65 72 50  e a new TriggerP
7480: 72 67 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61  rg object with a
7490: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 0a 2a 2a   sub-program .**
74a0: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 72   implementing tr
74b0: 69 67 67 65 72 20 70 54 72 69 67 67 65 72 20 77  igger pTrigger w
74c0: 69 74 68 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ith ON CONFLICT 
74d0: 70 6f 6c 69 63 79 20 6f 72 63 6f 6e 66 2e 0a 2a  policy orconf..*
74e0: 2f 0a 73 74 61 74 69 63 20 54 72 69 67 67 65 72  /.static Trigger
74f0: 50 72 67 20 2a 63 6f 64 65 52 6f 77 54 72 69 67  Prg *codeRowTrig
7500: 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ger(.  Parse *pP
7510: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 43  arse,       /* C
7520: 75 72 72 65 6e 74 20 70 61 72 73 65 20 63 6f 6e  urrent parse con
7530: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
7540: 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f  r *pTrigger,   /
7550: 2a 20 54 72 69 67 67 65 72 20 74 6f 20 63 6f 64  * Trigger to cod
7560: 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
7570: 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab,         /* T
7580: 68 65 20 74 61 62 6c 65 20 70 54 72 69 67 67 65  he table pTrigge
7590: 72 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  r is attached to
75a0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66   */.  int orconf
75b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e             /* ON
75c0: 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79   CONFLICT policy
75d0: 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72   to code trigger
75e0: 20 70 72 6f 67 72 61 6d 20 77 69 74 68 20 2a 2f   program with */
75f0: 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  .){.  Parse *pTo
7600: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  p = sqlite3Parse
7610: 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
7620: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7630: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
7640: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
7650: 6c 65 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 50  le */.  TriggerP
7660: 72 67 20 2a 70 50 72 67 3b 20 20 20 20 20 20 20  rg *pPrg;       
7670: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
7680: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 45 78 70 72  return */.  Expr
7690: 20 2a 70 57 68 65 6e 20 3d 20 30 3b 20 20 20 20   *pWhen = 0;    
76a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 75 70 6c 69          /* Dupli
76b0: 63 61 74 65 20 6f 66 20 74 72 69 67 67 65 72 20  cate of trigger 
76c0: 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  WHEN expression 
76d0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76f0: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 56 4d   /* Temporary VM
7700: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
7710: 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20  t sNC;          
7720: 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
7730: 74 20 66 6f 72 20 73 75 62 2d 76 64 62 65 20 2a  t for sub-vdbe *
7740: 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
7750: 70 50 72 6f 67 72 61 6d 20 3d 20 30 3b 20 20 20  pProgram = 0;   
7760: 2f 2a 20 53 75 62 2d 76 64 62 65 20 66 6f 72 20  /* Sub-vdbe for 
7770: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
7780: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 53 75 62  */.  Parse *pSub
7790: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
77a0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
77b0: 74 20 66 6f 72 20 73 75 62 2d 76 64 62 65 20 2a  t for sub-vdbe *
77c0: 2f 0a 20 20 69 6e 74 20 69 45 6e 64 54 72 69 67  /.  int iEndTrig
77d0: 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ger = 0;        
77e0: 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  /* Label to jump
77f0: 20 74 6f 20 69 66 20 57 48 45 4e 20 69 73 20 66   to if WHEN is f
7800: 61 6c 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  alse */..  asser
7810: 74 28 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61  t( pTrigger->zNa
7820: 6d 65 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 74  me==0 || pTab==t
7830: 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28 70 54  ableOfTrigger(pT
7840: 72 69 67 67 65 72 29 20 29 3b 0a 20 20 61 73 73  rigger) );.  ass
7850: 65 72 74 28 20 70 54 6f 70 2d 3e 70 56 64 62 65  ert( pTop->pVdbe
7860: 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
7870: 74 65 20 74 68 65 20 54 72 69 67 67 65 72 50 72  te the TriggerPr
7880: 67 20 61 6e 64 20 53 75 62 50 72 6f 67 72 61 6d  g and SubProgram
7890: 20 6f 62 6a 65 63 74 73 2e 20 54 6f 20 65 6e 73   objects. To ens
78a0: 75 72 65 20 74 68 61 74 20 74 68 65 79 0a 20 20  ure that they.  
78b0: 2a 2a 20 61 72 65 20 66 72 65 65 64 20 69 66 20  ** are freed if 
78c0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
78d0: 20 6c 69 6e 6b 20 74 68 65 6d 20 69 6e 74 6f 20   link them into 
78e0: 74 68 65 20 50 61 72 73 65 2e 70 54 72 69 67 67  the Parse.pTrigg
78f0: 65 72 50 72 67 20 0a 20 20 2a 2a 20 6c 69 73 74  erPrg .  ** list
7900: 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
7910: 6c 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 73  l Parse object s
7920: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
7930: 6e 20 6c 61 74 65 72 2e 20 20 2a 2f 0a 20 20 70  n later.  */.  p
7940: 50 72 67 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Prg = sqlite3DbM
7950: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
7960: 7a 65 6f 66 28 54 72 69 67 67 65 72 50 72 67 29  zeof(TriggerPrg)
7970: 29 3b 0a 20 20 69 66 28 20 21 70 50 72 67 20 29  );.  if( !pPrg )
7980: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 50 72   return 0;.  pPr
7990: 67 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6f 70 2d  g->pNext = pTop-
79a0: 3e 70 54 72 69 67 67 65 72 50 72 67 3b 0a 20 20  >pTriggerPrg;.  
79b0: 70 54 6f 70 2d 3e 70 54 72 69 67 67 65 72 50 72  pTop->pTriggerPr
79c0: 67 20 3d 20 70 50 72 67 3b 0a 20 20 70 50 72 67  g = pPrg;.  pPrg
79d0: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 50 72  ->pProgram = pPr
79e0: 6f 67 72 61 6d 20 3d 20 73 71 6c 69 74 65 33 44  ogram = sqlite3D
79f0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
7a00: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
7a10: 6d 29 29 3b 0a 20 20 69 66 28 20 21 70 50 72 6f  m));.  if( !pPro
7a20: 67 72 61 6d 20 29 20 72 65 74 75 72 6e 20 30 3b  gram ) return 0;
7a30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  .  sqlite3VdbeLi
7a40: 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 70 54 6f  nkSubProgram(pTo
7a50: 70 2d 3e 70 56 64 62 65 2c 20 70 50 72 6f 67 72  p->pVdbe, pProgr
7a60: 61 6d 29 3b 0a 20 20 70 50 72 67 2d 3e 70 54 72  am);.  pPrg->pTr
7a70: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
7a80: 3b 0a 20 20 70 50 72 67 2d 3e 6f 72 63 6f 6e 66  ;.  pPrg->orconf
7a90: 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 70 50 72   = orconf;.  pPr
7aa0: 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b 30 5d 20 3d  g->aColmask[0] =
7ab0: 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 70   0xffffffff;.  p
7ac0: 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b 31 5d  Prg->aColmask[1]
7ad0: 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 0a   = 0xffffffff;..
7ae0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
7af0: 64 20 70 6f 70 75 6c 61 74 65 20 61 20 6e 65 77  d populate a new
7b00: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 74   Parse context t
7b10: 6f 20 75 73 65 20 66 6f 72 20 63 6f 64 69 6e 67  o use for coding
7b20: 20 74 68 65 20 0a 20 20 2a 2a 20 74 72 69 67 67   the .  ** trigg
7b30: 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20  er sub-program. 
7b40: 20 2a 2f 0a 20 20 70 53 75 62 50 61 72 73 65 20   */.  pSubParse 
7b50: 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
7b60: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
7b70: 6f 66 28 50 61 72 73 65 29 29 3b 0a 20 20 69 66  of(Parse));.  if
7b80: 28 20 21 70 53 75 62 50 61 72 73 65 20 29 20 72  ( !pSubParse ) r
7b90: 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73 65  eturn 0;.  memse
7ba0: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
7bb0: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
7bc0: 50 61 72 73 65 20 3d 20 70 53 75 62 50 61 72 73  Parse = pSubPars
7bd0: 65 3b 0a 20 20 70 53 75 62 50 61 72 73 65 2d 3e  e;.  pSubParse->
7be0: 64 62 20 3d 20 64 62 3b 0a 20 20 70 53 75 62 50  db = db;.  pSubP
7bf0: 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
7c00: 62 20 3d 20 70 54 61 62 3b 0a 20 20 70 53 75 62  b = pTab;.  pSub
7c10: 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
7c20: 20 3d 20 70 54 6f 70 3b 0a 20 20 70 53 75 62 50   = pTop;.  pSubP
7c30: 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
7c40: 78 74 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 7a  xt = pTrigger->z
7c50: 4e 61 6d 65 3b 0a 20 20 70 53 75 62 50 61 72 73  Name;.  pSubPars
7c60: 65 2d 3e 65 54 72 69 67 67 65 72 4f 70 20 3d 20  e->eTriggerOp = 
7c70: 70 54 72 69 67 67 65 72 2d 3e 6f 70 3b 0a 20 20  pTrigger->op;.  
7c80: 70 53 75 62 50 61 72 73 65 2d 3e 6e 51 75 65 72  pSubParse->nQuer
7c90: 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
7ca0: 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 53  nQueryLoop;.  pS
7cb0: 75 62 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65  ubParse->disable
7cc0: 56 74 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 64  Vtab = pParse->d
7cd0: 69 73 61 62 6c 65 56 74 61 62 3b 0a 0a 20 20 76  isableVtab;..  v
7ce0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
7cf0: 65 28 70 53 75 62 50 61 72 73 65 29 3b 0a 20 20  e(pSubParse);.  
7d00: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 56 64 62  if( v ){.    Vdb
7d10: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 53 74  eComment((v, "St
7d20: 61 72 74 3a 20 25 73 2e 25 73 20 28 25 73 20 25  art: %s.%s (%s %
7d30: 73 25 73 25 73 20 4f 4e 20 25 73 29 22 2c 20 0a  s%s%s ON %s)", .
7d40: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e        pTrigger->
7d50: 7a 4e 61 6d 65 2c 20 6f 6e 45 72 72 6f 72 54 65  zName, onErrorTe
7d60: 78 74 28 6f 72 63 6f 6e 66 29 2c 0a 20 20 20 20  xt(orconf),.    
7d70: 20 20 28 70 54 72 69 67 67 65 72 2d 3e 74 72 5f    (pTrigger->tr_
7d80: 74 6d 3d 3d 54 52 49 47 47 45 52 5f 42 45 46 4f  tm==TRIGGER_BEFO
7d90: 52 45 20 3f 20 22 42 45 46 4f 52 45 22 20 3a 20  RE ? "BEFORE" : 
7da0: 22 41 46 54 45 52 22 29 2c 0a 20 20 20 20 20 20  "AFTER"),.      
7db0: 20 20 28 70 54 72 69 67 67 65 72 2d 3e 6f 70 3d    (pTrigger->op=
7dc0: 3d 54 4b 5f 55 50 44 41 54 45 20 3f 20 22 55 50  =TK_UPDATE ? "UP
7dd0: 44 41 54 45 22 20 3a 20 22 22 29 2c 0a 20 20 20  DATE" : ""),.   
7de0: 20 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e       (pTrigger->
7df0: 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 3f 20  op==TK_INSERT ? 
7e00: 22 49 4e 53 45 52 54 22 20 3a 20 22 22 29 2c 0a  "INSERT" : ""),.
7e10: 20 20 20 20 20 20 20 20 28 70 54 72 69 67 67 65          (pTrigge
7e20: 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45  r->op==TK_DELETE
7e30: 20 3f 20 22 44 45 4c 45 54 45 22 20 3a 20 22 22   ? "DELETE" : ""
7e40: 29 2c 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  ),.      pTab->z
7e50: 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 23 69 66  Name.    ));.#if
7e60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7e70: 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 70  _TRACE.    if( p
7e80: 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 20 29  Trigger->zName )
7e90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7ea0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
7eb0: 31 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1, .        sqli
7ec0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
7ed0: 2d 2d 20 54 52 49 47 47 45 52 20 25 73 22 2c 20  -- TRIGGER %s", 
7ee0: 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 29  pTrigger->zName)
7ef0: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20  , P4_DYNAMIC.   
7f00: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64     );.    }.#end
7f10: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6f 6e  if..    /* If on
7f20: 65 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c  e was specified,
7f30: 20 63 6f 64 65 20 74 68 65 20 57 48 45 4e 20 63   code the WHEN c
7f40: 6c 61 75 73 65 2e 20 49 66 20 69 74 20 65 76 61  lause. If it eva
7f50: 6c 75 61 74 65 73 20 74 6f 20 66 61 6c 73 65 0a  luates to false.
7f60: 20 20 20 20 2a 2a 20 28 6f 72 20 4e 55 4c 4c 29      ** (or NULL)
7f70: 20 74 68 65 20 73 75 62 2d 76 64 62 65 20 69 73   the sub-vdbe is
7f80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 68 61 6c   immediately hal
7f90: 74 65 64 20 62 79 20 6a 75 6d 70 69 6e 67 20 74  ted by jumping t
7fa0: 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 4f 50  o the .    ** OP
7fb0: 5f 48 61 6c 74 20 69 6e 73 65 72 74 65 64 20 61  _Halt inserted a
7fc0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
7fd0: 20 70 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20   program.  */.  
7fe0: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e    if( pTrigger->
7ff0: 70 57 68 65 6e 20 29 7b 0a 20 20 20 20 20 20 70  pWhen ){.      p
8000: 57 68 65 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  When = sqlite3Ex
8010: 70 72 44 75 70 28 64 62 2c 20 70 54 72 69 67 67  prDup(db, pTrigg
8020: 65 72 2d 3e 70 57 68 65 6e 2c 20 30 29 3b 0a 20  er->pWhen, 0);. 
8030: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
8040: 4f 4b 3d 3d 73 71 6c 69 74 65 33 52 65 73 6f 6c  OK==sqlite3Resol
8050: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
8060: 2c 20 70 57 68 65 6e 29 20 0a 20 20 20 20 20 20  , pWhen) .      
8070: 20 26 26 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   && db->mallocFa
8080: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 29  iled==0 .      )
8090: 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 54 72  {.        iEndTr
80a0: 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56  igger = sqlite3V
80b0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 53 75  dbeMakeLabel(pSu
80c0: 62 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  bParse);.       
80d0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
80e0: 6c 73 65 28 70 53 75 62 50 61 72 73 65 2c 20 70  lse(pSubParse, p
80f0: 57 68 65 6e 2c 20 69 45 6e 64 54 72 69 67 67 65  When, iEndTrigge
8100: 72 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  r, SQLITE_JUMPIF
8110: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
8120: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8130: 44 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65 6e  Delete(db, pWhen
8140: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
8150: 20 43 6f 64 65 20 74 68 65 20 74 72 69 67 67 65   Code the trigge
8160: 72 20 70 72 6f 67 72 61 6d 20 69 6e 74 6f 20 74  r program into t
8170: 68 65 20 73 75 62 2d 76 64 62 65 2e 20 2a 2f 0a  he sub-vdbe. */.
8180: 20 20 20 20 63 6f 64 65 54 72 69 67 67 65 72 50      codeTriggerP
8190: 72 6f 67 72 61 6d 28 70 53 75 62 50 61 72 73 65  rogram(pSubParse
81a0: 2c 20 70 54 72 69 67 67 65 72 2d 3e 73 74 65 70  , pTrigger->step
81b0: 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e 66 29 3b 0a  _list, orconf);.
81c0: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 61  .    /* Insert a
81d0: 6e 20 4f 50 5f 48 61 6c 74 20 61 74 20 74 68 65  n OP_Halt at the
81e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 73 75 62 2d   end of the sub-
81f0: 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20  program. */.    
8200: 69 66 28 20 69 45 6e 64 54 72 69 67 67 65 72 20  if( iEndTrigger 
8210: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8220: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
8230: 28 76 2c 20 69 45 6e 64 54 72 69 67 67 65 72 29  (v, iEndTrigger)
8240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8250: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
8260: 20 4f 50 5f 48 61 6c 74 29 3b 0a 20 20 20 20 56   OP_Halt);.    V
8270: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
8280: 45 6e 64 3a 20 25 73 2e 25 73 22 2c 20 70 54 72  End: %s.%s", pTr
8290: 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 2c 20 6f 6e  igger->zName, on
82a0: 45 72 72 6f 72 54 65 78 74 28 6f 72 63 6f 6e 66  ErrorText(orconf
82b0: 29 29 29 3b 0a 0a 20 20 20 20 74 72 61 6e 73 66  )));..    transf
82c0: 65 72 50 61 72 73 65 45 72 72 6f 72 28 70 50 61  erParseError(pPa
82d0: 72 73 65 2c 20 70 53 75 62 50 61 72 73 65 29 3b  rse, pSubParse);
82e0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
82f0: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
8300: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
8310: 29 7b 0a 20 20 20 20 20 20 70 50 72 6f 67 72 61  ){.      pProgra
8320: 6d 2d 3e 61 4f 70 20 3d 20 73 71 6c 69 74 65 33  m->aOp = sqlite3
8330: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
8340: 76 2c 20 26 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f  v, &pProgram->nO
8350: 70 2c 20 26 70 54 6f 70 2d 3e 6e 4d 61 78 41 72  p, &pTop->nMaxAr
8360: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  g);.    }.    pP
8370: 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 3d 20 70  rogram->nMem = p
8380: 53 75 62 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  SubParse->nMem;.
8390: 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43      pProgram->nC
83a0: 73 72 20 3d 20 70 53 75 62 50 61 72 73 65 2d 3e  sr = pSubParse->
83b0: 6e 54 61 62 3b 0a 20 20 20 20 70 50 72 6f 67 72  nTab;.    pProgr
83c0: 61 6d 2d 3e 74 6f 6b 65 6e 20 3d 20 28 76 6f 69  am->token = (voi
83d0: 64 20 2a 29 70 54 72 69 67 67 65 72 3b 0a 20 20  d *)pTrigger;.  
83e0: 20 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b    pPrg->aColmask
83f0: 5b 30 5d 20 3d 20 70 53 75 62 50 61 72 73 65 2d  [0] = pSubParse-
8400: 3e 6f 6c 64 6d 61 73 6b 3b 0a 20 20 20 20 70 50  >oldmask;.    pP
8410: 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b 31 5d 20  rg->aColmask[1] 
8420: 3d 20 70 53 75 62 50 61 72 73 65 2d 3e 6e 65 77  = pSubParse->new
8430: 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  mask;.    sqlite
8440: 33 56 64 62 65 44 65 6c 65 74 65 28 76 29 3b 0a  3VdbeDelete(v);.
8450: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21    }..  assert( !
8460: 70 53 75 62 50 61 72 73 65 2d 3e 70 41 69 6e 63  pSubParse->pAinc
8470: 20 20 20 20 20 20 20 26 26 20 21 70 53 75 62 50         && !pSubP
8480: 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  arse->pZombieTab
8490: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
84a0: 53 75 62 50 61 72 73 65 2d 3e 70 54 72 69 67 67  SubParse->pTrigg
84b0: 65 72 50 72 67 20 26 26 20 21 70 53 75 62 50 61  erPrg && !pSubPa
84c0: 72 73 65 2d 3e 6e 4d 61 78 41 72 67 20 29 3b 0a  rse->nMaxArg );.
84d0: 20 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 52    sqlite3ParserR
84e0: 65 73 65 74 28 70 53 75 62 50 61 72 73 65 29 3b  eset(pSubParse);
84f0: 0a 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46  .  sqlite3StackF
8500: 72 65 65 28 64 62 2c 20 70 53 75 62 50 61 72 73  ree(db, pSubPars
8510: 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 50  e);..  return pP
8520: 72 67 3b 0a 7d 0a 20 20 20 20 0a 2f 2a 0a 2a 2a  rg;.}.    ./*.**
8530: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
8540: 72 20 74 6f 20 61 20 54 72 69 67 67 65 72 50 72  r to a TriggerPr
8550: 67 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  g object contain
8560: 69 6e 67 20 74 68 65 20 73 75 62 2d 70 72 6f 67  ing the sub-prog
8570: 72 61 6d 20 66 6f 72 0a 2a 2a 20 74 72 69 67 67  ram for.** trigg
8580: 65 72 20 70 54 72 69 67 67 65 72 20 77 69 74 68  er pTrigger with
8590: 20 64 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e 46   default ON CONF
85a0: 4c 49 43 54 20 61 6c 67 6f 72 69 74 68 6d 20 6f  LICT algorithm o
85b0: 72 63 6f 6e 66 2e 20 49 66 20 6e 6f 20 73 75 63  rconf. If no suc
85c0: 68 0a 2a 2a 20 54 72 69 67 67 65 72 50 72 67 20  h.** TriggerPrg 
85d0: 6f 62 6a 65 63 74 20 65 78 69 73 74 73 2c 20 61  object exists, a
85e0: 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 61   new object is a
85f0: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
8600: 75 6c 61 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a  ulated before.**
8610: 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e   being returned.
8620: 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67 67  .*/.static Trigg
8630: 65 72 50 72 67 20 2a 67 65 74 52 6f 77 54 72 69  erPrg *getRowTri
8640: 67 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  gger(.  Parse *p
8650: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
8660: 43 75 72 72 65 6e 74 20 70 61 72 73 65 20 63 6f  Current parse co
8670: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67  ntext */.  Trigg
8680: 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20 20  er *pTrigger,   
8690: 2f 2a 20 54 72 69 67 67 65 72 20 74 6f 20 63 6f  /* Trigger to co
86a0: 64 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  de */.  Table *p
86b0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
86c0: 54 68 65 20 74 61 62 6c 65 20 74 72 69 67 67 65  The table trigge
86d0: 72 20 70 54 72 69 67 67 65 72 20 69 73 20 61 74  r pTrigger is at
86e0: 74 61 63 68 65 64 20 74 6f 20 2a 2f 0a 20 20 69  tached to */.  i
86f0: 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20  nt orconf       
8700: 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49      /* ON CONFLI
8710: 43 54 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f  CT algorithm. */
8720: 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 52 6f  .){.  Parse *pRo
8730: 6f 74 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  ot = sqlite3Pars
8740: 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
8750: 29 3b 0a 20 20 54 72 69 67 67 65 72 50 72 67 20  );.  TriggerPrg 
8760: 2a 70 50 72 67 3b 0a 0a 20 20 61 73 73 65 72 74  *pPrg;..  assert
8770: 28 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d  ( pTrigger->zNam
8780: 65 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 74 61  e==0 || pTab==ta
8790: 62 6c 65 4f 66 54 72 69 67 67 65 72 28 70 54 72  bleOfTrigger(pTr
87a0: 69 67 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  igger) );..  /* 
87b0: 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 20 74  It may be that t
87c0: 68 69 73 20 74 72 69 67 67 65 72 20 68 61 73 20  his trigger has 
87d0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64  already been cod
87e0: 65 64 20 28 6f 72 20 69 73 20 69 6e 20 74 68 65  ed (or is in the
87f0: 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66  .  ** process of
8800: 20 62 65 69 6e 67 20 63 6f 64 65 64 29 2e 20 49   being coded). I
8810: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
8820: 73 65 2c 20 74 68 65 6e 20 61 6e 20 65 6e 74 72  se, then an entr
8830: 79 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6d 61  y with.  ** a ma
8840: 74 63 68 69 6e 67 20 54 72 69 67 67 65 72 50 72  tching TriggerPr
8850: 67 2e 70 54 72 69 67 67 65 72 20 66 69 65 6c 64  g.pTrigger field
8860: 20 77 69 6c 6c 20 62 65 20 70 72 65 73 65 6e 74   will be present
8870: 20 73 6f 6d 65 77 68 65 72 65 0a 20 20 2a 2a 20   somewhere.  ** 
8880: 69 6e 20 74 68 65 20 50 61 72 73 65 2e 70 54 72  in the Parse.pTr
8890: 69 67 67 65 72 50 72 67 20 6c 69 73 74 2e 20 53  iggerPrg list. S
88a0: 65 61 72 63 68 20 66 6f 72 20 73 75 63 68 20 61  earch for such a
88b0: 6e 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 66  n entry.  */.  f
88c0: 6f 72 28 70 50 72 67 3d 70 52 6f 6f 74 2d 3e 70  or(pPrg=pRoot->p
88d0: 54 72 69 67 67 65 72 50 72 67 3b 20 0a 20 20 20  TriggerPrg; .   
88e0: 20 20 20 70 50 72 67 20 26 26 20 28 70 50 72 67     pPrg && (pPrg
88f0: 2d 3e 70 54 72 69 67 67 65 72 21 3d 70 54 72 69  ->pTrigger!=pTri
8900: 67 67 65 72 20 7c 7c 20 70 50 72 67 2d 3e 6f 72  gger || pPrg->or
8910: 63 6f 6e 66 21 3d 6f 72 63 6f 6e 66 29 3b 20 0a  conf!=orconf); .
8920: 20 20 20 20 20 20 70 50 72 67 3d 70 50 72 67 2d        pPrg=pPrg-
8930: 3e 70 4e 65 78 74 0a 20 20 29 3b 0a 0a 20 20 2f  >pNext.  );..  /
8940: 2a 20 49 66 20 61 6e 20 65 78 69 73 74 69 6e 67  * If an existing
8950: 20 54 72 69 67 67 65 72 50 72 67 20 63 6f 75 6c   TriggerPrg coul
8960: 64 20 6e 6f 74 20 62 65 20 6c 6f 63 61 74 65 64  d not be located
8970: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
8980: 6e 65 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ne. */.  if( !pP
8990: 72 67 20 29 7b 0a 20 20 20 20 70 50 72 67 20 3d  rg ){.    pPrg =
89a0: 20 63 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28   codeRowTrigger(
89b0: 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
89c0: 2c 20 70 54 61 62 2c 20 6f 72 63 6f 6e 66 29 3b  , pTab, orconf);
89d0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
89e0: 50 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Prg;.}../*.** Ge
89f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
8a00: 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
8a10: 72 61 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77  ram associated w
8a20: 69 74 68 20 74 72 69 67 67 65 72 20 70 20 6f 6e  ith trigger p on
8a30: 20 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 2e   .** table pTab.
8a40: 20 54 68 65 20 72 65 67 2c 20 6f 72 63 6f 6e 66   The reg, orconf
8a50: 20 61 6e 64 20 69 67 6e 6f 72 65 4a 75 6d 70 20   and ignoreJump 
8a60: 70 61 72 61 6d 65 74 65 72 73 20 70 61 73 73 65  parameters passe
8a70: 64 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75 6e  d to this.** fun
8a80: 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 73 61  ction are the sa
8a90: 6d 65 20 61 73 20 74 68 6f 73 65 20 64 65 73 63  me as those desc
8aa0: 72 69 62 65 64 20 69 6e 20 74 68 65 20 68 65 61  ribed in the hea
8ab0: 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  der function for
8ac0: 0a 2a 2a 20 73 71 6c 69 74 65 33 43 6f 64 65 52  .** sqlite3CodeR
8ad0: 6f 77 54 72 69 67 67 65 72 28 29 0a 2a 2f 0a 76  owTrigger().*/.v
8ae0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 52  oid sqlite3CodeR
8af0: 6f 77 54 72 69 67 67 65 72 44 69 72 65 63 74 28  owTriggerDirect(
8b00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8b10: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  ,       /* Parse
8b20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72   context */.  Tr
8b30: 69 67 67 65 72 20 2a 70 2c 20 20 20 20 20 20 20  igger *p,       
8b40: 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 74 6f     /* Trigger to
8b50: 20 63 6f 64 65 20 2a 2f 0a 20 20 54 61 62 6c 65   code */.  Table
8b60: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
8b70: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20  /* The table to 
8b80: 63 6f 64 65 20 74 72 69 67 67 65 72 73 20 66 72  code triggers fr
8b90: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 2c  om */.  int reg,
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8bb0: 52 65 67 20 61 72 72 61 79 20 63 6f 6e 74 61 69  Reg array contai
8bc0: 6e 69 6e 67 20 4f 4c 44 2e 2a 20 61 6e 64 20 4e  ning OLD.* and N
8bd0: 45 57 2e 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  EW.* values */. 
8be0: 20 69 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20 20   int orconf,    
8bf0: 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46        /* ON CONF
8c00: 4c 49 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 20  LICT policy */. 
8c10: 20 69 6e 74 20 69 67 6e 6f 72 65 4a 75 6d 70 20   int ignoreJump 
8c20: 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
8c30: 74 69 6f 6e 20 74 6f 20 6a 75 6d 70 20 74 6f 20  tion to jump to 
8c40: 66 6f 72 20 52 41 49 53 45 28 49 47 4e 4f 52 45  for RAISE(IGNORE
8c50: 29 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  ) */.){.  Vdbe *
8c60: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
8c70: 62 65 28 70 50 61 72 73 65 29 3b 20 2f 2a 20 4d  be(pParse); /* M
8c80: 61 69 6e 20 56 4d 20 2a 2f 0a 20 20 54 72 69 67  ain VM */.  Trig
8c90: 67 65 72 50 72 67 20 2a 70 50 72 67 3b 0a 20 20  gerPrg *pPrg;.  
8ca0: 70 50 72 67 20 3d 20 67 65 74 52 6f 77 54 72 69  pPrg = getRowTri
8cb0: 67 67 65 72 28 70 50 61 72 73 65 2c 20 70 2c 20  gger(pParse, p, 
8cc0: 70 54 61 62 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20  pTab, orconf);. 
8cd0: 20 61 73 73 65 72 74 28 20 70 50 72 67 20 7c 7c   assert( pPrg ||
8ce0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
8cf0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
8d00: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
8d10: 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 50  /* Code the OP_P
8d20: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e  rogram opcode in
8d30: 20 74 68 65 20 70 61 72 65 6e 74 20 56 44 42 45   the parent VDBE
8d40: 2e 20 50 34 20 6f 66 20 74 68 65 20 4f 50 5f 50  . P4 of the OP_P
8d50: 72 6f 67 72 61 6d 20 0a 20 20 2a 2a 20 69 73 20  rogram .  ** is 
8d60: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8d70: 20 73 75 62 2d 76 64 62 65 20 63 6f 6e 74 61 69   sub-vdbe contai
8d80: 6e 69 6e 67 20 74 68 65 20 74 72 69 67 67 65 72  ning the trigger
8d90: 20 70 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20   program.  */.  
8da0: 69 66 28 20 70 50 72 67 20 29 7b 0a 20 20 20 20  if( pPrg ){.    
8db0: 69 6e 74 20 62 52 65 63 75 72 73 69 76 65 20 3d  int bRecursive =
8dc0: 20 28 70 2d 3e 7a 4e 61 6d 65 20 26 26 20 30 3d   (p->zName && 0=
8dd0: 3d 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  =(pParse->db->fl
8de0: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 63 54 72  ags&SQLITE_RecTr
8df0: 69 67 67 65 72 73 29 29 3b 0a 0a 20 20 20 20 73  iggers));..    s
8e00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8e10: 28 76 2c 20 4f 50 5f 50 72 6f 67 72 61 6d 2c 20  (v, OP_Program, 
8e20: 72 65 67 2c 20 69 67 6e 6f 72 65 4a 75 6d 70 2c  reg, ignoreJump,
8e30: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c   ++pParse->nMem,
8e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e50: 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
8e60: 61 72 20 2a 29 70 50 72 67 2d 3e 70 50 72 6f 67  ar *)pPrg->pProg
8e70: 72 61 6d 2c 20 50 34 5f 53 55 42 50 52 4f 47 52  ram, P4_SUBPROGR
8e80: 41 4d 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  AM);.    VdbeCom
8e90: 6d 65 6e 74 28 0a 20 20 20 20 20 20 20 20 28 76  ment(.        (v
8ea0: 2c 20 22 43 61 6c 6c 3a 20 25 73 2e 25 73 22 2c  , "Call: %s.%s",
8eb0: 20 28 70 2d 3e 7a 4e 61 6d 65 3f 70 2d 3e 7a 4e   (p->zName?p->zN
8ec0: 61 6d 65 3a 22 66 6b 65 79 22 29 2c 20 6f 6e 45  ame:"fkey"), onE
8ed0: 72 72 6f 72 54 65 78 74 28 6f 72 63 6f 6e 66 29  rrorText(orconf)
8ee0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  ));..    /* Set 
8ef0: 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20 6f  the P5 operand o
8f00: 66 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  f the OP_Program
8f10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
8f20: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 20 20 20 20  non-zero if.    
8f30: 2a 2a 20 72 65 63 75 72 73 69 76 65 20 69 6e 76  ** recursive inv
8f40: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ocation of this 
8f50: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
8f60: 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 2e 20 52  is disallowed. R
8f70: 65 63 75 72 73 69 76 65 0a 20 20 20 20 2a 2a 20  ecursive.    ** 
8f80: 69 6e 76 6f 63 61 74 69 6f 6e 20 69 73 20 64 69  invocation is di
8f90: 73 61 6c 6c 6f 77 65 64 20 69 66 20 28 61 29 20  sallowed if (a) 
8fa0: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  the sub-program 
8fb0: 69 73 20 72 65 61 6c 6c 79 20 61 20 74 72 69 67  is really a trig
8fc0: 67 65 72 2c 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  ger,.    ** not 
8fd0: 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63  a foreign key ac
8fe0: 74 69 6f 6e 2c 20 61 6e 64 20 28 62 29 20 74 68  tion, and (b) th
8ff0: 65 20 66 6c 61 67 20 74 6f 20 65 6e 61 62 6c 65  e flag to enable
9000: 20 72 65 63 75 72 73 69 76 65 20 74 72 69 67 67   recursive trigg
9010: 65 72 73 0a 20 20 20 20 2a 2a 20 69 73 20 63 6c  ers.    ** is cl
9020: 65 61 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ear.  */.    sql
9030: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
9040: 28 76 2c 20 28 75 38 29 62 52 65 63 75 72 73 69  (v, (u8)bRecursi
9050: 76 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ve);.  }.}../*.*
9060: 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
9070: 20 74 6f 20 63 6f 64 65 20 74 68 65 20 72 65 71   to code the req
9080: 75 69 72 65 64 20 46 4f 52 20 45 41 43 48 20 52  uired FOR EACH R
9090: 4f 57 20 74 72 69 67 67 65 72 73 20 66 6f 72 20  OW triggers for 
90a0: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  an operation.** 
90b0: 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54  on table pTab. T
90c0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  he operation to 
90d0: 63 6f 64 65 20 74 72 69 67 67 65 72 73 20 66 6f  code triggers fo
90e0: 72 20 28 49 4e 53 45 52 54 2c 20 55 50 44 41 54  r (INSERT, UPDAT
90f0: 45 20 6f 72 20 44 45 4c 45 54 45 29 0a 2a 2a 20  E or DELETE).** 
9100: 69 73 20 67 69 76 65 6e 20 62 79 20 74 68 65 20  is given by the 
9110: 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  op parameter. Th
9120: 65 20 74 72 5f 74 6d 20 70 61 72 61 6d 65 74 65  e tr_tm paramete
9130: 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  r determines whe
9140: 74 68 65 72 20 74 68 65 0a 2a 2a 20 42 45 46 4f  ther the.** BEFO
9150: 52 45 20 6f 72 20 41 46 54 45 52 20 74 72 69 67  RE or AFTER trig
9160: 67 65 72 73 20 61 72 65 20 63 6f 64 65 64 2e 20  gers are coded. 
9170: 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
9180: 20 69 73 20 61 6e 20 55 50 44 41 54 45 2c 20 74   is an UPDATE, t
9190: 68 65 6e 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  hen.** parameter
91a0: 20 70 43 68 61 6e 67 65 73 20 69 73 20 70 61 73   pChanges is pas
91b0: 73 65 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20  sed the list of 
91c0: 63 6f 6c 75 6d 6e 73 20 62 65 69 6e 67 20 6d 6f  columns being mo
91d0: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
91e0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
91f0: 69 67 67 65 72 73 20 74 68 61 74 20 66 69 72 65  iggers that fire
9200: 20 61 74 20 74 68 65 20 73 70 65 63 69 66 69 65   at the specifie
9210: 64 20 74 69 6d 65 20 66 6f 72 20 74 68 65 20 73  d time for the s
9220: 70 65 63 69 66 69 65 64 0a 2a 2a 20 6f 70 65 72  pecified.** oper
9230: 61 74 69 6f 6e 20 6f 6e 20 70 54 61 62 2c 20 74  ation on pTab, t
9240: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
9250: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
9260: 68 65 20 72 65 67 20 61 72 67 75 6d 65 6e 74 20  he reg argument 
9270: 69 73 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  is the address o
9280: 66 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  f the first in a
9290: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
92a0: 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 63 6f  ters .** that co
92b0: 6e 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 73  ntain the values
92c0: 20 73 75 62 73 74 69 74 75 74 65 64 20 66 6f 72   substituted for
92d0: 20 74 68 65 20 6e 65 77 2e 2a 20 61 6e 64 20 6f   the new.* and o
92e0: 6c 64 2e 2a 20 72 65 66 65 72 65 6e 63 65 73 0a  ld.* references.
92f0: 2a 2a 20 69 6e 20 74 68 65 20 74 72 69 67 67 65  ** in the trigge
9300: 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 4e 20  r program. If N 
9310: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
9320: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
9330: 65 20 70 54 61 62 0a 2a 2a 20 28 61 20 63 6f 70  e pTab.** (a cop
9340: 79 20 6f 66 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  y of pTab->nCol)
9350: 2c 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 73  , then registers
9360: 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61   are populated a
9370: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
9380: 20 20 20 52 65 67 69 73 74 65 72 20 20 20 20 20     Register     
9390: 20 20 43 6f 6e 74 61 69 6e 73 0a 2a 2a 20 20 20    Contains.**   
93a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93d0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 72 65 67 2b  ------.**   reg+
93e0: 30 20 20 20 20 20 20 20 20 20 20 4f 4c 44 2e 72  0          OLD.r
93f0: 6f 77 69 64 0a 2a 2a 20 20 20 72 65 67 2b 31 20  owid.**   reg+1 
9400: 20 20 20 20 20 20 20 20 20 4f 4c 44 2e 2a 20 76           OLD.* v
9410: 61 6c 75 65 20 6f 66 20 6c 65 66 74 2d 6d 6f 73  alue of left-mos
9420: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 54 61 62  t column of pTab
9430: 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20 20 20 20 20  .**   ...       
9440: 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 72 65       ....**   re
9450: 67 2b 4e 20 20 20 20 20 20 20 20 20 20 4f 4c 44  g+N          OLD
9460: 2e 2a 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68  .* value of righ
9470: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
9480: 20 70 54 61 62 0a 2a 2a 20 20 20 72 65 67 2b 4e   pTab.**   reg+N
9490: 2b 31 20 20 20 20 20 20 20 20 4e 45 57 2e 72 6f  +1        NEW.ro
94a0: 77 69 64 0a 2a 2a 20 20 20 72 65 67 2b 4e 2b 32  wid.**   reg+N+2
94b0: 20 20 20 20 20 20 20 20 4f 4c 44 2e 2a 20 76 61          OLD.* va
94c0: 6c 75 65 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74  lue of left-most
94d0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 54 61 62 0a   column of pTab.
94e0: 2a 2a 20 20 20 2e 2e 2e 20 20 20 20 20 20 20 20  **   ...        
94f0: 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 72 65 67      ....**   reg
9500: 2b 4e 2b 4e 2b 31 20 20 20 20 20 20 4e 45 57 2e  +N+N+1      NEW.
9510: 2a 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74  * value of right
9520: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
9530: 70 54 61 62 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 4f  pTab.**.** For O
9540: 4e 20 44 45 4c 45 54 45 20 74 72 69 67 67 65 72  N DELETE trigger
9550: 73 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 73  s, the registers
9560: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9570: 4e 45 57 2e 2a 20 76 61 6c 75 65 73 20 77 69 6c  NEW.* values wil
9580: 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65 20 61 63  l.** never be ac
9590: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 74 72  cessed by the tr
95a0: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2c 20 73  igger program, s
95b0: 6f 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61  o they are not a
95c0: 6c 6c 6f 63 61 74 65 64 20 6f 72 20 0a 2a 2a 20  llocated or .** 
95d0: 70 6f 70 75 6c 61 74 65 64 20 62 79 20 74 68 65  populated by the
95e0: 20 63 61 6c 6c 65 72 20 28 74 68 65 72 65 20 69   caller (there i
95f0: 73 20 6e 6f 20 64 61 74 61 20 74 6f 20 70 6f 70  s no data to pop
9600: 75 6c 61 74 65 20 74 68 65 6d 20 77 69 74 68 20  ulate them with 
9610: 61 6e 79 77 61 79 29 2e 20 0a 2a 2a 20 53 69 6d  anyway). .** Sim
9620: 69 6c 61 72 6c 79 2c 20 66 6f 72 20 4f 4e 20 49  ilarly, for ON I
9630: 4e 53 45 52 54 20 74 72 69 67 67 65 72 73 20 74  NSERT triggers t
9640: 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
9650: 20 69 6e 20 74 68 65 20 4f 4c 44 2e 2a 20 72 65   in the OLD.* re
9660: 67 69 73 74 65 72 73 0a 2a 2a 20 61 72 65 20 6e  gisters.** are n
9670: 65 76 65 72 20 61 63 63 65 73 73 65 64 2c 20 61  ever accessed, a
9680: 6e 64 20 73 6f 20 61 72 65 20 6e 6f 74 20 61 6c  nd so are not al
9690: 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 63  located by the c
96a0: 61 6c 6c 65 72 2e 20 53 6f 2c 20 66 6f 72 20 61  aller. So, for a
96b0: 6e 0a 2a 2a 20 4f 4e 20 49 4e 53 45 52 54 20 74  n.** ON INSERT t
96c0: 72 69 67 67 65 72 2c 20 74 68 65 20 76 61 6c 75  rigger, the valu
96d0: 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  e passed to this
96e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 70 61 72   function as par
96f0: 61 6d 65 74 65 72 20 72 65 67 0a 2a 2a 20 69 73  ameter reg.** is
9700: 20 6e 6f 74 20 61 20 72 65 61 64 61 62 6c 65 20   not a readable 
9710: 72 65 67 69 73 74 65 72 2c 20 61 6c 74 68 6f 75  register, althou
9720: 67 68 20 72 65 67 69 73 74 65 72 73 20 28 72 65  gh registers (re
9730: 67 2b 4e 29 20 74 68 72 6f 75 67 68 20 0a 2a 2a  g+N) through .**
9740: 20 28 72 65 67 2b 4e 2b 4e 2b 31 29 20 61 72 65   (reg+N+N+1) are
9750: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
9760: 72 20 6f 72 63 6f 6e 66 20 69 73 20 74 68 65 20  r orconf is the 
9770: 64 65 66 61 75 6c 74 20 63 6f 6e 66 6c 69 63 74  default conflict
9780: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
9790: 72 69 74 68 6d 20 66 6f 72 20 74 68 65 0a 2a 2a  rithm for the.**
97a0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
97b0: 20 74 6f 20 75 73 65 20 28 52 45 50 4c 41 43 45   to use (REPLACE
97c0: 2c 20 49 47 4e 4f 52 45 20 65 74 63 2e 29 2e 20  , IGNORE etc.). 
97d0: 50 61 72 61 6d 65 74 65 72 20 69 67 6e 6f 72 65  Parameter ignore
97e0: 4a 75 6d 70 0a 2a 2a 20 69 73 20 74 68 65 20 69  Jump.** is the i
97f0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
9800: 63 6f 6e 74 72 6f 6c 20 73 68 6f 75 6c 64 20 6a  control should j
9810: 75 6d 70 20 74 6f 20 69 66 20 61 20 74 72 69 67  ump to if a trig
9820: 67 65 72 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 72  ger program.** r
9830: 61 69 73 65 73 20 61 6e 20 49 47 4e 4f 52 45 20  aises an IGNORE 
9840: 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  exception..*/.vo
9850: 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f  id sqlite3CodeRo
9860: 77 54 72 69 67 67 65 72 28 0a 20 20 50 61 72 73  wTrigger(.  Pars
9870: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9880: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
9890: 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a  t */.  Trigger *
98a0: 70 54 72 69 67 67 65 72 2c 20 20 20 2f 2a 20 4c  pTrigger,   /* L
98b0: 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73 20  ist of triggers 
98c0: 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 20 2a 2f  on table pTab */
98d0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
98e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
98f0: 66 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f  f TK_UPDATE, TK_
9900: 49 4e 53 45 52 54 2c 20 54 4b 5f 44 45 4c 45 54  INSERT, TK_DELET
9910: 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  E */.  ExprList 
9920: 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f 2a 20 43  *pChanges,  /* C
9930: 68 61 6e 67 65 73 20 6c 69 73 74 20 66 6f 72 20  hanges list for 
9940: 61 6e 79 20 55 50 44 41 54 45 20 4f 46 20 74 72  any UPDATE OF tr
9950: 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  iggers */.  int 
9960: 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20 20 20  tr_tm,          
9970: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 52 49 47 47   /* One of TRIGG
9980: 45 52 5f 42 45 46 4f 52 45 2c 20 54 52 49 47 47  ER_BEFORE, TRIGG
9990: 45 52 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54 61  ER_AFTER */.  Ta
99a0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
99b0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
99c0: 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 73  to code triggers
99d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 72   from */.  int r
99e0: 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eg,             
99f0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 69 6e 20  /* The first in 
9a00: 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
9a10: 73 74 65 72 73 20 28 73 65 65 20 61 62 6f 76 65  sters (see above
9a20: 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e  ) */.  int orcon
9a30: 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  f,          /* O
9a40: 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63  N CONFLICT polic
9a50: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67 6e 6f 72  y */.  int ignor
9a60: 65 4a 75 6d 70 20 20 20 20 20 20 20 2f 2a 20 49  eJump       /* I
9a70: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6a 75  nstruction to ju
9a80: 6d 70 20 74 6f 20 66 6f 72 20 52 41 49 53 45 28  mp to for RAISE(
9a90: 49 47 4e 4f 52 45 29 20 2a 2f 0a 29 7b 0a 20 20  IGNORE) */.){.  
9aa0: 54 72 69 67 67 65 72 20 2a 70 3b 20 20 20 20 20  Trigger *p;     
9ab0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
9ac0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
9ad0: 70 54 72 69 67 67 65 72 20 6c 69 73 74 20 2a 2f  pTrigger list */
9ae0: 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
9af0: 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d  TK_UPDATE || op=
9b00: 3d 54 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  =TK_INSERT || op
9b10: 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 29 3b 0a 20  ==TK_DELETE );. 
9b20: 20 61 73 73 65 72 74 28 20 74 72 5f 74 6d 3d 3d   assert( tr_tm==
9b30: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 7c  TRIGGER_BEFORE |
9b40: 7c 20 74 72 5f 74 6d 3d 3d 54 52 49 47 47 45 52  | tr_tm==TRIGGER
9b50: 5f 41 46 54 45 52 20 29 3b 0a 20 20 61 73 73 65  _AFTER );.  asse
9b60: 72 74 28 20 28 6f 70 3d 3d 54 4b 5f 55 50 44 41  rt( (op==TK_UPDA
9b70: 54 45 29 3d 3d 28 70 43 68 61 6e 67 65 73 21 3d  TE)==(pChanges!=
9b80: 30 29 20 29 3b 0a 0a 20 20 66 6f 72 28 70 3d 70  0) );..  for(p=p
9b90: 54 72 69 67 67 65 72 3b 20 70 3b 20 70 3d 70 2d  Trigger; p; p=p-
9ba0: 3e 70 4e 65 78 74 29 7b 0a 0a 20 20 20 20 2f 2a  >pNext){..    /*
9bb0: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
9bc0: 3a 20 20 54 68 65 20 73 63 68 65 6d 61 20 66 6f  :  The schema fo
9bd0: 72 20 74 68 65 20 74 72 69 67 67 65 72 20 61 6e  r the trigger an
9be0: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
9bf0: 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  are.    ** alway
9c00: 73 20 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  s defined.  The 
9c10: 74 72 69 67 67 65 72 20 6d 75 73 74 20 62 65 20  trigger must be 
9c20: 69 6e 20 74 68 65 20 73 61 6d 65 20 73 63 68 65  in the same sche
9c30: 6d 61 20 61 73 20 74 68 65 20 74 61 62 6c 65 0a  ma as the table.
9c40: 20 20 20 20 2a 2a 20 6f 72 20 65 6c 73 65 20 69      ** or else i
9c50: 74 20 6d 75 73 74 20 62 65 20 61 20 54 45 4d 50  t must be a TEMP
9c60: 20 74 72 69 67 67 65 72 2e 20 2a 2f 0a 20 20 20   trigger. */.   
9c70: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68   assert( p->pSch
9c80: 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ema!=0 );.    as
9c90: 73 65 72 74 28 20 70 2d 3e 70 54 61 62 53 63 68  sert( p->pTabSch
9ca0: 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ema!=0 );.    as
9cb0: 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d 61  sert( p->pSchema
9cc0: 3d 3d 70 2d 3e 70 54 61 62 53 63 68 65 6d 61 20  ==p->pTabSchema 
9cd0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  .         || p->
9ce0: 70 53 63 68 65 6d 61 3d 3d 70 50 61 72 73 65 2d  pSchema==pParse-
9cf0: 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  >db->aDb[1].pSch
9d00: 65 6d 61 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  ema );..    /* D
9d10: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
9d20: 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 64 65 20   we should code 
9d30: 74 68 69 73 20 74 72 69 67 67 65 72 20 2a 2f 0a  this trigger */.
9d40: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 6f      if( p->op==o
9d50: 70 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 74 72  p .     && p->tr
9d60: 5f 74 6d 3d 3d 74 72 5f 74 6d 20 0a 20 20 20 20  _tm==tr_tm .    
9d70: 20 26 26 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f   && checkColumnO
9d80: 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f 6c 75 6d  verlap(p->pColum
9d90: 6e 73 2c 20 70 43 68 61 6e 67 65 73 29 0a 20 20  ns, pChanges).  
9da0: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
9db0: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
9dc0: 44 69 72 65 63 74 28 70 50 61 72 73 65 2c 20 70  Direct(pParse, p
9dd0: 2c 20 70 54 61 62 2c 20 72 65 67 2c 20 6f 72 63  , pTab, reg, orc
9de0: 6f 6e 66 2c 20 69 67 6e 6f 72 65 4a 75 6d 70 29  onf, ignoreJump)
9df0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9e00: 2a 0a 2a 2a 20 54 72 69 67 67 65 72 73 20 6d 61  *.** Triggers ma
9e10: 79 20 61 63 63 65 73 73 20 76 61 6c 75 65 73 20  y access values 
9e20: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6f 6c  stored in the ol
9e30: 64 2e 2a 20 6f 72 20 6e 65 77 2e 2a 20 70 73 65  d.* or new.* pse
9e40: 75 64 6f 2d 74 61 62 6c 65 2e 20 0a 2a 2a 20 54  udo-table. .** T
9e50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
9e60: 75 72 6e 73 20 61 20 33 32 2d 62 69 74 20 62 69  urns a 32-bit bi
9e70: 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67  tmask indicating
9e80: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 6f   which columns o
9e90: 66 20 74 68 65 20 0a 2a 2a 20 6f 6c 64 2e 2a 20  f the .** old.* 
9ea0: 6f 72 20 6e 65 77 2e 2a 20 74 61 62 6c 65 73 20  or new.* tables 
9eb0: 61 63 74 75 61 6c 6c 79 20 61 72 65 20 75 73 65  actually are use
9ec0: 64 20 62 79 20 74 72 69 67 67 65 72 73 2e 20 54  d by triggers. T
9ed0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
9ee0: 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73 65 64 20  .** may be used 
9ef0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2c 20 66  by the caller, f
9f00: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 61  or example, to a
9f10: 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6c  void having to l
9f20: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 0a 2a  oad the entire.*
9f30: 2a 20 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 20 69  * old.* record i
9f40: 6e 74 6f 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20  nto memory when 
9f50: 65 78 65 63 75 74 69 6e 67 20 61 6e 20 55 50 44  executing an UPD
9f60: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 63 6f  ATE or DELETE co
9f70: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 42 69 74  mmand..**.** Bit
9f80: 20 30 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e   0 of the return
9f90: 65 64 20 6d 61 73 6b 20 69 73 20 73 65 74 20 69  ed mask is set i
9fa0: 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  f the left-most 
9fb0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 0a 2a 2a  column of the.**
9fc0: 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 61 63   table may be ac
9fd0: 63 65 73 73 65 64 20 75 73 69 6e 67 20 61 6e 20  cessed using an 
9fe0: 5b 6f 6c 64 7c 6e 65 77 5d 2e 3c 63 6f 6c 3e 20  [old|new].<col> 
9ff0: 72 65 66 65 72 65 6e 63 65 2e 20 42 69 74 20 31  reference. Bit 1
a000: 20 69 73 20 73 65 74 20 69 66 0a 2a 2a 20 74 68   is set if.** th
a010: 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 6d 6f 73  e second leftmos
a020: 74 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  t column value i
a030: 73 20 72 65 71 75 69 72 65 64 2c 20 61 6e 64 20  s required, and 
a040: 73 6f 20 6f 6e 2e 20 49 66 20 74 68 65 72 65 0a  so on. If there.
a050: 2a 2a 20 61 72 65 20 6d 6f 72 65 20 74 68 61 6e  ** are more than
a060: 20 33 32 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   32 columns in t
a070: 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 61 74  he table, and at
a080: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
a090: 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 77 69 74  e columns.** wit
a0a0: 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  h an index great
a0b0: 65 72 20 74 68 61 6e 20 33 32 20 6d 61 79 20 62  er than 32 may b
a0c0: 65 20 61 63 63 65 73 73 65 64 2c 20 30 78 66 66  e accessed, 0xff
a0d0: 66 66 66 66 66 66 20 69 73 20 72 65 74 75 72 6e  ffffff is return
a0e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ed..**.** It is 
a0f0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
a100: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
a110: 20 6f 6c 64 2e 72 6f 77 69 64 20 6f 72 20 6e 65   old.rowid or ne
a120: 77 2e 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69  w.rowid column i
a130: 73 20 0a 2a 2a 20 61 63 63 65 73 73 65 64 20 62  s .** accessed b
a140: 79 20 74 72 69 67 67 65 72 73 2e 20 54 68 65 20  y triggers. The 
a150: 63 61 6c 6c 65 72 20 6d 75 73 74 20 61 6c 77 61  caller must alwa
a160: 79 73 20 61 73 73 75 6d 65 20 74 68 61 74 20 69  ys assume that i
a170: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  t is..**.** Para
a180: 6d 65 74 65 72 20 69 73 4e 65 77 20 6d 75 73 74  meter isNew must
a190: 20 62 65 20 65 69 74 68 65 72 20 31 20 6f 72 20   be either 1 or 
a1a0: 30 2e 20 49 66 20 69 74 20 69 73 20 30 2c 20 74  0. If it is 0, t
a1b0: 68 65 6e 20 74 68 65 20 6d 61 73 6b 20 72 65 74  hen the mask ret
a1c0: 75 72 6e 65 64 0a 2a 2a 20 61 70 70 6c 69 65 73  urned.** applies
a1d0: 20 74 6f 20 74 68 65 20 6f 6c 64 2e 2a 20 74 61   to the old.* ta
a1e0: 62 6c 65 2e 20 49 66 20 31 2c 20 74 68 65 20 6e  ble. If 1, the n
a1f0: 65 77 2e 2a 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  ew.* table..**.*
a200: 2a 20 50 61 72 61 6d 65 74 65 72 20 74 72 5f 74  * Parameter tr_t
a210: 6d 20 6d 75 73 74 20 62 65 20 61 20 6d 61 73 6b  m must be a mask
a220: 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 62 6f 74   with one or bot
a230: 68 20 6f 66 20 74 68 65 20 54 52 49 47 47 45 52  h of the TRIGGER
a240: 5f 42 45 46 4f 52 45 0a 2a 2a 20 61 6e 64 20 54  _BEFORE.** and T
a250: 52 49 47 47 45 52 5f 41 46 54 45 52 20 62 69 74  RIGGER_AFTER bit
a260: 73 20 73 65 74 2e 20 56 61 6c 75 65 73 20 61 63  s set. Values ac
a270: 63 65 73 73 65 64 20 62 79 20 42 45 46 4f 52 45  cessed by BEFORE
a280: 20 74 72 69 67 67 65 72 73 20 61 72 65 20 6f 6e   triggers are on
a290: 6c 79 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69  ly.** included i
a2a0: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6d  n the returned m
a2b0: 61 73 6b 20 69 66 20 74 68 65 20 54 52 49 47 47  ask if the TRIGG
a2c0: 45 52 5f 42 45 46 4f 52 45 20 62 69 74 20 69 73  ER_BEFORE bit is
a2d0: 20 73 65 74 20 69 6e 20 74 68 65 0a 2a 2a 20 74   set in the.** t
a2e0: 72 5f 74 6d 20 70 61 72 61 6d 65 74 65 72 2e 20  r_tm parameter. 
a2f0: 53 69 6d 69 6c 61 72 6c 79 2c 20 76 61 6c 75 65  Similarly, value
a300: 73 20 61 63 63 65 73 73 65 64 20 62 79 20 41 46  s accessed by AF
a310: 54 45 52 20 74 72 69 67 67 65 72 73 20 61 72 65  TER triggers are
a320: 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63 6c 75 64 65   only.** include
a330: 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  d in the returne
a340: 64 20 6d 61 73 6b 20 69 66 20 74 68 65 20 54 52  d mask if the TR
a350: 49 47 47 45 52 5f 41 46 54 45 52 20 62 69 74 20  IGGER_AFTER bit 
a360: 69 73 20 73 65 74 20 69 6e 20 74 72 5f 74 6d 2e  is set in tr_tm.
a370: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 54  .*/.u32 sqlite3T
a380: 72 69 67 67 65 72 43 6f 6c 6d 61 73 6b 28 0a 20  riggerColmask(. 
a390: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a3a0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
a3b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67  ontext */.  Trig
a3c0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20  ger *pTrigger,  
a3d0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67   /* List of trig
a3e0: 67 65 72 73 20 6f 6e 20 74 61 62 6c 65 20 70 54  gers on table pT
a3f0: 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ab */.  ExprList
a400: 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f 2a 20   *pChanges,  /* 
a410: 43 68 61 6e 67 65 73 20 6c 69 73 74 20 66 6f 72  Changes list for
a420: 20 61 6e 79 20 55 50 44 41 54 45 20 4f 46 20 74   any UPDATE OF t
a430: 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74  riggers */.  int
a440: 20 69 73 4e 65 77 2c 20 20 20 20 20 20 20 20 20   isNew,         
a450: 20 20 2f 2a 20 31 20 66 6f 72 20 6e 65 77 2e 2a    /* 1 for new.*
a460: 20 72 65 66 20 6d 61 73 6b 2c 20 30 20 66 6f 72   ref mask, 0 for
a470: 20 6f 6c 64 2e 2a 20 72 65 66 20 6d 61 73 6b 20   old.* ref mask 
a480: 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20  */.  int tr_tm, 
a490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
a4a0: 6b 20 6f 66 20 54 52 49 47 47 45 52 5f 42 45 46  k of TRIGGER_BEF
a4b0: 4f 52 45 7c 54 52 49 47 47 45 52 5f 41 46 54 45  ORE|TRIGGER_AFTE
a4c0: 52 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  R */.  Table *pT
a4d0: 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab,         /* T
a4e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 6f 64 65  he table to code
a4f0: 20 74 72 69 67 67 65 72 73 20 66 72 6f 6d 20 2a   triggers from *
a500: 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20  /.  int orconf  
a510: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61           /* Defa
a520: 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ult ON CONFLICT 
a530: 70 6f 6c 69 63 79 20 66 6f 72 20 74 72 69 67 67  policy for trigg
a540: 65 72 20 73 74 65 70 73 20 2a 2f 0a 29 7b 0a 20  er steps */.){. 
a550: 20 63 6f 6e 73 74 20 69 6e 74 20 6f 70 20 3d 20   const int op = 
a560: 70 43 68 61 6e 67 65 73 20 3f 20 54 4b 5f 55 50  pChanges ? TK_UP
a570: 44 41 54 45 20 3a 20 54 4b 5f 44 45 4c 45 54 45  DATE : TK_DELETE
a580: 3b 0a 20 20 75 33 32 20 6d 61 73 6b 20 3d 20 30  ;.  u32 mask = 0
a590: 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 3b 0a  ;.  Trigger *p;.
a5a0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4e 65 77  .  assert( isNew
a5b0: 3d 3d 31 20 7c 7c 20 69 73 4e 65 77 3d 3d 30 20  ==1 || isNew==0 
a5c0: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 54 72 69 67  );.  for(p=pTrig
a5d0: 67 65 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  ger; p; p=p->pNe
a5e0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
a5f0: 6f 70 3d 3d 6f 70 20 26 26 20 28 74 72 5f 74 6d  op==op && (tr_tm
a600: 26 70 2d 3e 74 72 5f 74 6d 29 0a 20 20 20 20 20  &p->tr_tm).     
a610: 26 26 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76  && checkColumnOv
a620: 65 72 6c 61 70 28 70 2d 3e 70 43 6f 6c 75 6d 6e  erlap(p->pColumn
a630: 73 2c 70 43 68 61 6e 67 65 73 29 0a 20 20 20 20  s,pChanges).    
a640: 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72  ){.      Trigger
a650: 50 72 67 20 2a 70 50 72 67 3b 0a 20 20 20 20 20  Prg *pPrg;.     
a660: 20 70 50 72 67 20 3d 20 67 65 74 52 6f 77 54 72   pPrg = getRowTr
a670: 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 70 2c  igger(pParse, p,
a680: 20 70 54 61 62 2c 20 6f 72 63 6f 6e 66 29 3b 0a   pTab, orconf);.
a690: 20 20 20 20 20 20 69 66 28 20 70 50 72 67 20 29        if( pPrg )
a6a0: 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c  {.        mask |
a6b0: 3d 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b  = pPrg->aColmask
a6c0: 5b 69 73 4e 65 77 5d 3b 0a 20 20 20 20 20 20 7d  [isNew];.      }
a6d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
a6e0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 23 65  turn mask;.}..#e
a6f0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
a700: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
a710: 47 47 45 52 29 20 2a 2f 0a                       GGER) */.