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 0a 20 20 20 20 73 71 IdList);.. sq
0370: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
0380: 70 54 6d 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a pTmp);. }.}../*
0390: 0a 2a 2a 20 47 69 76 65 6e 20 74 61 62 6c 65 20 .** Given table
03a0: 70 54 61 62 2c 20 72 65 74 75 72 6e 20 61 20 6c pTab, return a l
03b0: 69 73 74 20 6f 66 20 61 6c 6c 20 74 68 65 20 74 ist of all the t
03c0: 72 69 67 67 65 72 73 20 61 74 74 61 63 68 65 64 riggers attached
03d0: 20 74 6f 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c to .** the tabl
03e0: 65 2e 20 54 68 65 20 6c 69 73 74 20 69 73 20 63 e. The list is c
03f0: 6f 6e 6e 65 63 74 65 64 20 62 79 20 54 72 69 67 onnected by Trig
0400: 67 65 72 2e 70 4e 65 78 74 20 70 6f 69 6e 74 65 ger.pNext pointe
0410: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 rs..**.** All of
0420: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 6f 6e the triggers on
0430: 20 70 54 61 62 20 74 68 61 74 20 61 72 65 20 69 pTab that are i
0440: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 n the same datab
0450: 61 73 65 20 61 73 20 70 54 61 62 0a 2a 2a 20 61 ase as pTab.** a
0460: 72 65 20 61 6c 72 65 61 64 79 20 61 74 74 61 63 re already attac
0470: 68 65 64 20 74 6f 20 70 54 61 62 2d 3e 70 54 72 hed to pTab->pTr
0480: 69 67 67 65 72 2e 20 20 42 75 74 20 74 68 65 72 igger. But ther
0490: 65 20 6d 69 67 68 74 20 62 65 20 61 64 64 69 74 e might be addit
04a0: 69 6f 6e 61 6c 0a 2a 2a 20 74 72 69 67 67 65 72 ional.** trigger
04b0: 73 20 6f 6e 20 70 54 61 62 20 69 6e 20 74 68 65 s on pTab in the
04c0: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20 54 TEMP schema. T
04d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 65 70 his routine prep
04e0: 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 54 45 4d 50 ends all.** TEMP
04f0: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 70 54 61 triggers on pTa
0500: 62 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 b to the beginni
0510: 6e 67 20 6f 66 20 74 68 65 20 70 54 61 62 2d 3e ng of the pTab->
0520: 70 54 72 69 67 67 65 72 20 6c 69 73 74 0a 2a 2a pTrigger list.**
0530: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 and returns the
0540: 20 63 6f 6d 62 69 6e 65 64 20 6c 69 73 74 2e 0a combined list..
0550: 2a 2a 0a 2a 2a 20 54 6f 20 73 74 61 74 65 20 69 **.** To state i
0560: 74 20 61 6e 6f 74 68 65 72 20 77 61 79 3a 20 20 t another way:
0570: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 This routine ret
0580: 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 61 urns a list of a
0590: 6c 6c 20 74 72 69 67 67 65 72 73 0a 2a 2a 20 74 ll triggers.** t
05a0: 68 61 74 20 66 69 72 65 20 6f 66 66 20 6f 66 20 hat fire off of
05b0: 70 54 61 62 2e 20 20 54 68 65 20 6c 69 73 74 20 pTab. The list
05c0: 77 69 6c 6c 20 69 6e 63 6c 75 64 65 20 61 6e 79 will include any
05d0: 20 54 45 4d 50 20 74 72 69 67 67 65 72 73 20 6f TEMP triggers o
05e0: 6e 0a 2a 2a 20 70 54 61 62 20 61 73 20 77 65 6c n.** pTab as wel
05f0: 6c 20 61 73 20 74 68 65 20 74 72 69 67 67 65 72 l as the trigger
0600: 73 20 6c 69 73 65 64 20 69 6e 20 70 54 61 62 2d s lised in pTab-
0610: 3e 70 54 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72 >pTrigger..*/.Tr
0620: 69 67 67 65 72 20 2a 73 71 6c 69 74 65 33 54 72 igger *sqlite3Tr
0630: 69 67 67 65 72 4c 69 73 74 28 50 61 72 73 65 20 iggerList(Parse
0640: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a *pParse, Table *
0650: 70 54 61 62 29 7b 0a 20 20 53 63 68 65 6d 61 20 pTab){. Schema
0660: 2a 20 63 6f 6e 73 74 20 70 54 6d 70 53 63 68 65 * const pTmpSche
0670: 6d 61 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d ma = pParse->db-
0680: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 3b >aDb[1].pSchema;
0690: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 73 . Trigger *pLis
06a0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 t = 0;
06b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 /* List
06c0: 6f 66 20 74 72 69 67 67 65 72 73 20 74 6f 20 72 of triggers to r
06d0: 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 eturn */.. if(
06e0: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 54 pParse->disableT
06f0: 72 69 67 67 65 72 73 20 29 7b 0a 20 20 20 20 72 riggers ){. r
0700: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 eturn 0;. }..
0710: 69 66 28 20 70 54 6d 70 53 63 68 65 6d 61 21 3d if( pTmpSchema!=
0720: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b pTab->pSchema ){
0730: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 . HashElem *p
0740: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 ;. assert( sq
0750: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 lite3SchemaMutex
0760: 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c Held(pParse->db,
0770: 20 30 2c 20 70 54 6d 70 53 63 68 65 6d 61 29 20 0, pTmpSchema)
0780: 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c );. for(p=sql
0790: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 54 iteHashFirst(&pT
07a0: 6d 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 mpSchema->trigHa
07b0: 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 sh); p; p=sqlite
07c0: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 HashNext(p)){.
07d0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 Trigger *pTr
07e0: 69 67 20 3d 20 28 54 72 69 67 67 65 72 20 2a 29 ig = (Trigger *)
07f0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 sqliteHashData(p
0800: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 );. if( pTr
0810: 69 67 2d 3e 70 54 61 62 53 63 68 65 6d 61 3d 3d ig->pTabSchema==
0820: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 0a 20 20 pTab->pSchema.
0830: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 && 0==sqlit
0840: 65 33 53 74 72 49 43 6d 70 28 70 54 72 69 67 2d e3StrICmp(pTrig-
0850: 3e 74 61 62 6c 65 2c 20 70 54 61 62 2d 3e 7a 4e >table, pTab->zN
0860: 61 6d 65 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 ame) . ){.
0870: 20 20 20 20 20 20 20 70 54 72 69 67 2d 3e 70 4e pTrig->pN
0880: 65 78 74 20 3d 20 28 70 4c 69 73 74 20 3f 20 70 ext = (pList ? p
0890: 4c 69 73 74 20 3a 20 70 54 61 62 2d 3e 70 54 72 List : pTab->pTr
08a0: 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 igger);.
08b0: 70 4c 69 73 74 20 3d 20 70 54 72 69 67 3b 0a 20 pList = pTrig;.
08c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d }. }. }
08d0: 0a 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73 .. return (pLis
08e0: 74 20 3f 20 70 4c 69 73 74 20 3a 20 70 54 61 62 t ? pList : pTab
08f0: 2d 3e 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a ->pTrigger);.}..
0900: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 /*.** This is ca
0910: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 lled by the pars
0920: 65 72 20 77 68 65 6e 20 69 74 20 73 65 65 73 20 er when it sees
0930: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 a CREATE TRIGGER
0940: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 75 70 statement.** up
0950: 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 to the point of
0960: 20 74 68 65 20 42 45 47 49 4e 20 62 65 66 6f 72 the BEGIN befor
0970: 65 20 74 68 65 20 74 72 69 67 67 65 72 20 61 63 e the trigger ac
0980: 74 69 6f 6e 73 2e 20 20 41 20 54 72 69 67 67 65 tions. A Trigge
0990: 72 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 r.** structure i
09a0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 61 73 65 s generated base
09b0: 64 20 6f 6e 20 74 68 65 20 69 6e 66 6f 72 6d 61 d on the informa
09c0: 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65 20 61 tion available a
09d0: 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 nd stored.** in
09e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 pParse->pNewTrig
09f0: 67 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 ger. After the
0a00: 74 72 69 67 67 65 72 20 61 63 74 69 6f 6e 73 20 trigger actions
0a10: 68 61 76 65 20 62 65 65 6e 20 70 61 72 73 65 64 have been parsed
0a20: 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 , the.** sqlite3
0a30: 46 69 6e 69 73 68 54 72 69 67 67 65 72 28 29 20 FinishTrigger()
0a40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c function is call
0a50: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 ed to complete t
0a60: 68 65 20 74 72 69 67 67 65 72 0a 2a 2a 20 63 6f he trigger.** co
0a70: 6e 73 74 72 75 63 74 69 6f 6e 20 70 72 6f 63 65 nstruction proce
0a80: 73 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 ss..*/.void sqli
0a90: 74 65 33 42 65 67 69 6e 54 72 69 67 67 65 72 28 te3BeginTrigger(
0aa0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 . Parse *pParse
0ab0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 , /* The pa
0ac0: 72 73 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 rse context of t
0ad0: 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45 he CREATE TRIGGE
0ae0: 52 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 R statement */.
0af0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 Token *pName1,
0b00: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 /* The name
0b10: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20 of the trigger
0b20: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d */. Token *pNam
0b30: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 e2, /* The
0b40: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67 name of the trig
0b50: 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f ger */. int tr_
0b60: 74 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 tm, /*
0b70: 4f 6e 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45 One of TK_BEFORE
0b80: 2c 20 54 4b 5f 41 46 54 45 52 2c 20 54 4b 5f 49 , TK_AFTER, TK_I
0b90: 4e 53 54 45 41 44 20 2a 2f 0a 20 20 69 6e 74 20 NSTEAD */. int
0ba0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 op,
0bb0: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e 53 /* One of TK_INS
0bc0: 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 ERT, TK_UPDATE,
0bd0: 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 49 TK_DELETE */. I
0be0: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c dList *pColumns,
0bf0: 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73 /* column lis
0c00: 74 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 t if this is an
0c10: 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67 65 UPDATE OF trigge
0c20: 72 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a r */. SrcList *
0c30: 70 54 61 62 6c 65 4e 61 6d 65 2c 2f 2a 20 54 68 pTableName,/* Th
0c40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 e name of the ta
0c50: 62 6c 65 2f 76 69 65 77 20 74 68 65 20 74 72 69 ble/view the tri
0c60: 67 67 65 72 20 61 70 70 6c 69 65 73 20 74 6f 20 gger applies to
0c70: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 6e */. Expr *pWhen
0c80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 4e , /* WHEN
0c90: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 clause */. int
0ca0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 isTemp,
0cb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 /* True if the
0cc0: 54 45 4d 50 4f 52 41 52 59 20 6b 65 79 77 6f 72 TEMPORARY keywor
0cd0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a d is present */.
0ce0: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 int noErr
0cf0: 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 /* Suppres
0d00: 73 20 65 72 72 6f 72 73 20 69 66 20 74 68 65 20 s errors if the
0d10: 74 72 69 67 67 65 72 20 61 6c 72 65 61 64 79 20 trigger already
0d20: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 exists */.){. T
0d30: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 rigger *pTrigger
0d40: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6e 65 = 0; /* The ne
0d50: 77 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 54 w trigger */. T
0d60: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 able *pTab;
0d70: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 /* Table
0d80: 74 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72 that the trigger
0d90: 20 66 69 72 65 73 20 6f 66 66 20 6f 66 20 2a 2f fires off of */
0da0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d . char *zName =
0db0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 0; /* Na
0dc0: 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 me of the trigge
0dd0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a r */. sqlite3 *
0de0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b db = pParse->db;
0df0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 /* The databas
0e00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a e connection */.
0e10: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 int iDb;
0e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
0e30: 20 64 61 74 61 62 61 73 65 20 74 6f 20 73 74 6f database to sto
0e40: 72 65 20 74 68 65 20 74 72 69 67 67 65 72 20 69 re the trigger i
0e50: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e n */. Token *pN
0e60: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f ame; /
0e70: 2a 20 54 68 65 20 75 6e 71 75 61 6c 69 66 69 65 * The unqualifie
0e80: 64 20 64 62 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 d db name */. D
0e90: 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 bFixer sFix;
0ea0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20 /* State
0eb0: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 44 vector for the D
0ec0: 42 20 66 69 78 65 72 20 2a 2f 0a 20 20 69 6e 74 B fixer */. int
0ed0: 20 69 54 61 62 44 62 3b 20 20 20 20 20 20 20 20 iTabDb;
0ee0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 /* Index of
0ef0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f the database ho
0f00: 6c 64 69 6e 67 20 70 54 61 62 20 2a 2f 0a 0a 20 lding pTab */..
0f10: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 21 assert( pName1!
0f20: 3d 30 20 29 3b 20 20 20 2f 2a 20 70 4e 61 6d 65 =0 ); /* pName
0f30: 31 2d 3e 7a 20 6d 69 67 68 74 20 62 65 20 4e 55 1->z might be NU
0f40: 4c 4c 2c 20 62 75 74 20 6e 6f 74 20 70 4e 61 6d LL, but not pNam
0f50: 65 31 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 61 e1 itself */. a
0f60: 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 ssert( pName2!=0
0f70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 );. assert( op
0f80: 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f ==TK_INSERT || o
0f90: 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20 p==TK_UPDATE ||
0fa0: 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 29 3b op==TK_DELETE );
0fb0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20 . assert( op>0
0fc0: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 && op<0xff );.
0fd0: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 if( isTemp ){.
0fe0: 20 20 2f 2a 20 49 66 20 54 45 4d 50 20 77 61 73 /* If TEMP was
0ff0: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e specified, then
1000: 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d the trigger nam
1010: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 e may not be qua
1020: 6c 69 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 69 lified. */. i
1030: 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 f( pName2->n>0 )
1040: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 {. sqlite3E
1050: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 rrorMsg(pParse,
1060: 22 74 65 6d 70 6f 72 61 72 79 20 74 72 69 67 67 "temporary trigg
1070: 65 72 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 er may not have
1080: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 22 29 qualified name")
1090: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 ;. goto tri
10a0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 gger_cleanup;.
10b0: 20 20 7d 0a 20 20 20 20 69 44 62 20 3d 20 31 3b }. iDb = 1;
10c0: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 . pName = pNa
10d0: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 me1;. }else{.
10e0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 /* Figure out
10f0: 74 68 65 20 64 62 20 74 68 61 74 20 74 68 65 20 the db that the
1100: 74 68 65 20 74 72 69 67 67 65 72 20 77 69 6c 6c the trigger will
1110: 20 62 65 20 63 72 65 61 74 65 64 20 69 6e 20 2a be created in *
1120: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 /. iDb = sqli
1130: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 te3TwoPartName(p
1140: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 Parse, pName1, p
1150: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a Name2, &pName);.
1160: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b if( iDb<0 ){
1170: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 . goto trig
1180: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 ger_cleanup;.
1190: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 54 }. }. if( !pT
11a0: 61 62 6c 65 4e 61 6d 65 20 7c 7c 20 64 62 2d 3e ableName || db->
11b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a mallocFailed ){.
11c0: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 goto trigger
11d0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 _cleanup;. }..
11e0: 20 2f 2a 20 41 20 6c 6f 6e 67 2d 73 74 61 6e 64 /* A long-stand
11f0: 69 6e 67 20 70 61 72 73 65 72 20 62 75 67 20 69 ing parser bug i
1200: 73 20 74 68 61 74 20 74 68 69 73 20 73 79 6e 74 s that this synt
1210: 61 78 20 77 61 73 20 61 6c 6c 6f 77 65 64 3a 0a ax was allowed:.
1220: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 43 52 45 **. ** CRE
1230: 41 54 45 20 54 52 49 47 47 45 52 20 61 74 74 61 ATE TRIGGER atta
1240: 63 68 65 64 2e 64 65 6d 6f 20 41 46 54 45 52 20 ched.demo AFTER
1250: 49 4e 53 45 52 54 20 4f 4e 20 61 74 74 61 63 68 INSERT ON attach
1260: 65 64 2e 74 61 62 20 2e 2e 2e 2e 0a 20 20 2a 2a ed.tab ..... **
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12a0: 20 5e 5e 5e 5e 5e 5e 5e 5e 0a 20 20 2a 2a 0a 20 ^^^^^^^^. **.
12b0: 20 2a 2a 20 54 6f 20 6d 61 69 6e 74 61 69 6e 20 ** To maintain
12c0: 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 backwards compat
12d0: 69 62 69 6c 69 74 79 2c 20 69 67 6e 6f 72 65 20 ibility, ignore
12e0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a the database. *
12f0: 2a 20 6e 61 6d 65 20 6f 6e 20 70 54 61 62 6c 65 * name on pTable
1300: 4e 61 6d 65 20 69 66 20 77 65 20 61 72 65 20 72 Name if we are r
1310: 65 70 61 72 73 69 6e 67 20 6f 75 72 20 6f 66 20 eparsing our of
1320: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 0a 20 SQLITE_MASTER..
1330: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e */. if( db->in
1340: 69 74 2e 62 75 73 79 20 26 26 20 69 44 62 21 3d it.busy && iDb!=
1350: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 1 ){. sqlite3
1360: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c DbFree(db, pTabl
1370: 65 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 eName->a[0].zDat
1380: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 54 61 62 abase);. pTab
1390: 6c 65 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 leName->a[0].zDa
13a0: 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a tabase = 0;. }.
13b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 69 . /* If the tri
13c0: 67 67 65 72 20 6e 61 6d 65 20 77 61 73 20 75 6e gger name was un
13d0: 71 75 61 6c 69 66 69 65 64 2c 20 61 6e 64 20 74 qualified, and t
13e0: 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 74 65 he table is a te
13f0: 6d 70 20 74 61 62 6c 65 2c 0a 20 20 2a 2a 20 74 mp table,. ** t
1400: 68 65 6e 20 73 65 74 20 69 44 62 20 74 6f 20 31 hen set iDb to 1
1410: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 to create the t
1420: 72 69 67 67 65 72 20 69 6e 20 74 68 65 20 74 65 rigger in the te
1430: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 mporary database
1440: 2e 0a 20 20 2a 2a 20 49 66 20 73 71 6c 69 74 65 .. ** If sqlite
1450: 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 29 3SrcListLookup()
1460: 20 72 65 74 75 72 6e 73 20 30 2c 20 69 6e 64 69 returns 0, indi
1470: 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 cating the table
1480: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 does not. ** e
1490: 78 69 73 74 2c 20 74 68 65 20 65 72 72 6f 72 20 xist, the error
14a0: 69 73 20 63 61 75 67 68 74 20 62 79 20 74 68 65 is caught by the
14b0: 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 block below..
14c0: 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 */. pTab = sqli
14d0: 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 te3SrcListLookup
14e0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 4e (pParse, pTableN
14f0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e ame);. if( db->
1500: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26 26 20 init.busy==0 &&
1510: 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 pName2->n==0 &&
1520: 70 54 61 62 0a 20 20 20 20 20 20 20 20 26 26 20 pTab. &&
1530: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 pTab->pSchema==d
1540: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d b->aDb[1].pSchem
1550: 61 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 31 a ){. iDb = 1
1560: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 ;. }.. /* Ensu
1570: 72 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d re the table nam
1580: 65 20 6d 61 74 63 68 65 73 20 64 61 74 61 62 61 e matches databa
1590: 73 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 61 74 se name and that
15a0: 20 74 68 65 20 74 61 62 6c 65 20 65 78 69 73 74 the table exist
15b0: 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d s */. if( db->m
15c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f allocFailed ) go
15d0: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e to trigger_clean
15e0: 75 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 up;. assert( pT
15f0: 61 62 6c 65 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d ableName->nSrc==
1600: 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 1 );. if( sqlit
1610: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c e3FixInit(&sFix,
1620: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 pParse, iDb, "t
1630: 72 69 67 67 65 72 22 2c 20 70 4e 61 6d 65 29 20 rigger", pName)
1640: 26 26 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 && . sqlite
1650: 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 3FixSrcList(&sFi
1660: 78 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 20 29 x, pTableName) )
1670: 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 {. goto trigg
1680: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a er_cleanup;. }.
1690: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 pTab = sqlite3
16a0: 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 SrcListLookup(pP
16b0: 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d 65 arse, pTableName
16c0: 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 29 );. if( !pTab )
16d0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 {. /* The tab
16e0: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 le does not exis
16f0: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 t. */. if( db
1700: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 7b ->init.iDb==1 ){
1710: 0a 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 . /* Ticket
1720: 20 23 33 38 31 30 2e 0a 20 20 20 20 20 20 2a 2a #3810.. **
1730: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65 6e 65 Normally, whene
1740: 76 65 72 20 61 20 74 61 62 6c 65 20 69 73 20 64 ver a table is d
1750: 72 6f 70 70 65 64 2c 20 61 6c 6c 20 61 73 73 6f ropped, all asso
1760: 63 69 61 74 65 64 20 74 72 69 67 67 65 72 73 20 ciated triggers
1770: 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 64 72 6f are. ** dro
1780: 70 70 65 64 20 74 6f 6f 2e 20 20 42 75 74 20 69 pped too. But i
1790: 66 20 61 20 54 45 4d 50 20 74 72 69 67 67 65 72 f a TEMP trigger
17a0: 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 20 61 is created on a
17b0: 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 0a non-TEMP table.
17c0: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 ** and the
17d0: 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 table is droppe
17e0: 64 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 d by a different
17f0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 database connec
1800: 74 69 6f 6e 2c 20 74 68 65 0a 20 20 20 20 20 20 tion, the.
1810: 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20 6e 6f ** trigger is no
1820: 74 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 65 t visible to the
1830: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 database connec
1840: 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 74 tion that does t
1850: 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 72 6f 70 he. ** drop
1860: 20 73 6f 20 74 68 65 20 74 72 69 67 67 65 72 20 so the trigger
1870: 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 cannot be droppe
1880: 64 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 d. This results
1890: 20 69 6e 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 in an. **
18a0: 22 6f 72 70 68 61 6e 65 64 20 74 72 69 67 67 65 "orphaned trigge
18b0: 72 22 20 2d 20 61 20 74 72 69 67 67 65 72 20 77 r" - a trigger w
18c0: 68 6f 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 hose associated
18d0: 74 61 62 6c 65 20 69 73 20 6d 69 73 73 69 6e 67 table is missing
18e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 .. */.
18f0: 20 64 62 2d 3e 69 6e 69 74 2e 6f 72 70 68 61 6e db->init.orphan
1900: 54 72 69 67 67 65 72 20 3d 20 31 3b 0a 20 20 20 Trigger = 1;.
1910: 20 7d 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 }. goto trig
1920: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d ger_cleanup;. }
1930: 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c . if( IsVirtual
1940: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 (pTab) ){. sq
1950: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 lite3ErrorMsg(pP
1960: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 arse, "cannot cr
1970: 65 61 74 65 20 74 72 69 67 67 65 72 73 20 6f 6e eate triggers on
1980: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 22 virtual tables"
1990: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 );. goto trig
19a0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d ger_cleanup;. }
19b0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 .. /* Check tha
19c0: 74 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 t the trigger na
19d0: 6d 65 20 69 73 20 6e 6f 74 20 72 65 73 65 72 76 me is not reserv
19e0: 65 64 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 74 ed and that no t
19f0: 72 69 67 67 65 72 20 6f 66 20 74 68 65 0a 20 20 rigger of the.
1a00: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 61 6d ** specified nam
1a10: 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 7a 4e e exists */. zN
1a20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d ame = sqlite3Nam
1a30: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 eFromToken(db, p
1a40: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 4e Name);. if( !zN
1a50: 61 6d 65 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b ame || SQLITE_OK
1a60: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 !=sqlite3CheckOb
1a70: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c jectName(pParse,
1a80: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 zName) ){. g
1a90: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 oto trigger_clea
1aa0: 6e 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 nup;. }. asser
1ab0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 t( sqlite3Schema
1ac0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 MutexHeld(db, iD
1ad0: 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 73 b, 0) );. if( s
1ae0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 qlite3HashFind(&
1af0: 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 (db->aDb[iDb].pS
1b00: 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 29 chema->trigHash)
1b10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1b20: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 73 zName, s
1b30: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a qlite3Strlen30(z
1b40: 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 69 66 Name)) ){. if
1b50: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 ( !noErr ){.
1b60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 sqlite3ErrorMs
1b70: 67 28 70 50 61 72 73 65 2c 20 22 74 72 69 67 67 g(pParse, "trigg
1b80: 65 72 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 er %T already ex
1b90: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 ists", pName);.
1ba0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
1bb0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 assert( !db->ini
1bc0: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 t.busy );.
1bd0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 sqlite3CodeVerif
1be0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 ySchema(pParse,
1bf0: 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 iDb);. }.
1c00: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 goto trigger_cle
1c10: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 anup;. }.. /*
1c20: 44 6f 20 6e 6f 74 20 63 72 65 61 74 65 20 61 20 Do not create a
1c30: 74 72 69 67 67 65 72 20 6f 6e 20 61 20 73 79 73 trigger on a sys
1c40: 74 65 6d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 tem table */. i
1c50: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 f( sqlite3StrNIC
1c60: 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 mp(pTab->zName,
1c70: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 "sqlite_", 7)==0
1c80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 ){. sqlite3E
1c90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 rrorMsg(pParse,
1ca0: 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74 "cannot create t
1cb0: 72 69 67 67 65 72 20 6f 6e 20 73 79 73 74 65 6d rigger on system
1cc0: 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 70 50 table");. pP
1cd0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 arse->nErr++;.
1ce0: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 goto trigger_c
1cf0: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f leanup;. }.. /
1d00: 2a 20 49 4e 53 54 45 41 44 20 6f 66 20 74 72 69 * INSTEAD of tri
1d10: 67 67 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 66 ggers are only f
1d20: 6f 72 20 76 69 65 77 73 20 61 6e 64 20 76 69 65 or views and vie
1d30: 77 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 ws only support
1d40: 49 4e 53 54 45 41 44 0a 20 20 2a 2a 20 6f 66 20 INSTEAD. ** of
1d50: 74 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 triggers.. */.
1d60: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 if( pTab->pSele
1d70: 63 74 20 26 26 20 74 72 5f 74 6d 21 3d 54 4b 5f ct && tr_tm!=TK_
1d80: 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73 INSTEAD ){. s
1d90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 qlite3ErrorMsg(p
1da0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 Parse, "cannot c
1db0: 72 65 61 74 65 20 25 73 20 74 72 69 67 67 65 72 reate %s trigger
1dc0: 20 6f 6e 20 76 69 65 77 3a 20 25 53 22 2c 20 0a on view: %S", .
1dd0: 20 20 20 20 20 20 20 20 28 74 72 5f 74 6d 20 3d (tr_tm =
1de0: 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f 22 42 45 = TK_BEFORE)?"BE
1df0: 46 4f 52 45 22 3a 22 41 46 54 45 52 22 2c 20 70 FORE":"AFTER", p
1e00: 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 TableName, 0);.
1e10: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f goto trigger_
1e20: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 cleanup;. }. i
1e30: 66 28 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 f( !pTab->pSelec
1e40: 74 20 26 26 20 74 72 5f 74 6d 3d 3d 54 4b 5f 49 t && tr_tm==TK_I
1e50: 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73 71 NSTEAD ){. sq
1e60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 lite3ErrorMsg(pP
1e70: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 arse, "cannot cr
1e80: 65 61 74 65 20 49 4e 53 54 45 41 44 20 4f 46 22 eate INSTEAD OF"
1e90: 0a 20 20 20 20 20 20 20 20 22 20 74 72 69 67 67 . " trigg
1ea0: 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20 25 53 22 er on table: %S"
1eb0: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 , pTableName, 0)
1ec0: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 ;. goto trigg
1ed0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a er_cleanup;. }.
1ee0: 20 20 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74 iTabDb = sqlit
1ef0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 e3SchemaToIndex(
1f00: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d db, pTab->pSchem
1f10: 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c a);..#ifndef SQL
1f20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 ITE_OMIT_AUTHORI
1f30: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 ZATION. {. i
1f40: 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 nt code = SQLITE
1f50: 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 3b _CREATE_TRIGGER;
1f60: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
1f70: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 *zDb = db->aDb[i
1f80: 54 61 62 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 TabDb].zName;.
1f90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 const char *zD
1fa0: 62 54 72 69 67 20 3d 20 69 73 54 65 6d 70 20 3f bTrig = isTemp ?
1fb0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d db->aDb[1].zNam
1fc0: 65 20 3a 20 7a 44 62 3b 0a 20 20 20 20 69 66 28 e : zDb;. if(
1fd0: 20 69 54 61 62 44 62 3d 3d 31 20 7c 7c 20 69 73 iTabDb==1 || is
1fe0: 54 65 6d 70 20 29 20 63 6f 64 65 20 3d 20 53 51 Temp ) code = SQ
1ff0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 LITE_CREATE_TEMP
2000: 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 69 66 _TRIGGER;. if
2010: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 ( sqlite3AuthChe
2020: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c ck(pParse, code,
2030: 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e zName, pTab->zN
2040: 61 6d 65 2c 20 7a 44 62 54 72 69 67 29 20 29 7b ame, zDbTrig) ){
2050: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 . goto trig
2060: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 ger_cleanup;.
2070: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 }. if( sqlit
2080: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 e3AuthCheck(pPar
2090: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 se, SQLITE_INSER
20a0: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 T, SCHEMA_TABLE(
20b0: 69 54 61 62 44 62 29 2c 30 2c 7a 44 62 29 29 7b iTabDb),0,zDb)){
20c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 . goto trig
20d0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 ger_cleanup;.
20e0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 }. }.#endif..
20f0: 20 2f 2a 20 49 4e 53 54 45 41 44 20 4f 46 20 74 /* INSTEAD OF t
2100: 72 69 67 67 65 72 73 20 63 61 6e 20 6f 6e 6c 79 riggers can only
2110: 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73 appear on views
2120: 20 61 6e 64 20 42 45 46 4f 52 45 20 74 72 69 67 and BEFORE trig
2130: 67 65 72 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 gers. ** cannot
2140: 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73 appear on views
2150: 2e 20 20 53 6f 20 77 65 20 6d 69 67 68 74 20 61 . So we might a
2160: 73 20 77 65 6c 6c 20 74 72 61 6e 73 6c 61 74 65 s well translate
2170: 20 65 76 65 72 79 0a 20 20 2a 2a 20 49 4e 53 54 every. ** INST
2180: 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 20 69 EAD OF trigger i
2190: 6e 74 6f 20 61 20 42 45 46 4f 52 45 20 74 72 69 nto a BEFORE tri
21a0: 67 67 65 72 2e 20 20 49 74 20 73 69 6d 70 6c 69 gger. It simpli
21b0: 66 69 65 73 20 63 6f 64 65 0a 20 20 2a 2a 20 65 fies code. ** e
21c0: 6c 73 65 77 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 lsewhere.. */.
21d0: 20 69 66 20 28 74 72 5f 74 6d 20 3d 3d 20 54 4b if (tr_tm == TK
21e0: 5f 49 4e 53 54 45 41 44 29 7b 0a 20 20 20 20 74 _INSTEAD){. t
21f0: 72 5f 74 6d 20 3d 20 54 4b 5f 42 45 46 4f 52 45 r_tm = TK_BEFORE
2200: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c ;. }.. /* Buil
2210: 64 20 74 68 65 20 54 72 69 67 67 65 72 20 6f 62 d the Trigger ob
2220: 6a 65 63 74 20 2a 2f 0a 20 20 70 54 72 69 67 67 ject */. pTrigg
2230: 65 72 20 3d 20 28 54 72 69 67 67 65 72 2a 29 73 er = (Trigger*)s
2240: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 qlite3DbMallocZe
2250: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72 ro(db, sizeof(Tr
2260: 69 67 67 65 72 29 29 3b 0a 20 20 69 66 28 20 70 igger));. if( p
2270: 54 72 69 67 67 65 72 3d 3d 30 20 29 20 67 6f 74 Trigger==0 ) got
2280: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 o trigger_cleanu
2290: 70 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 7a p;. pTrigger->z
22a0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 Name = zName;.
22b0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 72 zName = 0;. pTr
22c0: 69 67 67 65 72 2d 3e 74 61 62 6c 65 20 3d 20 73 igger->table = s
22d0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 qlite3DbStrDup(d
22e0: 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61 b, pTableName->a
22f0: 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 70 54 [0].zName);. pT
2300: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20 rigger->pSchema
2310: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 = db->aDb[iDb].p
2320: 53 63 68 65 6d 61 3b 0a 20 20 70 54 72 69 67 67 Schema;. pTrigg
2330: 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 3d er->pTabSchema =
2340: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a pTab->pSchema;.
2350: 20 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 20 3d pTrigger->op =
2360: 20 28 75 38 29 6f 70 3b 0a 20 20 70 54 72 69 67 (u8)op;. pTrig
2370: 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 20 74 72 5f ger->tr_tm = tr_
2380: 74 6d 3d 3d 54 4b 5f 42 45 46 4f 52 45 20 3f 20 tm==TK_BEFORE ?
2390: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 3a TRIGGER_BEFORE :
23a0: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 3b 0a TRIGGER_AFTER;.
23b0: 20 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65 pTrigger->pWhe
23c0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 n = sqlite3ExprD
23d0: 75 70 28 64 62 2c 20 70 57 68 65 6e 2c 20 45 58 up(db, pWhen, EX
23e0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 PRDUP_REDUCE);.
23f0: 20 70 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 pTrigger->pColu
2400: 6d 6e 73 20 3d 20 73 71 6c 69 74 65 33 49 64 4c mns = sqlite3IdL
2410: 69 73 74 44 75 70 28 64 62 2c 20 70 43 6f 6c 75 istDup(db, pColu
2420: 6d 6e 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20 mns);. assert(
2430: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 pParse->pNewTrig
2440: 67 65 72 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 ger==0 );. pPar
2450: 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20 se->pNewTrigger
2460: 3d 20 70 54 72 69 67 67 65 72 3b 0a 0a 74 72 69 = pTrigger;..tri
2470: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 gger_cleanup:.
2480: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
2490: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 , zName);. sqli
24a0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 te3SrcListDelete
24b0: 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 (db, pTableName)
24c0: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 ;. sqlite3IdLis
24d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c tDelete(db, pCol
24e0: 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 umns);. sqlite3
24f0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 ExprDelete(db, p
2500: 57 68 65 6e 29 3b 0a 20 20 69 66 28 20 21 70 50 When);. if( !pP
2510: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 arse->pNewTrigge
2520: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 r ){. sqlite3
2530: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62 DeleteTrigger(db
2540: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d , pTrigger);. }
2550: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 else{. assert
2560: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 ( pParse->pNewTr
2570: 69 67 67 65 72 3d 3d 70 54 72 69 67 67 65 72 20 igger==pTrigger
2580: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 );. }.}../*.**
2590: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 This routine is
25a0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c called after all
25b0: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20 of the trigger
25c0: 61 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 actions have bee
25d0: 6e 20 70 61 72 73 65 64 0a 2a 2a 20 69 6e 20 6f n parsed.** in o
25e0: 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 rder to complete
25f0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 the process of
2600: 62 75 69 6c 64 69 6e 67 20 74 68 65 20 74 72 69 building the tri
2610: 67 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 gger..*/.void sq
2620: 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67 lite3FinishTrigg
2630: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 er(. Parse *pPa
2640: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a rse, /*
2650: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 Parser context
2660: 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 */. TriggerStep
2670: 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 2f 2a 20 *pStepList, /*
2680: 54 68 65 20 74 72 69 67 67 65 72 65 64 20 70 72 The triggered pr
2690: 6f 67 72 61 6d 20 2a 2f 0a 20 20 54 6f 6b 65 6e ogram */. Token
26a0: 20 2a 70 41 6c 6c 20 20 20 20 20 20 20 20 20 20 *pAll
26b0: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74 /* Token that
26c0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63 describes the c
26d0: 6f 6d 70 6c 65 74 65 20 43 52 45 41 54 45 20 54 omplete CREATE T
26e0: 52 49 47 47 45 52 20 2a 2f 0a 29 7b 0a 20 20 54 RIGGER */.){. T
26f0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 20 3d 20 rigger *pTrig =
2700: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 pParse->pNewTrig
2710: 67 65 72 3b 20 20 20 2f 2a 20 54 72 69 67 67 65 ger; /* Trigge
2720: 72 20 62 65 69 6e 67 20 66 69 6e 69 73 68 65 64 r being finished
2730: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d */. char *zNam
2740: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
2760: 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72 Name of trigger
2770: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 */. sqlite3 *d
2780: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 b = pParse->db;
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
27a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f The database */
27b0: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b . DbFixer sFix;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 /* Fi
27e0: 78 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 xer object */.
27f0: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 int iDb;
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2810: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 /* Datab
2820: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 ase containing t
2830: 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 he trigger */.
2840: 54 6f 6b 65 6e 20 6e 61 6d 65 54 6f 6b 65 6e 3b Token nameToken;
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2860: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 69 67 67 /* Trigg
2870: 65 72 20 6e 61 6d 65 20 66 6f 72 20 65 72 72 6f er name for erro
2880: 72 20 72 65 70 6f 72 74 69 6e 67 20 2a 2f 0a 0a r reporting */..
2890: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 pParse->pNewTr
28a0: 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 igger = 0;. if(
28b0: 20 4e 45 56 45 52 28 70 50 61 72 73 65 2d 3e 6e NEVER(pParse->n
28c0: 45 72 72 29 20 7c 7c 20 21 70 54 72 69 67 20 29 Err) || !pTrig )
28d0: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e goto triggerfin
28e0: 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7a ish_cleanup;. z
28f0: 4e 61 6d 65 20 3d 20 70 54 72 69 67 2d 3e 7a 4e Name = pTrig->zN
2900: 61 6d 65 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c ame;. iDb = sql
2910: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 ite3SchemaToInde
2920: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 x(pParse->db, pT
2930: 72 69 67 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 rig->pSchema);.
2940: 20 70 54 72 69 67 2d 3e 73 74 65 70 5f 6c 69 73 pTrig->step_lis
2950: 74 20 3d 20 70 53 74 65 70 4c 69 73 74 3b 0a 20 t = pStepList;.
2960: 20 77 68 69 6c 65 28 20 70 53 74 65 70 4c 69 73 while( pStepLis
2970: 74 20 29 7b 0a 20 20 20 20 70 53 74 65 70 4c 69 t ){. pStepLi
2980: 73 74 2d 3e 70 54 72 69 67 20 3d 20 70 54 72 69 st->pTrig = pTri
2990: 67 3b 0a 20 20 20 20 70 53 74 65 70 4c 69 73 74 g;. pStepList
29a0: 20 3d 20 70 53 74 65 70 4c 69 73 74 2d 3e 70 4e = pStepList->pN
29b0: 65 78 74 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 54 ext;. }. nameT
29c0: 6f 6b 65 6e 2e 7a 20 3d 20 70 54 72 69 67 2d 3e oken.z = pTrig->
29d0: 7a 4e 61 6d 65 3b 0a 20 20 6e 61 6d 65 54 6f 6b zName;. nameTok
29e0: 65 6e 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 en.n = sqlite3St
29f0: 72 6c 65 6e 33 30 28 6e 61 6d 65 54 6f 6b 65 6e rlen30(nameToken
2a00: 2e 7a 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 .z);. if( sqlit
2a10: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c e3FixInit(&sFix,
2a20: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 pParse, iDb, "t
2a30: 72 69 67 67 65 72 22 2c 20 26 6e 61 6d 65 54 6f rigger", &nameTo
2a40: 6b 65 6e 29 20 0a 20 20 20 20 20 20 20 20 20 20 ken) .
2a50: 26 26 20 73 71 6c 69 74 65 33 46 69 78 54 72 69 && sqlite3FixTri
2a60: 67 67 65 72 53 74 65 70 28 26 73 46 69 78 2c 20 ggerStep(&sFix,
2a70: 70 54 72 69 67 2d 3e 73 74 65 70 5f 6c 69 73 74 pTrig->step_list
2a80: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 ) ){. goto tr
2a90: 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 iggerfinish_clea
2aa0: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 69 nup;. }.. /* i
2ab0: 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 f we are not ini
2ac0: 74 69 61 6c 69 7a 69 6e 67 2c 0a 20 20 2a 2a 20 tializing,. **
2ad0: 62 75 69 6c 64 20 74 68 65 20 73 71 6c 69 74 65 build the sqlite
2ae0: 5f 6d 61 73 74 65 72 20 65 6e 74 72 79 0a 20 20 _master entry.
2af0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e */. if( !db->in
2b00: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 56 it.busy ){. V
2b10: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 dbe *v;. char
2b20: 20 2a 7a 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b *z;.. /* Mak
2b30: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 e an entry in th
2b40: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 e sqlite_master
2b50: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 76 20 3d table */. v =
2b60: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 sqlite3GetVdbe(
2b70: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 pParse);. if(
2b80: 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72 69 v==0 ) goto tri
2b90: 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e ggerfinish_clean
2ba0: 75 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 up;. sqlite3B
2bb0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 eginWriteOperati
2bc0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 on(pParse, 0, iD
2bd0: 62 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 b);. z = sqli
2be0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c te3DbStrNDup(db,
2bf0: 20 28 63 68 61 72 2a 29 70 41 6c 6c 2d 3e 7a 2c (char*)pAll->z,
2c00: 20 70 41 6c 6c 2d 3e 6e 29 3b 0a 20 20 20 20 73 pAll->n);. s
2c10: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 qlite3NestedPars
2c20: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 e(pParse,.
2c30: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 "INSERT INTO %Q
2c40: 2e 25 73 20 56 41 4c 55 45 53 28 27 74 72 69 67 .%s VALUES('trig
2c50: 67 65 72 27 2c 25 51 2c 25 51 2c 30 2c 27 43 52 ger',%Q,%Q,0,'CR
2c60: 45 41 54 45 20 54 52 49 47 47 45 52 20 25 71 27 EATE TRIGGER %q'
2c70: 29 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 )",. db->a
2c80: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 Db[iDb].zName, S
2c90: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 CHEMA_TABLE(iDb)
2ca0: 2c 20 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 , zName,.
2cb0: 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c 20 7a 29 pTrig->table, z)
2cc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 ;. sqlite3DbF
2cd0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 ree(db, z);.
2ce0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f sqlite3ChangeCoo
2cf0: 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 kie(pParse, iDb)
2d00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 ;. sqlite3Vdb
2d10: 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f eAddParseSchemaO
2d20: 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 p(v, iDb,.
2d30: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 sqlite3MPrintf
2d40: 28 64 62 2c 20 22 74 79 70 65 3d 27 74 72 69 67 (db, "type='trig
2d50: 67 65 72 27 20 41 4e 44 20 6e 61 6d 65 3d 27 25 ger' AND name='%
2d60: 71 27 22 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 q'", zName));.
2d70: 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 }.. if( db->ini
2d80: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 72 t.busy ){. Tr
2d90: 69 67 67 65 72 20 2a 70 4c 69 6e 6b 20 3d 20 70 igger *pLink = p
2da0: 54 72 69 67 3b 0a 20 20 20 20 48 61 73 68 20 2a Trig;. Hash *
2db0: 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 pHash = &db->aDb
2dc0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 [iDb].pSchema->t
2dd0: 72 69 67 48 61 73 68 3b 0a 20 20 20 20 61 73 73 rigHash;. ass
2de0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 ert( sqlite3Sche
2df0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 maMutexHeld(db,
2e00: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 iDb, 0) );. p
2e10: 54 72 69 67 20 3d 20 73 71 6c 69 74 65 33 48 61 Trig = sqlite3Ha
2e20: 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 shInsert(pHash,
2e30: 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 zName, sqlite3St
2e40: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 70 rlen30(zName), p
2e50: 54 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 70 Trig);. if( p
2e60: 54 72 69 67 20 29 7b 0a 20 20 20 20 20 20 64 62 Trig ){. db
2e70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d ->mallocFailed =
2e80: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 1;. }else if
2e90: 28 20 70 4c 69 6e 6b 2d 3e 70 53 63 68 65 6d 61 ( pLink->pSchema
2ea0: 3d 3d 70 4c 69 6e 6b 2d 3e 70 54 61 62 53 63 68 ==pLink->pTabSch
2eb0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 54 61 62 ema ){. Tab
2ec0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 le *pTab;.
2ed0: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 int n = sqlite3S
2ee0: 74 72 6c 65 6e 33 30 28 70 4c 69 6e 6b 2d 3e 74 trlen30(pLink->t
2ef0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 70 54 61 able);. pTa
2f00: 62 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 b = sqlite3HashF
2f10: 69 6e 64 28 26 70 4c 69 6e 6b 2d 3e 70 54 61 62 ind(&pLink->pTab
2f20: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c Schema->tblHash,
2f30: 20 70 4c 69 6e 6b 2d 3e 74 61 62 6c 65 2c 20 6e pLink->table, n
2f40: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 );. assert(
2f50: 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 pTab!=0 );.
2f60: 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d pLink->pNext =
2f70: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b pTab->pTrigger;
2f80: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 54 72 . pTab->pTr
2f90: 69 67 67 65 72 20 3d 20 70 4c 69 6e 6b 3b 0a 20 igger = pLink;.
2fa0: 20 20 20 7d 0a 20 20 7d 0a 0a 74 72 69 67 67 65 }. }..trigge
2fb0: 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3a rfinish_cleanup:
2fc0: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 . sqlite3Delete
2fd0: 54 72 69 67 67 65 72 28 64 62 2c 20 70 54 72 69 Trigger(db, pTri
2fe0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 g);. assert( !p
2ff0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 Parse->pNewTrigg
3000: 65 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 er );. sqlite3D
3010: 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70 eleteTriggerStep
3020: 28 64 62 2c 20 70 53 74 65 70 4c 69 73 74 29 3b (db, pStepList);
3030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 .}../*.** Turn a
3040: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e SELECT statemen
3050: 74 20 28 74 68 61 74 20 74 68 65 20 70 53 65 6c t (that the pSel
3060: 65 63 74 20 70 61 72 61 6d 65 74 65 72 20 70 6f ect parameter po
3070: 69 6e 74 73 20 74 6f 29 20 69 6e 74 6f 0a 2a 2a ints to) into.**
3080: 20 61 20 74 72 69 67 67 65 72 20 73 74 65 70 2e a trigger step.
3090: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 Return a point
30a0: 65 72 20 74 6f 20 61 20 54 72 69 67 67 65 72 53 er to a TriggerS
30b0: 74 65 70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a tep structure..*
30c0: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 *.** The parser
30d0: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 calls this routi
30e0: 6e 65 20 77 68 65 6e 20 69 74 20 66 69 6e 64 73 ne when it finds
30f0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d a SELECT statem
3100: 65 6e 74 20 69 6e 0a 2a 2a 20 62 6f 64 79 20 6f ent in.** body o
3110: 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 0a 2a f a TRIGGER. .*
3120: 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 /.TriggerStep *s
3130: 71 6c 69 74 65 33 54 72 69 67 67 65 72 53 65 6c qlite3TriggerSel
3140: 65 63 74 53 74 65 70 28 73 71 6c 69 74 65 33 20 ectStep(sqlite3
3150: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 *db, Select *pSe
3160: 6c 65 63 74 29 7b 0a 20 20 54 72 69 67 67 65 72 lect){. Trigger
3170: 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 Step *pTriggerSt
3180: 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 ep = sqlite3DbMa
3190: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a llocZero(db, siz
31a0: 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29 eof(TriggerStep)
31b0: 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 );. if( pTrigge
31c0: 72 53 74 65 70 3d 3d 30 20 29 20 7b 0a 20 20 20 rStep==0 ) {.
31d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 sqlite3SelectDe
31e0: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 lete(db, pSelect
31f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b );. return 0;
3200: 0a 20 20 7d 0a 20 20 70 54 72 69 67 67 65 72 53 . }. pTriggerS
3210: 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c tep->op = TK_SEL
3220: 45 43 54 3b 0a 20 20 70 54 72 69 67 67 65 72 53 ECT;. pTriggerS
3230: 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 tep->pSelect = p
3240: 53 65 6c 65 63 74 3b 0a 20 20 70 54 72 69 67 67 Select;. pTrigg
3250: 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d erStep->orconf =
3260: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 72 OE_Default;. r
3270: 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 eturn pTriggerSt
3280: 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c ep;.}../*.** All
3290: 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 68 ocate space to h
32a0: 6f 6c 64 20 61 20 6e 65 77 20 74 72 69 67 67 65 old a new trigge
32b0: 72 20 73 74 65 70 2e 20 20 54 68 65 20 61 6c 6c r step. The all
32c0: 6f 63 61 74 65 64 20 73 70 61 63 65 0a 2a 2a 20 ocated space.**
32d0: 68 6f 6c 64 73 20 62 6f 74 68 20 74 68 65 20 54 holds both the T
32e0: 72 69 67 67 65 72 53 74 65 70 20 6f 62 6a 65 63 riggerStep objec
32f0: 74 20 61 6e 64 20 74 68 65 20 54 72 69 67 67 65 t and the Trigge
3300: 72 53 74 65 70 2e 74 61 72 67 65 74 2e 7a 20 73 rStep.target.z s
3310: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 tring..**.** If
3320: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 an OOM error occ
3330: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 urs, NULL is ret
3340: 75 72 6e 65 64 20 61 6e 64 20 64 62 2d 3e 6d 61 urned and db->ma
3350: 6c 6c 6f 63 46 61 69 6c 65 64 20 69 73 20 73 65 llocFailed is se
3360: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 t..*/.static Tri
3370: 67 67 65 72 53 74 65 70 20 2a 74 72 69 67 67 65 ggerStep *trigge
3380: 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 0a 20 rStepAllocate(.
3390: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 sqlite3 *db,
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
33b0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 Database connect
33c0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 ion */. u8 op,
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
33e0: 20 20 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 /* Trigger
33f0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 54 6f 6b 65 opcode */. Toke
3400: 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 n *pName
3410: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 /* The t
3420: 61 72 67 65 74 20 6e 61 6d 65 20 2a 2f 0a 29 7b arget name */.){
3430: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a . TriggerStep *
3440: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 0a 20 pTriggerStep;..
3450: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 pTriggerStep =
3460: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a sqlite3DbMallocZ
3470: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 ero(db, sizeof(T
3480: 72 69 67 67 65 72 53 74 65 70 29 20 2b 20 70 4e riggerStep) + pN
3490: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 ame->n);. if( p
34a0: 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 TriggerStep ){.
34b0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 char *z = (ch
34c0: 61 72 2a 29 26 70 54 72 69 67 67 65 72 53 74 65 ar*)&pTriggerSte
34d0: 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 p[1];. memcpy
34e0: 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e (z, pName->z, pN
34f0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 72 ame->n);. pTr
3500: 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 iggerStep->targe
3510: 74 2e 7a 20 3d 20 7a 3b 0a 20 20 20 20 70 54 72 t.z = z;. pTr
3520: 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 iggerStep->targe
3530: 74 2e 6e 20 3d 20 70 4e 61 6d 65 2d 3e 6e 3b 0a t.n = pName->n;.
3540: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 pTriggerStep
3550: 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 7d 0a 20 ->op = op;. }.
3560: 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 return pTrigger
3570: 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 Step;.}../*.** B
3580: 75 69 6c 64 20 61 20 74 72 69 67 67 65 72 20 73 uild a trigger s
3590: 74 65 70 20 6f 75 74 20 6f 66 20 61 6e 20 49 4e tep out of an IN
35a0: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 SERT statement.
35b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 Return a pointe
35c0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 77 20 r.** to the new
35d0: 74 72 69 67 67 65 72 20 73 74 65 70 2e 0a 2a 2a trigger step..**
35e0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 .** The parser c
35f0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e alls this routin
3600: 65 20 77 68 65 6e 20 69 74 20 73 65 65 73 20 61 e when it sees a
3610: 6e 20 49 4e 53 45 52 54 20 69 6e 73 69 64 65 20 n INSERT inside
3620: 74 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61 the.** body of a
3630: 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72 69 trigger..*/.Tri
3640: 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 ggerStep *sqlite
3650: 33 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 3TriggerInsertSt
3660: 65 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 ep(. sqlite3 *d
3670: 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 b, /* The
3680: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 database connec
3690: 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 tion */. Token
36a0: 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 2f 2a *pTableName, /*
36b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 Name of the tab
36c0: 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 le into which we
36d0: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 49 64 4c insert */. IdL
36e0: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20 ist *pColumn,
36f0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 /* List of colu
3700: 6d 6e 73 20 69 6e 20 70 54 61 62 6c 65 4e 61 6d mns in pTableNam
3710: 65 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f e to insert into
3720: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a */. ExprList *
3730: 70 45 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 pEList, /* The
3740: 20 56 41 4c 55 45 20 63 6c 61 75 73 65 3a 20 61 VALUE clause: a
3750: 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 list of values
3760: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a to be inserted *
3770: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c /. Select *pSel
3780: 65 63 74 2c 20 20 20 20 2f 2a 20 41 20 53 45 4c ect, /* A SEL
3790: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 ECT statement th
37a0: 61 74 20 73 75 70 70 6c 69 65 73 20 76 61 6c 75 at supplies valu
37b0: 65 73 20 2a 2f 0a 20 20 75 38 20 6f 72 63 6f 6e es */. u8 orcon
37c0: 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 f /* T
37d0: 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f he conflict algo
37e0: 72 69 74 68 6d 20 28 4f 45 5f 41 62 6f 72 74 2c rithm (OE_Abort,
37f0: 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 65 74 63 OE_Replace, etc
3800: 2e 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 .) */.){. Trigg
3810: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 erStep *pTrigger
3820: 53 74 65 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 Step;.. assert(
3830: 70 45 4c 69 73 74 20 3d 3d 20 30 20 7c 7c 20 70 pEList == 0 || p
3840: 53 65 6c 65 63 74 20 3d 3d 20 30 29 3b 0a 20 20 Select == 0);.
3850: 61 73 73 65 72 74 28 70 45 4c 69 73 74 20 21 3d assert(pEList !=
3860: 20 30 20 7c 7c 20 70 53 65 6c 65 63 74 20 21 3d 0 || pSelect !=
3870: 20 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 0 || db->malloc
3880: 46 61 69 6c 65 64 29 3b 0a 0a 20 20 70 54 72 69 Failed);.. pTri
3890: 67 67 65 72 53 74 65 70 20 3d 20 74 72 69 67 67 ggerStep = trigg
38a0: 65 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 erStepAllocate(d
38b0: 62 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 70 54 b, TK_INSERT, pT
38c0: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 ableName);. if(
38d0: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b pTriggerStep ){
38e0: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 . pTriggerSte
38f0: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c p->pSelect = sql
3900: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 ite3SelectDup(db
3910: 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 , pSelect, EXPRD
3920: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 UP_REDUCE);.
3930: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 49 pTriggerStep->pI
3940: 64 4c 69 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b dList = pColumn;
3950: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 . pTriggerSte
3960: 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 73 p->pExprList = s
3970: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 qlite3ExprListDu
3980: 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 45 58 p(db, pEList, EX
3990: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 PRDUP_REDUCE);.
39a0: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d pTriggerStep-
39b0: 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 >orconf = orconf
39c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 ;. }else{. s
39d0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 qlite3IdListDele
39e0: 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b te(db, pColumn);
39f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 . }. sqlite3Ex
3a00: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c prListDelete(db,
3a10: 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 pEList);. sqli
3a20: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 te3SelectDelete(
3a30: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 0a 20 db, pSelect);..
3a40: 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 return pTrigger
3a50: 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 Step;.}../*.** C
3a60: 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69 67 67 onstruct a trigg
3a70: 65 72 20 73 74 65 70 20 74 68 61 74 20 69 6d 70 er step that imp
3a80: 6c 65 6d 65 6e 74 73 20 61 6e 20 55 50 44 41 54 lements an UPDAT
3a90: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 E statement and
3aa0: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e return.** a poin
3ab0: 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67 ter to that trig
3ac0: 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 70 ger step. The p
3ad0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 arser calls this
3ae0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 routine when it
3af0: 0a 2a 2a 20 73 65 65 73 20 61 6e 20 55 50 44 41 .** sees an UPDA
3b00: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 TE statement ins
3b10: 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 ide the body of
3b20: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 a CREATE TRIGGER
3b30: 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 ..*/.TriggerStep
3b40: 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 *sqlite3Trigger
3b50: 55 70 64 61 74 65 53 74 65 70 28 0a 20 20 73 71 UpdateStep(. sq
3b60: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 lite3 *db,
3b70: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 /* The databa
3b80: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f se connection */
3b90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 . Token *pTable
3ba0: 4e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 Name, /* Name
3bb0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 of the table to
3bc0: 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 be updated */.
3bd0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 ExprList *pEList
3be0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 53 45 54 20 , /* The SET
3bf0: 63 6c 61 75 73 65 3a 20 6c 69 73 74 20 6f 66 20 clause: list of
3c00: 63 6f 6c 75 6d 6e 20 61 6e 64 20 6e 65 77 20 76 column and new v
3c10: 61 6c 75 65 73 20 2a 2f 0a 20 20 45 78 70 72 20 alues */. Expr
3c20: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 *pWhere,
3c30: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 /* The WHERE cla
3c40: 75 73 65 20 2a 2f 0a 20 20 75 38 20 6f 72 63 6f use */. u8 orco
3c50: 6e 66 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a nf /*
3c60: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c The conflict al
3c70: 67 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62 6f gorithm. (OE_Abo
3c80: 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 rt, OE_Ignore, e
3c90: 74 63 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 tc) */.){. Trig
3ca0: 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 gerStep *pTrigge
3cb0: 72 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67 rStep;.. pTrigg
3cc0: 65 72 53 74 65 70 20 3d 20 74 72 69 67 67 65 72 erStep = trigger
3cd0: 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62 2c StepAllocate(db,
3ce0: 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 54 61 62 TK_UPDATE, pTab
3cf0: 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 leName);. if( p
3d00: 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 TriggerStep ){.
3d10: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d pTriggerStep-
3d20: 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 73 71 6c >pExprList = sql
3d30: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 ite3ExprListDup(
3d40: 64 62 2c 20 70 45 4c 69 73 74 2c 20 45 58 50 52 db, pEList, EXPR
3d50: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 DUP_REDUCE);.
3d60: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 pTriggerStep->p
3d70: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 Where = sqlite3E
3d80: 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 xprDup(db, pWher
3d90: 65 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 e, EXPRDUP_REDUC
3da0: 45 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 E);. pTrigger
3db0: 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f Step->orconf = o
3dc0: 72 63 6f 6e 66 3b 0a 20 20 7d 0a 20 20 73 71 6c rconf;. }. sql
3dd0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 ite3ExprListDele
3de0: 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a te(db, pEList);.
3df0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c sqlite3ExprDel
3e00: 65 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b ete(db, pWhere);
3e10: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 . return pTrigg
3e20: 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a erStep;.}../*.**
3e30: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69 Construct a tri
3e40: 67 67 65 72 20 73 74 65 70 20 74 68 61 74 20 69 gger step that i
3e50: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 44 45 4c 45 mplements a DELE
3e60: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 TE statement and
3e70: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 return.** a poi
3e80: 6e 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 nter to that tri
3e90: 67 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 gger step. The
3ea0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 parser calls thi
3eb0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 s routine when i
3ec0: 74 0a 2a 2a 20 73 65 65 73 20 61 20 44 45 4c 45 t.** sees a DELE
3ed0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 TE statement ins
3ee0: 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 ide the body of
3ef0: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 a CREATE TRIGGER
3f00: 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 ..*/.TriggerStep
3f10: 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 *sqlite3Trigger
3f20: 44 65 6c 65 74 65 53 74 65 70 28 0a 20 20 73 71 DeleteStep(. sq
3f30: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 lite3 *db,
3f40: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 /* Databas
3f50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a e connection */.
3f60: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e Token *pTableN
3f70: 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 ame, /* The
3f80: 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 table from whic
3f90: 68 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74 h rows are delet
3fa0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 ed */. Expr *pW
3fb0: 68 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20 here
3fc0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 /* The WHERE cla
3fd0: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 use */.){. Trig
3fe0: 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 gerStep *pTrigge
3ff0: 72 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67 rStep;.. pTrigg
4000: 65 72 53 74 65 70 20 3d 20 74 72 69 67 67 65 72 erStep = trigger
4010: 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62 2c StepAllocate(db,
4020: 20 54 4b 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 TK_DELETE, pTab
4030: 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 leName);. if( p
4040: 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 TriggerStep ){.
4050: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d pTriggerStep-
4060: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 >pWhere = sqlite
4070: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 3ExprDup(db, pWh
4080: 65 72 65 2c 20 45 58 50 52 44 55 50 5f 52 45 44 ere, EXPRDUP_RED
4090: 55 43 45 29 3b 0a 20 20 20 20 70 54 72 69 67 67 UCE);. pTrigg
40a0: 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d erStep->orconf =
40b0: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 7d OE_Default;. }
40c0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 . sqlite3ExprDe
40d0: 6c 65 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 lete(db, pWhere)
40e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 ;. return pTrig
40f0: 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a gerStep;.}../* .
4100: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 ** Recursively d
4110: 65 6c 65 74 65 20 61 20 54 72 69 67 67 65 72 20 elete a Trigger
4120: 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 76 6f 69 structure.*/.voi
4130: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 d sqlite3DeleteT
4140: 72 69 67 67 65 72 28 73 71 6c 69 74 65 33 20 2a rigger(sqlite3 *
4150: 64 62 2c 20 54 72 69 67 67 65 72 20 2a 70 54 72 db, Trigger *pTr
4160: 69 67 67 65 72 29 7b 0a 20 20 69 66 28 20 70 54 igger){. if( pT
4170: 72 69 67 67 65 72 3d 3d 30 20 29 20 72 65 74 75 rigger==0 ) retu
4180: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c rn;. sqlite3Del
4190: 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28 64 eteTriggerStep(d
41a0: 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 73 74 65 b, pTrigger->ste
41b0: 70 5f 6c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 p_list);. sqlit
41c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 72 e3DbFree(db, pTr
41d0: 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 igger->zName);.
41e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
41f0: 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62 b, pTrigger->tab
4200: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 le);. sqlite3Ex
4210: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54 72 prDelete(db, pTr
4220: 69 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b 0a 20 igger->pWhen);.
4230: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 sqlite3IdListDe
4240: 6c 65 74 65 28 64 62 2c 20 70 54 72 69 67 67 65 lete(db, pTrigge
4250: 72 2d 3e 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 r->pColumns);.
4260: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
4270: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a , pTrigger);.}..
4280: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 /*.** This funct
4290: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f ion is called to
42a0: 20 64 72 6f 70 20 61 20 74 72 69 67 67 65 72 20 drop a trigger
42b0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 from the databas
42c0: 65 20 73 63 68 65 6d 61 2e 20 0a 2a 2a 0a 2a 2a e schema. .**.**
42d0: 20 54 68 69 73 20 6d 61 79 20 62 65 20 63 61 6c This may be cal
42e0: 6c 65 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f led directly fro
42f0: 6d 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 m the parser and
4300: 20 74 68 65 72 65 66 6f 72 65 20 69 64 65 6e 74 therefore ident
4310: 69 66 69 65 73 0a 2a 2a 20 74 68 65 20 74 72 69 ifies.** the tri
4320: 67 67 65 72 20 62 79 20 6e 61 6d 65 2e 20 20 54 gger by name. T
4330: 68 65 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 he sqlite3DropTr
4340: 69 67 67 65 72 50 74 72 28 29 20 72 6f 75 74 69 iggerPtr() routi
4350: 6e 65 20 64 6f 65 73 20 74 68 65 0a 2a 2a 20 73 ne does the.** s
4360: 61 6d 65 20 6a 6f 62 20 61 73 20 74 68 69 73 20 ame job as this
4370: 72 6f 75 74 69 6e 65 20 65 78 63 65 70 74 20 69 routine except i
4380: 74 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 t takes a pointe
4390: 72 20 74 6f 20 74 68 65 20 74 72 69 67 67 65 72 r to the trigger
43a0: 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 .** instead of t
43b0: 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 2e he trigger name.
43c0: 0a 2a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 .**/.void sqlite
43d0: 33 44 72 6f 70 54 72 69 67 67 65 72 28 50 61 72 3DropTrigger(Par
43e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c se *pParse, SrcL
43f0: 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 ist *pName, int
4400: 6e 6f 45 72 72 29 7b 0a 20 20 54 72 69 67 67 65 noErr){. Trigge
4410: 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b r *pTrigger = 0;
4420: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 . int i;. cons
4430: 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 t char *zDb;. c
4440: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 onst char *zName
4450: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 ;. int nName;.
4460: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 sqlite3 *db = p
4470: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 Parse->db;.. if
4480: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c ( db->mallocFail
4490: 65 64 20 29 20 67 6f 74 6f 20 64 72 6f 70 5f 74 ed ) goto drop_t
44a0: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a rigger_cleanup;.
44b0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 if( SQLITE_OK!
44c0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 =sqlite3ReadSche
44d0: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 ma(pParse) ){.
44e0: 20 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 goto drop_trig
44f0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d ger_cleanup;. }
4500: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d .. assert( pNam
4510: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 e->nSrc==1 );.
4520: 7a 44 62 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 zDb = pName->a[0
4530: 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7a ].zDatabase;. z
4540: 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b Name = pName->a[
4550: 30 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 6e 4e 61 6d 0].zName;. nNam
4560: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 e = sqlite3Strle
4570: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 61 73 n30(zName);. as
4580: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 sert( zDb!=0 ||
4590: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 sqlite3BtreeHold
45a0: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 sAllMutexes(db)
45b0: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f );. for(i=OMIT_
45c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 TEMPDB; i<db->nD
45d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 b; i++){. int
45e0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 j = (i<2) ? i^1
45f0: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 : i; /* Search
4600: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 TEMP before MAI
4610: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 N */. if( zDb
4620: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 && sqlite3StrIC
4630: 6d 70 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e mp(db->aDb[j].zN
4640: 61 6d 65 2c 20 7a 44 62 29 20 29 20 63 6f 6e 74 ame, zDb) ) cont
4650: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 inue;. assert
4660: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d ( sqlite3SchemaM
4670: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 utexHeld(db, j,
4680: 30 29 20 29 3b 0a 20 20 20 20 70 54 72 69 67 67 0) );. pTrigg
4690: 65 72 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 er = sqlite3Hash
46a0: 46 69 6e 64 28 26 28 64 62 2d 3e 61 44 62 5b 6a Find(&(db->aDb[j
46b0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 ].pSchema->trigH
46c0: 61 73 68 29 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 ash), zName, nNa
46d0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72 me);. if( pTr
46e0: 69 67 67 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 igger ) break;.
46f0: 20 7d 0a 20 20 69 66 28 20 21 70 54 72 69 67 67 }. if( !pTrigg
4700: 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6e er ){. if( !n
4710: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 oErr ){. sq
4720: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 lite3ErrorMsg(pP
4730: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 arse, "no such t
4740: 72 69 67 67 65 72 3a 20 25 53 22 2c 20 70 4e 61 rigger: %S", pNa
4750: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 me, 0);. }els
4760: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 e{. sqlite3
4770: 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 CodeVerifyNamedS
4780: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 7a 44 chema(pParse, zD
4790: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 b);. }. pP
47a0: 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d arse->checkSchem
47b0: 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 a = 1;. goto
47c0: 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 drop_trigger_cle
47d0: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 anup;. }. sqli
47e0: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 te3DropTriggerPt
47f0: 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 r(pParse, pTrigg
4800: 65 72 29 3b 0a 0a 64 72 6f 70 5f 74 72 69 67 67 er);..drop_trigg
4810: 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 er_cleanup:. sq
4820: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 lite3SrcListDele
4830: 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d te(db, pName);.}
4840: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 ../*.** Return a
4850: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 pointer to the
4860: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 Table structure
4870: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 68 for the table th
4880: 61 74 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 at a trigger.**
4890: 69 73 20 73 65 74 20 6f 6e 2e 0a 2a 2f 0a 73 74 is set on..*/.st
48a0: 61 74 69 63 20 54 61 62 6c 65 20 2a 74 61 62 6c atic Table *tabl
48b0: 65 4f 66 54 72 69 67 67 65 72 28 54 72 69 67 67 eOfTrigger(Trigg
48c0: 65 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 er *pTrigger){.
48d0: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 int n = sqlite3
48e0: 53 74 72 6c 65 6e 33 30 28 70 54 72 69 67 67 65 Strlen30(pTrigge
48f0: 72 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 72 65 74 r->table);. ret
4900: 75 72 6e 20 73 71 6c 69 74 65 33 48 61 73 68 46 urn sqlite3HashF
4910: 69 6e 64 28 26 70 54 72 69 67 67 65 72 2d 3e 70 ind(&pTrigger->p
4920: 54 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 TabSchema->tblHa
4930: 73 68 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61 sh, pTrigger->ta
4940: 62 6c 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a ble, n);.}.../*.
4950: 2a 2a 20 44 72 6f 70 20 61 20 74 72 69 67 67 65 ** Drop a trigge
4960: 72 20 67 69 76 65 6e 20 61 20 70 6f 69 6e 74 65 r given a pointe
4970: 72 20 74 6f 20 74 68 61 74 20 74 72 69 67 67 65 r to that trigge
4980: 72 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 r. .*/.void sqli
4990: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 te3DropTriggerPt
49a0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c r(Parse *pParse,
49b0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 Trigger *pTrigg
49c0: 65 72 29 7b 0a 20 20 54 61 62 6c 65 20 20 20 2a er){. Table *
49d0: 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a pTable;. Vdbe *
49e0: 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 v;. sqlite3 *db
49f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 = pParse->db;.
4a00: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 44 62 int iDb;.. iDb
4a10: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 = sqlite3Schema
4a20: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e ToIndex(pParse->
4a30: 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 53 db, pTrigger->pS
4a40: 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 chema);. assert
4a50: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c ( iDb>=0 && iDb<
4a60: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 70 54 61 db->nDb );. pTa
4a70: 62 6c 65 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 ble = tableOfTri
4a80: 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a gger(pTrigger);.
4a90: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 assert( pTable
4aa0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 );. assert( pT
4ab0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 able->pSchema==p
4ac0: 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 Trigger->pSchema
4ad0: 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 23 69 || iDb==1 );.#i
4ae0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
4af0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a T_AUTHORIZATION.
4b00: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 {. int code
4b10: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 = SQLITE_DROP_T
4b20: 52 49 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73 RIGGER;. cons
4b30: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 t char *zDb = db
4b40: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 ->aDb[iDb].zName
4b50: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
4b60: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f *zTab = SCHEMA_
4b70: 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 TABLE(iDb);.
4b80: 69 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 64 if( iDb==1 ) cod
4b90: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f e = SQLITE_DROP_
4ba0: 54 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 TEMP_TRIGGER;.
4bb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 if( sqlite3Aut
4bc0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 hCheck(pParse, c
4bd0: 6f 64 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a ode, pTrigger->z
4be0: 4e 61 6d 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e Name, pTable->zN
4bf0: 61 6d 65 2c 20 7a 44 62 29 20 7c 7c 0a 20 20 20 ame, zDb) ||.
4c00: 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 sqlite3AuthCh
4c10: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 eck(pParse, SQLI
4c20: 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c TE_DELETE, zTab,
4c30: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 0, zDb) ){.
4c40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a return;. }.
4c50: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a }.#endif.. /*
4c60: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 Generate code t
4c70: 6f 20 64 65 73 74 72 6f 79 20 74 68 65 20 64 61 o destroy the da
4c80: 74 61 62 61 73 65 20 72 65 63 6f 72 64 20 6f 66 tabase record of
4c90: 20 74 68 65 20 74 72 69 67 67 65 72 2e 0a 20 20 the trigger..
4ca0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 */. assert( pTa
4cb0: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 ble!=0 );. if(
4cc0: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 (v = sqlite3GetV
4cd0: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 dbe(pParse))!=0
4ce0: 29 7b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b ){. int base;
4cf0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 . static cons
4d00: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f t VdbeOpList dro
4d10: 70 54 72 69 67 67 65 72 5b 5d 20 3d 20 7b 0a 20 pTrigger[] = {.
4d20: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 { OP_Rewind
4d30: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 , 0, ADDR(9)
4d40: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f , 0},. { O
4d50: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c P_String8, 0,
4d60: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 1, 0}, /
4d70: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f * 1 */. { O
4d80: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c P_Column, 0,
4d90: 20 31 2c 20 20 20 20 20 20 20 20 32 7d 2c 0a 20 1, 2},.
4da0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 { OP_Ne,
4db0: 20 20 20 20 20 20 32 2c 20 41 44 44 52 28 38 29 2, ADDR(8)
4dc0: 2c 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f , 1},. { O
4dd0: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c P_String8, 0,
4de0: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 1, 0}, /
4df0: 2a 20 34 3a 20 22 74 72 69 67 67 65 72 22 20 2a * 4: "trigger" *
4e00: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c /. { OP_Col
4e10: 75 6d 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 umn, 0, 0,
4e20: 20 20 20 20 20 20 32 7d 2c 0a 20 20 20 20 20 20 2},.
4e30: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 { OP_Ne,
4e40: 20 32 2c 20 41 44 44 52 28 38 29 2c 20 20 31 7d 2, ADDR(8), 1}
4e50: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c ,. { OP_Del
4e60: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 ete, 0, 0,
4e70: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 0},.
4e80: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 { OP_Next,
4e90: 20 30 2c 20 41 44 44 52 28 31 29 2c 20 20 30 7d 0, ADDR(1), 0}
4ea0: 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b , /* 8 */. };
4eb0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 .. sqlite3Beg
4ec0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e inWriteOperation
4ed0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 (pParse, 0, iDb)
4ee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 ;. sqlite3Ope
4ef0: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 nMasterTable(pPa
4f00: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 62 rse, iDb);. b
4f10: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 ase = sqlite3Vdb
4f20: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 20 41 eAddOpList(v, A
4f30: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 72 69 rraySize(dropTri
4f40: 67 67 65 72 29 2c 20 64 72 6f 70 54 72 69 67 67 gger), dropTrigg
4f50: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 er);. sqlite3
4f60: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 VdbeChangeP4(v,
4f70: 62 61 73 65 2b 31 2c 20 70 54 72 69 67 67 65 72 base+1, pTrigger
4f80: 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 54 52 41 4e ->zName, P4_TRAN
4f90: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 SIENT);. sqli
4fa0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 te3VdbeChangeP4(
4fb0: 76 2c 20 62 61 73 65 2b 34 2c 20 22 74 72 69 67 v, base+4, "trig
4fc0: 67 65 72 22 2c 20 50 34 5f 53 54 41 54 49 43 29 ger", P4_STATIC)
4fd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 ;. sqlite3Cha
4fe0: 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 ngeCookie(pParse
4ff0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 , iDb);. sqli
5000: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c te3VdbeAddOp2(v,
5010: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 OP_Close, 0, 0)
5020: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 ;. sqlite3Vdb
5030: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 eAddOp4(v, OP_Dr
5040: 6f 70 54 72 69 67 67 65 72 2c 20 69 44 62 2c 20 opTrigger, iDb,
5050: 30 2c 20 30 2c 20 70 54 72 69 67 67 65 72 2d 3e 0, 0, pTrigger->
5060: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 zName, 0);. i
5070: 66 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c f( pParse->nMem<
5080: 33 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 3 ){. pPars
5090: 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 e->nMem = 3;.
50a0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 }. }.}../*.**
50b0: 52 65 6d 6f 76 65 20 61 20 74 72 69 67 67 65 72 Remove a trigger
50c0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 from the hash t
50d0: 61 62 6c 65 73 20 6f 66 20 74 68 65 20 73 71 6c ables of the sql
50e0: 69 74 65 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f ite* pointer..*/
50f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c .void sqlite3Unl
5100: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67 inkAndDeleteTrig
5110: 67 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c ger(sqlite3 *db,
5120: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 int iDb, const
5130: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 char *zName){.
5140: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 Trigger *pTrigge
5150: 72 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 r;. Hash *pHash
5160: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c ;.. assert( sql
5170: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 ite3SchemaMutexH
5180: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 eld(db, iDb, 0)
5190: 29 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 28 64 );. pHash = &(d
51a0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 b->aDb[iDb].pSch
51b0: 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 29 3b 0a ema->trigHash);.
51c0: 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c pTrigger = sql
51d0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 ite3HashInsert(p
51e0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c Hash, zName, sql
51f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 ite3Strlen30(zNa
5200: 6d 65 29 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 me), 0);. if( A
5210: 4c 57 41 59 53 28 70 54 72 69 67 67 65 72 29 20 LWAYS(pTrigger)
5220: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 72 69 67 ){. if( pTrig
5230: 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 ger->pSchema==pT
5240: 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63 68 65 rigger->pTabSche
5250: 6d 61 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c ma ){. Tabl
5260: 65 20 2a 70 54 61 62 20 3d 20 74 61 62 6c 65 4f e *pTab = tableO
5270: 66 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65 fTrigger(pTrigge
5280: 72 29 3b 0a 20 20 20 20 20 20 54 72 69 67 67 65 r);. Trigge
5290: 72 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f r **pp;. fo
52a0: 72 28 70 70 3d 26 70 54 61 62 2d 3e 70 54 72 69 r(pp=&pTab->pTri
52b0: 67 67 65 72 3b 20 2a 70 70 21 3d 70 54 72 69 67 gger; *pp!=pTrig
52c0: 67 65 72 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d ger; pp=&((*pp)-
52d0: 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 >pNext));.
52e0: 2a 70 70 20 3d 20 28 2a 70 70 29 2d 3e 70 4e 65 *pp = (*pp)->pNe
52f0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 xt;. }. sq
5300: 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 lite3DeleteTrigg
5310: 65 72 28 64 62 2c 20 70 54 72 69 67 67 65 72 29 er(db, pTrigger)
5320: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 ;. db->flags
5330: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e |= SQLITE_Intern
5340: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a Changes;. }.}..
5350: 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 /*.** pEList is
5360: 74 68 65 20 53 45 54 20 63 6c 61 75 73 65 20 6f the SET clause o
5370: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 f an UPDATE stat
5380: 65 6d 65 6e 74 2e 20 20 45 61 63 68 20 65 6e 74 ement. Each ent
5390: 72 79 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 ry.** in pEList
53a0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 61 74 is of the format
53b0: 20 3c 69 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49 <id>=<expr>. I
53c0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 6e 74 f any of the ent
53d0: 72 69 65 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 ries.** in pELis
53e0: 74 20 68 61 76 65 20 61 6e 20 3c 69 64 3e 20 77 t have an <id> w
53f0: 68 69 63 68 20 6d 61 74 63 68 65 73 20 61 6e 20 hich matches an
5400: 69 64 65 6e 74 69 66 69 65 72 20 69 6e 20 70 49 identifier in pI
5410: 64 4c 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 dList,.** then r
5420: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 eturn TRUE. If
5430: 70 49 64 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74 pIdList==NULL, t
5440: 68 65 6e 20 69 74 20 69 73 20 63 6f 6e 73 69 64 hen it is consid
5450: 65 72 65 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61 ered a.** wildca
5460: 72 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 rd that matches
5470: 61 6e 79 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77 anything. Likew
5480: 69 73 65 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e ise if pEList==N
5490: 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d ULL then.** it m
54a0: 61 74 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20 atches anything
54b0: 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e so always return
54c0: 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 true. Return f
54d0: 61 6c 73 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 alse only.** if
54e0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 there is no matc
54f0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 h..*/.static int
5500: 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 checkColumnOver
5510: 6c 61 70 28 49 64 4c 69 73 74 20 2a 70 49 64 4c lap(IdList *pIdL
5520: 69 73 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 ist, ExprList *p
5530: 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b EList){. int e;
5540: 0a 20 20 69 66 28 20 70 49 64 4c 69 73 74 3d 3d . if( pIdList==
5550: 30 20 7c 7c 20 4e 45 56 45 52 28 70 45 4c 69 73 0 || NEVER(pELis
5560: 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 31 t==0) ) return 1
5570: 3b 0a 20 20 66 6f 72 28 65 3d 30 3b 20 65 3c 70 ;. for(e=0; e<p
5580: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 65 2b EList->nExpr; e+
5590: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 +){. if( sqli
55a0: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 te3IdListIndex(p
55b0: 49 64 4c 69 73 74 2c 20 70 45 4c 69 73 74 2d 3e IdList, pEList->
55c0: 61 5b 65 5d 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 a[e].zName)>=0 )
55d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 return 1;. }.
55e0: 20 72 65 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f return 0; .}../
55f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 *.** Return a li
5600: 73 74 20 6f 66 20 61 6c 6c 20 74 72 69 67 67 65 st of all trigge
5610: 72 73 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 rs on table pTab
5620: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 if there exists
5630: 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 at least.** one
5640: 20 74 72 69 67 67 65 72 20 74 68 61 74 20 6d 75 trigger that mu
5650: 73 74 20 62 65 20 66 69 72 65 64 20 77 68 65 6e st be fired when
5660: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 an operation of
5670: 20 74 79 70 65 20 27 6f 70 27 20 69 73 20 0a 2a type 'op' is .*
5680: 2a 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 * performed on t
5690: 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 2c 20 69 he table, and, i
56a0: 66 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e f that operation
56b0: 20 69 73 20 61 6e 20 55 50 44 41 54 45 2c 20 69 is an UPDATE, i
56c0: 66 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 6f 6e f at.** least on
56d0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 e of the columns
56e0: 20 69 6e 20 70 43 68 61 6e 67 65 73 20 69 73 20 in pChanges is
56f0: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a being modified..
5700: 2a 2f 0a 54 72 69 67 67 65 72 20 2a 73 71 6c 69 */.Trigger *sqli
5710: 74 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74 te3TriggersExist
5720: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 (. Parse *pPars
5730: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 e, /* P
5740: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a arse context */.
5750: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 Table *pTab,
5760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
5770: 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6e 74 61 table the conta
5780: 69 6e 73 20 74 68 65 20 74 72 69 67 67 65 72 73 ins the triggers
5790: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 */. int op,
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
57b0: 20 6f 6e 65 20 6f 66 20 54 4b 5f 44 45 4c 45 54 one of TK_DELET
57c0: 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b E, TK_INSERT, TK
57d0: 5f 55 50 44 41 54 45 20 2a 2f 0a 20 20 45 78 70 _UPDATE */. Exp
57e0: 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c rList *pChanges,
57f0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 /* Columns
5800: 74 68 61 74 20 63 68 61 6e 67 65 20 69 6e 20 61 that change in a
5810: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 n UPDATE stateme
5820: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4d 61 nt */. int *pMa
5830: 73 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 sk
5840: 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 /* OUT: Mask of
5850: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 7c 54 TRIGGER_BEFORE|T
5860: 52 49 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a RIGGER_AFTER */.
5870: 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 ){. int mask =
5880: 30 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4c 0;. Trigger *pL
5890: 69 73 74 20 3d 20 30 3b 0a 20 20 54 72 69 67 67 ist = 0;. Trigg
58a0: 65 72 20 2a 70 3b 0a 0a 20 20 69 66 28 20 28 70 er *p;.. if( (p
58b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 Parse->db->flags
58c0: 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 & SQLITE_Enable
58d0: 54 72 69 67 67 65 72 29 21 3d 30 20 29 7b 0a 20 Trigger)!=0 ){.
58e0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 pList = sqlit
58f0: 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 e3TriggerList(pP
5900: 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d arse, pTab);. }
5910: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 . assert( pList
5920: 3d 3d 30 20 7c 7c 20 49 73 56 69 72 74 75 61 6c ==0 || IsVirtual
5930: 28 70 54 61 62 29 3d 3d 30 20 29 3b 0a 20 20 66 (pTab)==0 );. f
5940: 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 or(p=pList; p; p
5950: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 =p->pNext){.
5960: 69 66 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 if( p->op==op &&
5970: 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 checkColumnOver
5980: 6c 61 70 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c lap(p->pColumns,
5990: 20 70 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 pChanges) ){.
59a0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 70 2d 3e 74 mask |= p->t
59b0: 72 5f 74 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a r_tm;. }. }.
59c0: 20 20 69 66 28 20 70 4d 61 73 6b 20 29 7b 0a 20 if( pMask ){.
59d0: 20 20 20 2a 70 4d 61 73 6b 20 3d 20 6d 61 73 6b *pMask = mask
59e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 ;. }. return (
59f0: 6d 61 73 6b 20 3f 20 70 4c 69 73 74 20 3a 20 30 mask ? pList : 0
5a00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 );.}../*.** Conv
5a10: 65 72 74 20 74 68 65 20 70 53 74 65 70 2d 3e 74 ert the pStep->t
5a20: 61 72 67 65 74 20 74 6f 6b 65 6e 20 69 6e 74 6f arget token into
5a30: 20 61 20 53 72 63 4c 69 73 74 20 61 6e 64 20 72 a SrcList and r
5a40: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a eturn a pointer.
5a50: 2a 2a 20 74 6f 20 74 68 61 74 20 53 72 63 4c 69 ** to that SrcLi
5a60: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 st..**.** This r
5a70: 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 73 70 outine adds a sp
5a80: 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20 ecific database
5a90: 6e 61 6d 65 2c 20 69 66 20 6e 65 65 64 65 64 2c name, if needed,
5aa0: 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 77 to the target w
5ab0: 68 65 6e 0a 2a 2a 20 66 6f 72 6d 69 6e 67 20 74 hen.** forming t
5ac0: 68 65 20 53 72 63 4c 69 73 74 2e 20 20 54 68 69 he SrcList. Thi
5ad0: 73 20 70 72 65 76 65 6e 74 73 20 61 20 74 72 69 s prevents a tri
5ae0: 67 67 65 72 20 69 6e 20 6f 6e 65 20 64 61 74 61 gger in one data
5af0: 62 61 73 65 20 66 72 6f 6d 0a 2a 2a 20 72 65 66 base from.** ref
5b00: 65 72 72 69 6e 67 20 74 6f 20 61 20 74 61 72 67 erring to a targ
5b10: 65 74 20 69 6e 20 61 6e 6f 74 68 65 72 20 64 61 et in another da
5b20: 74 61 62 61 73 65 2e 20 20 41 6e 20 65 78 63 65 tabase. An exce
5b30: 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 74 68 ption is when th
5b40: 65 0a 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20 e.** trigger is
5b50: 69 6e 20 54 45 4d 50 20 69 6e 20 77 68 69 63 68 in TEMP in which
5b60: 20 63 61 73 65 20 69 74 20 63 61 6e 20 72 65 66 case it can ref
5b70: 65 72 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 er to any other
5b80: 64 61 74 61 62 61 73 65 20 69 74 0a 2a 2a 20 77 database it.** w
5b90: 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ants..*/.static
5ba0: 53 72 63 4c 69 73 74 20 2a 74 61 72 67 65 74 53 SrcList *targetS
5bb0: 72 63 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 rcList(. Parse
5bc0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f *pParse, /
5bd0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f * The parsing co
5be0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 ntext */. Trigg
5bf0: 65 72 53 74 65 70 20 2a 70 53 74 65 70 20 20 20 erStep *pStep
5c00: 2f 2a 20 54 68 65 20 74 72 69 67 67 65 72 20 63 /* The trigger c
5c10: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 ontaining the ta
5c20: 72 67 65 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b rget token */.){
5c30: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 . int iDb;
5c40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 /* Index
5c50: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 of the database
5c60: 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 53 72 63 to use */. Src
5c70: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 List *pSrc;
5c80: 20 20 2f 2a 20 53 72 63 4c 69 73 74 20 74 6f 20 /* SrcList to
5c90: 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 0a be returned */..
5ca0: 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 pSrc = sqlite3
5cb0: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 SrcListAppend(pP
5cc0: 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 26 70 53 arse->db, 0, &pS
5cd0: 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 30 29 3b tep->target, 0);
5ce0: 0a 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 . if( pSrc ){.
5cf0: 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d assert( pSrc-
5d00: 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 61 >nSrc>0 );. a
5d10: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 21 3d ssert( pSrc->a!=
5d20: 30 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 0 );. iDb = s
5d30: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e qlite3SchemaToIn
5d40: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 dex(pParse->db,
5d50: 70 53 74 65 70 2d 3e 70 54 72 69 67 2d 3e 70 53 pStep->pTrig->pS
5d60: 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 chema);. if(
5d70: 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 3d 32 iDb==0 || iDb>=2
5d80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
5d90: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 3 *db = pParse->
5da0: 64 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 db;. assert
5db0: 28 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 ( iDb<pParse->db
5dc0: 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 70 ->nDb );. p
5dd0: 53 72 63 2d 3e 61 5b 70 53 72 63 2d 3e 6e 53 72 Src->a[pSrc->nSr
5de0: 63 2d 31 5d 2e 7a 44 61 74 61 62 61 73 65 20 3d c-1].zDatabase =
5df0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 sqlite3DbStrDup
5e00: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 (db, db->aDb[iDb
5e10: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a ].zName);. }.
5e20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 53 72 }. return pSr
5e30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 c;.}../*.** Gene
5e40: 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 rate VDBE code f
5e50: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 or the statement
5e60: 73 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64 s inside the bod
5e70: 79 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 0a 2a y of a single .*
5e80: 2a 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 73 74 * trigger..*/.st
5e90: 61 74 69 63 20 69 6e 74 20 63 6f 64 65 54 72 69 atic int codeTri
5ea0: 67 67 65 72 50 72 6f 67 72 61 6d 28 0a 20 20 50 ggerProgram(. P
5eb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 arse *pParse,
5ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
5ed0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a parser context *
5ee0: 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 /. TriggerStep
5ef0: 2a 70 53 74 65 70 4c 69 73 74 2c 20 20 20 2f 2a *pStepList, /*
5f00: 20 4c 69 73 74 20 6f 66 20 73 74 61 74 65 6d 65 List of stateme
5f10: 6e 74 73 20 69 6e 73 69 64 65 20 74 68 65 20 74 nts inside the t
5f20: 72 69 67 67 65 72 20 62 6f 64 79 20 2a 2f 0a 20 rigger body */.
5f30: 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 int orconf
5f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f /* Co
5f50: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d nflict algorithm
5f60: 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20 65 74 63 . (OE_Abort, etc
5f70: 29 20 2a 2f 20 20 0a 29 7b 0a 20 20 54 72 69 67 ) */ .){. Trig
5f80: 67 65 72 53 74 65 70 20 2a 70 53 74 65 70 3b 0a gerStep *pStep;.
5f90: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 Vdbe *v = pPar
5fa0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c se->pVdbe;. sql
5fb0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 ite3 *db = pPars
5fc0: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 e->db;.. assert
5fd0: 28 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 ( pParse->pTrigg
5fe0: 65 72 54 61 62 20 26 26 20 70 50 61 72 73 65 2d erTab && pParse-
5ff0: 3e 70 54 6f 70 6c 65 76 65 6c 20 29 3b 0a 20 20 >pToplevel );.
6000: 61 73 73 65 72 74 28 20 70 53 74 65 70 4c 69 73 assert( pStepLis
6010: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 t );. assert( v
6020: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 53 74 !=0 );. for(pSt
6030: 65 70 3d 70 53 74 65 70 4c 69 73 74 3b 20 70 53 ep=pStepList; pS
6040: 74 65 70 3b 20 70 53 74 65 70 3d 70 53 74 65 70 tep; pStep=pStep
6050: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a ->pNext){. /*
6060: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 Figure out the
6070: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 ON CONFLICT poli
6080: 63 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 cy that will be
6090: 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 73 74 used for this st
60a0: 65 70 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 ep. ** of the
60b0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d trigger program
60c0: 2e 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 . If the stateme
60d0: 6e 74 20 74 68 61 74 20 63 61 75 73 65 64 20 74 nt that caused t
60e0: 68 69 73 20 74 72 69 67 67 65 72 0a 20 20 20 20 his trigger.
60f0: 2a 2a 20 74 6f 20 66 69 72 65 20 68 61 64 20 61 ** to fire had a
6100: 6e 20 65 78 70 6c 69 63 69 74 20 4f 4e 20 43 4f n explicit ON CO
6110: 4e 46 4c 49 43 54 2c 20 74 68 65 6e 20 75 73 65 NFLICT, then use
6120: 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 it. Otherwise,
6130: 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f use. ** the O
6140: 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 N CONFLICT polic
6150: 79 20 74 68 61 74 20 77 61 73 20 73 70 65 63 69 y that was speci
6160: 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 fied as part of
6170: 74 68 65 20 74 72 69 67 67 65 72 0a 20 20 20 20 the trigger.
6180: 2a 2a 20 73 74 65 70 20 73 74 61 74 65 6d 65 6e ** step statemen
6190: 74 2e 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 t. Example:.
61a0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 **. ** CREA
61b0: 54 45 20 54 52 49 47 47 45 52 20 41 46 54 45 52 TE TRIGGER AFTER
61c0: 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45 INSERT ON t1 BE
61d0: 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 GIN;. **
61e0: 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 INSERT OR REPLAC
61f0: 45 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 E INTO t2 VALUES
6200: 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a (new.a, new.b);.
6210: 20 20 20 20 2a 2a 20 20 20 45 4e 44 3b 0a 20 20 ** END;.
6220: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 49 4e **. ** IN
6230: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 2e 2e 2e SERT INTO t1 ...
6240: 20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d ; --
6250: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 32 20 insert into t2
6260: 75 73 65 73 20 52 45 50 4c 41 43 45 20 70 6f 6c uses REPLACE pol
6270: 69 63 79 0a 20 20 20 20 2a 2a 20 20 20 49 4e 53 icy. ** INS
6280: 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e ERT OR IGNORE IN
6290: 54 4f 20 74 31 20 2e 2e 2e 20 3b 20 20 2d 2d 20 TO t1 ... ; --
62a0: 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 32 20 75 insert into t2 u
62b0: 73 65 73 20 49 47 4e 4f 52 45 20 70 6f 6c 69 63 ses IGNORE polic
62c0: 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 y. */. pPa
62d0: 72 73 65 2d 3e 65 4f 72 63 6f 6e 66 20 3d 20 28 rse->eOrconf = (
62e0: 6f 72 63 6f 6e 66 3d 3d 4f 45 5f 44 65 66 61 75 orconf==OE_Defau
62f0: 6c 74 29 3f 70 53 74 65 70 2d 3e 6f 72 63 6f 6e lt)?pStep->orcon
6300: 66 3a 28 75 38 29 6f 72 63 6f 6e 66 3b 0a 0a 20 f:(u8)orconf;..
6310: 20 20 20 73 77 69 74 63 68 28 20 70 53 74 65 70 switch( pStep
6320: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61 ->op ){. ca
6330: 73 65 20 54 4b 5f 55 50 44 41 54 45 3a 20 7b 0a se TK_UPDATE: {.
6340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 sqlite3U
6350: 70 64 61 74 65 28 70 50 61 72 73 65 2c 20 0a 20 pdate(pParse, .
6360: 20 20 20 20 20 20 20 20 20 74 61 72 67 65 74 53 targetS
6370: 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 rcList(pParse, p
6380: 53 74 65 70 29 2c 0a 20 20 20 20 20 20 20 20 20 Step),.
6390: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 sqlite3ExprList
63a0: 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 Dup(db, pStep->p
63b0: 45 78 70 72 4c 69 73 74 2c 20 30 29 2c 20 0a 20 ExprList, 0), .
63c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
63d0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 65 ExprDup(db, pSte
63e0: 70 2d 3e 70 57 68 65 72 65 2c 20 30 29 2c 20 0a p->pWhere, 0), .
63f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 pParse
6400: 2d 3e 65 4f 72 63 6f 6e 66 0a 20 20 20 20 20 20 ->eOrconf.
6410: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 );. bre
6420: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
6430: 20 20 63 61 73 65 20 54 4b 5f 49 4e 53 45 52 54 case TK_INSERT
6440: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 : {. sqli
6450: 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65 te3Insert(pParse
6460: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 74 61 72 , . tar
6470: 67 65 74 53 72 63 4c 69 73 74 28 70 50 61 72 73 getSrcList(pPars
6480: 65 2c 20 70 53 74 65 70 29 2c 0a 20 20 20 20 20 e, pStep),.
6490: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 sqlite3Expr
64a0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 74 65 ListDup(db, pSte
64b0: 70 2d 3e 70 45 78 70 72 4c 69 73 74 2c 20 30 29 p->pExprList, 0)
64c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c , . sql
64d0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 ite3SelectDup(db
64e0: 2c 20 70 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 , pStep->pSelect
64f0: 2c 20 30 29 2c 20 0a 20 20 20 20 20 20 20 20 20 , 0), .
6500: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 sqlite3IdListDu
6510: 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 49 64 p(db, pStep->pId
6520: 4c 69 73 74 29 2c 20 0a 20 20 20 20 20 20 20 20 List), .
6530: 20 20 70 50 61 72 73 65 2d 3e 65 4f 72 63 6f 6e pParse->eOrcon
6540: 66 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 f. );.
6550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
6560: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 }. case T
6570: 4b 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20 K_DELETE: {.
6580: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 sqlite3Delet
6590: 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 0a 20 eFrom(pParse, .
65a0: 20 20 20 20 20 20 20 20 20 74 61 72 67 65 74 53 targetS
65b0: 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 rcList(pParse, p
65c0: 53 74 65 70 29 2c 0a 20 20 20 20 20 20 20 20 20 Step),.
65d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 sqlite3ExprDup(
65e0: 64 62 2c 20 70 53 74 65 70 2d 3e 70 57 68 65 72 db, pStep->pWher
65f0: 65 2c 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b e, 0). );
6600: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
6610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 }. de
6620: 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 fault: assert( p
6630: 53 74 65 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c Step->op==TK_SEL
6640: 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 ECT ); {.
6650: 20 53 65 6c 65 63 74 44 65 73 74 20 73 44 65 73 SelectDest sDes
6660: 74 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 t;. Selec
6670: 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 73 71 6c t *pSelect = sql
6680: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 ite3SelectDup(db
6690: 2c 20 70 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 , pStep->pSelect
66a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 , 0);. sq
66b0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 lite3SelectDestI
66c0: 6e 69 74 28 26 73 44 65 73 74 2c 20 53 52 54 5f nit(&sDest, SRT_
66d0: 44 69 73 63 61 72 64 2c 20 30 29 3b 0a 20 20 20 Discard, 0);.
66e0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 sqlite3Sele
66f0: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 ct(pParse, pSele
6700: 63 74 2c 20 26 73 44 65 73 74 29 3b 0a 20 20 20 ct, &sDest);.
6710: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 sqlite3Sele
6720: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 ctDelete(db, pSe
6730: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62 lect);. b
6740: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
6750: 20 20 7d 20 0a 20 20 20 20 69 66 28 20 70 53 74 } . if( pSt
6760: 65 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 ep->op!=TK_SELEC
6770: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 T ){. sqlit
6780: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 e3VdbeAddOp0(v,
6790: 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 29 3b 0a OP_ResetCount);.
67a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 }. }.. ret
67b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 urn 0;.}..#ifdef
67c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a SQLITE_DEBUG./*
67d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
67e0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 n is used to add
67f0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 29 20 61 VdbeComment() a
6800: 6e 6e 6f 74 61 74 69 6f 6e 73 20 74 6f 20 61 20 nnotations to a
6810: 56 44 42 45 0a 2a 2a 20 70 72 6f 67 72 61 6d 2e VDBE.** program.
6820: 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 It is not used
6830: 69 6e 20 70 72 6f 64 75 63 74 69 6f 6e 20 63 6f in production co
6840: 64 65 2c 20 6f 6e 6c 79 20 66 6f 72 20 64 65 62 de, only for deb
6850: 75 67 67 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 ugging..*/.stati
6860: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 6e c const char *on
6870: 45 72 72 6f 72 54 65 78 74 28 69 6e 74 20 6f 6e ErrorText(int on
6880: 45 72 72 6f 72 29 7b 0a 20 20 73 77 69 74 63 68 Error){. switch
6890: 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 ( onError ){.
68a0: 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 case OE_Abort:
68b0: 20 20 20 72 65 74 75 72 6e 20 22 61 62 6f 72 74 return "abort
68c0: 22 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52 ";. case OE_R
68d0: 6f 6c 6c 62 61 63 6b 3a 20 72 65 74 75 72 6e 20 ollback: return
68e0: 22 72 6f 6c 6c 62 61 63 6b 22 3b 0a 20 20 20 20 "rollback";.
68f0: 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20 case OE_Fail:
6900: 20 20 72 65 74 75 72 6e 20 22 66 61 69 6c 22 3b return "fail";
6910: 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52 65 70 . case OE_Rep
6920: 6c 61 63 65 3a 20 20 72 65 74 75 72 6e 20 22 72 lace: return "r
6930: 65 70 6c 61 63 65 22 3b 0a 20 20 20 20 63 61 73 eplace";. cas
6940: 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 72 e OE_Ignore: r
6950: 65 74 75 72 6e 20 22 69 67 6e 6f 72 65 22 3b 0a eturn "ignore";.
6960: 20 20 20 20 63 61 73 65 20 4f 45 5f 44 65 66 61 case OE_Defa
6970: 75 6c 74 3a 20 20 72 65 74 75 72 6e 20 22 64 65 ult: return "de
6980: 66 61 75 6c 74 22 3b 0a 20 20 7d 0a 20 20 72 65 fault";. }. re
6990: 74 75 72 6e 20 22 6e 2f 61 22 3b 0a 7d 0a 23 65 turn "n/a";.}.#e
69a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 ndif../*.** Pars
69b0: 65 20 63 6f 6e 74 65 78 74 20 73 74 72 75 63 74 e context struct
69c0: 75 72 65 20 70 46 72 6f 6d 20 68 61 73 20 6a 75 ure pFrom has ju
69d0: 73 74 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20 st been used to
69e0: 63 72 65 61 74 65 20 61 20 73 75 62 2d 76 64 62 create a sub-vdb
69f0: 65 0a 2a 2a 20 28 74 72 69 67 67 65 72 20 70 72 e.** (trigger pr
6a00: 6f 67 72 61 6d 29 2e 20 49 66 20 61 6e 20 65 72 ogram). If an er
6a10: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 ror has occurred
6a20: 2c 20 74 72 61 6e 73 66 65 72 20 65 72 72 6f 72 , transfer error
6a30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 information.**
6a40: 66 72 6f 6d 20 70 46 72 6f 6d 20 74 6f 20 70 54 from pFrom to pT
6a50: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 o..*/.static voi
6a60: 64 20 74 72 61 6e 73 66 65 72 50 61 72 73 65 45 d transferParseE
6a70: 72 72 6f 72 28 50 61 72 73 65 20 2a 70 54 6f 2c rror(Parse *pTo,
6a80: 20 50 61 72 73 65 20 2a 70 46 72 6f 6d 29 7b 0a Parse *pFrom){.
6a90: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d assert( pFrom-
6aa0: 3e 7a 45 72 72 4d 73 67 3d 3d 30 20 7c 7c 20 70 >zErrMsg==0 || p
6ab0: 46 72 6f 6d 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 From->nErr );.
6ac0: 61 73 73 65 72 74 28 20 70 54 6f 2d 3e 7a 45 72 assert( pTo->zEr
6ad0: 72 4d 73 67 3d 3d 30 20 7c 7c 20 70 54 6f 2d 3e rMsg==0 || pTo->
6ae0: 6e 45 72 72 20 29 3b 0a 20 20 69 66 28 20 70 54 nErr );. if( pT
6af0: 6f 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 o->nErr==0 ){.
6b00: 20 20 70 54 6f 2d 3e 7a 45 72 72 4d 73 67 20 3d pTo->zErrMsg =
6b10: 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67 3b pFrom->zErrMsg;
6b20: 0a 20 20 20 20 70 54 6f 2d 3e 6e 45 72 72 20 3d . pTo->nErr =
6b30: 20 70 46 72 6f 6d 2d 3e 6e 45 72 72 3b 0a 20 20 pFrom->nErr;.
6b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 }else{. sqlit
6b50: 65 33 44 62 46 72 65 65 28 70 46 72 6f 6d 2d 3e e3DbFree(pFrom->
6b60: 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d db, pFrom->zErrM
6b70: 73 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a sg);. }.}../*.*
6b80: 2a 20 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70 * Create and pop
6b90: 75 6c 61 74 65 20 61 20 6e 65 77 20 54 72 69 67 ulate a new Trig
6ba0: 67 65 72 50 72 67 20 6f 62 6a 65 63 74 20 77 69 gerPrg object wi
6bb0: 74 68 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d th a sub-program
6bc0: 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e .** implementin
6bd0: 67 20 74 72 69 67 67 65 72 20 70 54 72 69 67 67 g trigger pTrigg
6be0: 65 72 20 77 69 74 68 20 4f 4e 20 43 4f 4e 46 4c er with ON CONFL
6bf0: 49 43 54 20 70 6f 6c 69 63 79 20 6f 72 63 6f 6e ICT policy orcon
6c00: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 f..*/.static Tri
6c10: 67 67 65 72 50 72 67 20 2a 63 6f 64 65 52 6f 77 ggerPrg *codeRow
6c20: 54 72 69 67 67 65 72 28 0a 20 20 50 61 72 73 65 Trigger(. Parse
6c30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 *pParse,
6c40: 2f 2a 20 43 75 72 72 65 6e 74 20 70 61 72 73 65 /* Current parse
6c50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 context */. Tr
6c60: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c igger *pTrigger,
6c70: 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 74 6f /* Trigger to
6c80: 20 63 6f 64 65 20 2a 2f 0a 20 20 54 61 62 6c 65 code */. Table
6c90: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 *pTab,
6ca0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 54 72 /* The table pTr
6cb0: 69 67 67 65 72 20 69 73 20 61 74 74 61 63 68 65 igger is attache
6cc0: 64 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 d to */. int or
6cd0: 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f conf /
6ce0: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f * ON CONFLICT po
6cf0: 6c 69 63 79 20 74 6f 20 63 6f 64 65 20 74 72 69 licy to code tri
6d00: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 77 69 74 gger program wit
6d10: 68 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 h */.){. Parse
6d20: 2a 70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 50 *pTop = sqlite3P
6d30: 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 arseToplevel(pPa
6d40: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 rse);. sqlite3
6d50: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 *db = pParse->db
6d60: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 ; /* Database
6d70: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 72 69 67 handle */. Trig
6d80: 67 65 72 50 72 67 20 2a 70 50 72 67 3b 20 20 20 gerPrg *pPrg;
6d90: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 /* Value
6da0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 to return */.
6db0: 45 78 70 72 20 2a 70 57 68 65 6e 20 3d 20 30 3b Expr *pWhen = 0;
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 /* D
6dd0: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 72 69 67 uplicate of trig
6de0: 67 65 72 20 57 48 45 4e 20 65 78 70 72 65 73 73 ger WHEN express
6df0: 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 ion */. Vdbe *v
6e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
6e10: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 /* Temporar
6e20: 79 20 56 4d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f y VM */. NameCo
6e30: 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 ntext sNC;
6e40: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f /* Name co
6e50: 6e 74 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64 ntext for sub-vd
6e60: 62 65 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 be */. SubProgr
6e70: 61 6d 20 2a 70 50 72 6f 67 72 61 6d 20 3d 20 30 am *pProgram = 0
6e80: 3b 20 20 20 2f 2a 20 53 75 62 2d 76 64 62 65 20 ; /* Sub-vdbe
6e90: 66 6f 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 for trigger prog
6ea0: 72 61 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a ram */. Parse *
6eb0: 70 53 75 62 50 61 72 73 65 3b 20 20 20 20 20 20 pSubParse;
6ec0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f /* Parse co
6ed0: 6e 74 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64 ntext for sub-vd
6ee0: 62 65 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 be */. int iEnd
6ef0: 54 72 69 67 67 65 72 20 3d 20 30 3b 20 20 20 20 Trigger = 0;
6f00: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 /* Label to
6f10: 6a 75 6d 70 20 74 6f 20 69 66 20 57 48 45 4e 20 jump to if WHEN
6f20: 69 73 20 66 61 6c 73 65 20 2a 2f 0a 0a 20 20 61 is false */.. a
6f30: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d ssert( pTrigger-
6f40: 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 54 61 >zName==0 || pTa
6f50: 62 3d 3d 74 61 62 6c 65 4f 66 54 72 69 67 67 65 b==tableOfTrigge
6f60: 72 28 70 54 72 69 67 67 65 72 29 20 29 3b 0a 20 r(pTrigger) );.
6f70: 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 70 assert( pTop->p
6f80: 56 64 62 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c Vdbe );.. /* Al
6f90: 6c 6f 63 61 74 65 20 74 68 65 20 54 72 69 67 67 locate the Trigg
6fa0: 65 72 50 72 67 20 61 6e 64 20 53 75 62 50 72 6f erPrg and SubPro
6fb0: 67 72 61 6d 20 6f 62 6a 65 63 74 73 2e 20 54 6f gram objects. To
6fc0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 ensure that the
6fd0: 79 0a 20 20 2a 2a 20 61 72 65 20 66 72 65 65 64 y. ** are freed
6fe0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 if an error occ
6ff0: 75 72 73 2c 20 6c 69 6e 6b 20 74 68 65 6d 20 69 urs, link them i
7000: 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 54 nto the Parse.pT
7010: 72 69 67 67 65 72 50 72 67 20 0a 20 20 2a 2a 20 riggerPrg . **
7020: 6c 69 73 74 20 6f 66 20 74 68 65 20 74 6f 70 2d list of the top-
7030: 6c 65 76 65 6c 20 50 61 72 73 65 20 6f 62 6a 65 level Parse obje
7040: 63 74 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 ct sooner rather
7050: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 20 2a 2f than later. */
7060: 0a 20 20 70 50 72 67 20 3d 20 73 71 6c 69 74 65 . pPrg = sqlite
7070: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 3DbMallocZero(db
7080: 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 , sizeof(Trigger
7090: 50 72 67 29 29 3b 0a 20 20 69 66 28 20 21 70 50 Prg));. if( !pP
70a0: 72 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 rg ) return 0;.
70b0: 20 70 50 72 67 2d 3e 70 4e 65 78 74 20 3d 20 70 pPrg->pNext = p
70c0: 54 6f 70 2d 3e 70 54 72 69 67 67 65 72 50 72 67 Top->pTriggerPrg
70d0: 3b 0a 20 20 70 54 6f 70 2d 3e 70 54 72 69 67 67 ;. pTop->pTrigg
70e0: 65 72 50 72 67 20 3d 20 70 50 72 67 3b 0a 20 20 erPrg = pPrg;.
70f0: 70 50 72 67 2d 3e 70 50 72 6f 67 72 61 6d 20 3d pPrg->pProgram =
7100: 20 70 50 72 6f 67 72 61 6d 20 3d 20 73 71 6c 69 pProgram = sqli
7110: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 te3DbMallocZero(
7120: 64 62 2c 20 73 69 7a 65 6f 66 28 53 75 62 50 72 db, sizeof(SubPr
7130: 6f 67 72 61 6d 29 29 3b 0a 20 20 69 66 28 20 21 ogram));. if( !
7140: 70 50 72 6f 67 72 61 6d 20 29 20 72 65 74 75 72 pProgram ) retur
7150: 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 n 0;. sqlite3Vd
7160: 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d beLinkSubProgram
7170: 28 70 54 6f 70 2d 3e 70 56 64 62 65 2c 20 70 50 (pTop->pVdbe, pP
7180: 72 6f 67 72 61 6d 29 3b 0a 20 20 70 50 72 67 2d rogram);. pPrg-
7190: 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 >pTrigger = pTri
71a0: 67 67 65 72 3b 0a 20 20 70 50 72 67 2d 3e 6f 72 gger;. pPrg->or
71b0: 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 conf = orconf;.
71c0: 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b pPrg->aColmask[
71d0: 30 5d 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0] = 0xffffffff;
71e0: 0a 20 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 . pPrg->aColmas
71f0: 6b 5b 31 5d 20 3d 20 30 78 66 66 66 66 66 66 66 k[1] = 0xfffffff
7200: 66 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 f;.. /* Allocat
7210: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 e and populate a
7220: 20 6e 65 77 20 50 61 72 73 65 20 63 6f 6e 74 65 new Parse conte
7230: 78 74 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f xt to use for co
7240: 64 69 6e 67 20 74 68 65 20 0a 20 20 2a 2a 20 74 ding the . ** t
7250: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 rigger sub-progr
7260: 61 6d 2e 20 20 2a 2f 0a 20 20 70 53 75 62 50 61 am. */. pSubPa
7270: 72 73 65 20 3d 20 73 71 6c 69 74 65 33 53 74 61 rse = sqlite3Sta
7280: 63 6b 41 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 ckAllocZero(db,
7290: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 29 3b 0a sizeof(Parse));.
72a0: 20 20 69 66 28 20 21 70 53 75 62 50 61 72 73 65 if( !pSubParse
72b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d ) return 0;. m
72c0: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 emset(&sNC, 0, s
72d0: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 izeof(sNC));. s
72e0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 53 75 62 NC.pParse = pSub
72f0: 50 61 72 73 65 3b 0a 20 20 70 53 75 62 50 61 72 Parse;. pSubPar
7300: 73 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 se->db = db;. p
7310: 53 75 62 50 61 72 73 65 2d 3e 70 54 72 69 67 67 SubParse->pTrigg
7320: 65 72 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 erTab = pTab;.
7330: 70 53 75 62 50 61 72 73 65 2d 3e 70 54 6f 70 6c pSubParse->pTopl
7340: 65 76 65 6c 20 3d 20 70 54 6f 70 3b 0a 20 20 70 evel = pTop;. p
7350: 53 75 62 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 SubParse->zAuthC
7360: 6f 6e 74 65 78 74 20 3d 20 70 54 72 69 67 67 65 ontext = pTrigge
7370: 72 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 70 53 75 62 r->zName;. pSub
7380: 50 61 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f Parse->eTriggerO
7390: 70 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 p = pTrigger->op
73a0: 3b 0a 20 20 70 53 75 62 50 61 72 73 65 2d 3e 6e ;. pSubParse->n
73b0: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 QueryLoop = pPar
73c0: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a se->nQueryLoop;.
73d0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 . v = sqlite3Ge
73e0: 74 56 64 62 65 28 70 53 75 62 50 61 72 73 65 29 tVdbe(pSubParse)
73f0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 ;. if( v ){.
7400: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c VdbeComment((v,
7410: 20 22 53 74 61 72 74 3a 20 25 73 2e 25 73 20 28 "Start: %s.%s (
7420: 25 73 20 25 73 25 73 25 73 20 4f 4e 20 25 73 29 %s %s%s%s ON %s)
7430: 22 2c 20 0a 20 20 20 20 20 20 70 54 72 69 67 67 ", . pTrigg
7440: 65 72 2d 3e 7a 4e 61 6d 65 2c 20 6f 6e 45 72 72 er->zName, onErr
7450: 6f 72 54 65 78 74 28 6f 72 63 6f 6e 66 29 2c 0a orText(orconf),.
7460: 20 20 20 20 20 20 28 70 54 72 69 67 67 65 72 2d (pTrigger-
7470: 3e 74 72 5f 74 6d 3d 3d 54 52 49 47 47 45 52 5f >tr_tm==TRIGGER_
7480: 42 45 46 4f 52 45 20 3f 20 22 42 45 46 4f 52 45 BEFORE ? "BEFORE
7490: 22 20 3a 20 22 41 46 54 45 52 22 29 2c 0a 20 20 " : "AFTER"),.
74a0: 20 20 20 20 20 20 28 70 54 72 69 67 67 65 72 2d (pTrigger-
74b0: 3e 6f 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 3f >op==TK_UPDATE ?
74c0: 20 22 55 50 44 41 54 45 22 20 3a 20 22 22 29 2c "UPDATE" : ""),
74d0: 0a 20 20 20 20 20 20 20 20 28 70 54 72 69 67 67 . (pTrigg
74e0: 65 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 er->op==TK_INSER
74f0: 54 20 3f 20 22 49 4e 53 45 52 54 22 20 3a 20 22 T ? "INSERT" : "
7500: 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 54 72 "),. (pTr
7510: 69 67 67 65 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 45 igger->op==TK_DE
7520: 4c 45 54 45 20 3f 20 22 44 45 4c 45 54 45 22 20 LETE ? "DELETE"
7530: 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 70 54 61 : ""),. pTa
7540: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b b->zName. ));
7550: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
7560: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 73 OMIT_TRACE. s
7570: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 qlite3VdbeChange
7580: 50 34 28 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 P4(v, -1, .
7590: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 sqlite3MPrintf(
75a0: 64 62 2c 20 22 2d 2d 20 54 52 49 47 47 45 52 20 db, "-- TRIGGER
75b0: 25 73 22 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a %s", pTrigger->z
75c0: 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 Name), P4_DYNAMI
75d0: 43 0a 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a C. );.#endif.
75e0: 0a 20 20 20 20 2f 2a 20 49 66 20 6f 6e 65 20 77 . /* If one w
75f0: 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f as specified, co
7600: 64 65 20 74 68 65 20 57 48 45 4e 20 63 6c 61 75 de the WHEN clau
7610: 73 65 2e 20 49 66 20 69 74 20 65 76 61 6c 75 61 se. If it evalua
7620: 74 65 73 20 74 6f 20 66 61 6c 73 65 0a 20 20 20 tes to false.
7630: 20 2a 2a 20 28 6f 72 20 4e 55 4c 4c 29 20 74 68 ** (or NULL) th
7640: 65 20 73 75 62 2d 76 64 62 65 20 69 73 20 69 6d e sub-vdbe is im
7650: 6d 65 64 69 61 74 65 6c 79 20 68 61 6c 74 65 64 mediately halted
7660: 20 62 79 20 6a 75 6d 70 69 6e 67 20 74 6f 20 74 by jumping to t
7670: 68 65 20 0a 20 20 20 20 2a 2a 20 4f 50 5f 48 61 he . ** OP_Ha
7680: 6c 74 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 lt inserted at t
7690: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 he end of the pr
76a0: 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 ogram. */. i
76b0: 66 28 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 f( pTrigger->pWh
76c0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 en ){. pWhe
76d0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 n = sqlite3ExprD
76e0: 75 70 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d up(db, pTrigger-
76f0: 3e 70 57 68 65 6e 2c 20 30 29 3b 0a 20 20 20 20 >pWhen, 0);.
7700: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d if( SQLITE_OK=
7710: 3d 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 =sqlite3ResolveE
7720: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 xprNames(&sNC, p
7730: 57 68 65 6e 29 20 0a 20 20 20 20 20 20 20 26 26 When) . &&
7740: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 db->mallocFaile
7750: 64 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 d==0 . ){.
7760: 20 20 20 20 20 20 20 69 45 6e 64 54 72 69 67 67 iEndTrigg
7770: 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 er = sqlite3Vdbe
7780: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 MakeLabel(v);.
7790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 sqlite3Exp
77a0: 72 49 66 46 61 6c 73 65 28 70 53 75 62 50 61 72 rIfFalse(pSubPar
77b0: 73 65 2c 20 70 57 68 65 6e 2c 20 69 45 6e 64 54 se, pWhen, iEndT
77c0: 72 69 67 67 65 72 2c 20 53 51 4c 49 54 45 5f 4a rigger, SQLITE_J
77d0: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 UMPIFNULL);.
77e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 }. sqlite
77f0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 3ExprDelete(db,
7800: 70 57 68 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 pWhen);. }..
7810: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 74 /* Code the t
7820: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 69 rigger program i
7830: 6e 74 6f 20 74 68 65 20 73 75 62 2d 76 64 62 65 nto the sub-vdbe
7840: 2e 20 2a 2f 0a 20 20 20 20 63 6f 64 65 54 72 69 . */. codeTri
7850: 67 67 65 72 50 72 6f 67 72 61 6d 28 70 53 75 62 ggerProgram(pSub
7860: 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 2d Parse, pTrigger-
7870: 3e 73 74 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f >step_list, orco
7880: 6e 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 nf);.. /* Ins
7890: 65 72 74 20 61 6e 20 4f 50 5f 48 61 6c 74 20 61 ert an OP_Halt a
78a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 t the end of the
78b0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 2a 2f sub-program. */
78c0: 0a 20 20 20 20 69 66 28 20 69 45 6e 64 54 72 69 . if( iEndTri
78d0: 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 gger ){. sq
78e0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 lite3VdbeResolve
78f0: 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 54 72 69 Label(v, iEndTri
7900: 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 gger);. }.
7910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
7920: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a p0(v, OP_Halt);.
7930: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 VdbeComment(
7940: 28 76 2c 20 22 45 6e 64 3a 20 25 73 2e 25 73 22 (v, "End: %s.%s"
7950: 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d , pTrigger->zNam
7960: 65 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f e, onErrorText(o
7970: 72 63 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 74 rconf)));.. t
7980: 72 61 6e 73 66 65 72 50 61 72 73 65 45 72 72 6f ransferParseErro
7990: 72 28 70 50 61 72 73 65 2c 20 70 53 75 62 50 61 r(pParse, pSubPa
79a0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 rse);. if( db
79b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d ->mallocFailed==
79c0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 72 6f 67 0 ){. pProg
79d0: 72 61 6d 2d 3e 61 4f 70 20 3d 20 73 71 6c 69 74 ram->aOp = sqlit
79e0: 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 e3VdbeTakeOpArra
79f0: 79 28 76 2c 20 26 70 50 72 6f 67 72 61 6d 2d 3e y(v, &pProgram->
7a00: 6e 4f 70 2c 20 26 70 54 6f 70 2d 3e 6e 4d 61 78 nOp, &pTop->nMax
7a10: 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 Arg);. }.
7a20: 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 3d pProgram->nMem =
7a30: 20 70 53 75 62 50 61 72 73 65 2d 3e 6e 4d 65 6d pSubParse->nMem
7a40: 3b 0a 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e ;. pProgram->
7a50: 6e 43 73 72 20 3d 20 70 53 75 62 50 61 72 73 65 nCsr = pSubParse
7a60: 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 70 50 72 6f ->nTab;. pPro
7a70: 67 72 61 6d 2d 3e 6e 4f 6e 63 65 20 3d 20 70 53 gram->nOnce = pS
7a80: 75 62 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a ubParse->nOnce;.
7a90: 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f pProgram->to
7aa0: 6b 65 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 54 ken = (void *)pT
7ab0: 72 69 67 67 65 72 3b 0a 20 20 20 20 70 50 72 67 rigger;. pPrg
7ac0: 2d 3e 61 43 6f 6c 6d 61 73 6b 5b 30 5d 20 3d 20 ->aColmask[0] =
7ad0: 70 53 75 62 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 pSubParse->oldma
7ae0: 73 6b 3b 0a 20 20 20 20 70 50 72 67 2d 3e 61 43 sk;. pPrg->aC
7af0: 6f 6c 6d 61 73 6b 5b 31 5d 20 3d 20 70 53 75 62 olmask[1] = pSub
7b00: 50 61 72 73 65 2d 3e 6e 65 77 6d 61 73 6b 3b 0a Parse->newmask;.
7b10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 sqlite3VdbeD
7b20: 65 6c 65 74 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 elete(v);. }..
7b30: 20 61 73 73 65 72 74 28 20 21 70 53 75 62 50 61 assert( !pSubPa
7b40: 72 73 65 2d 3e 70 41 69 6e 63 20 20 20 20 20 20 rse->pAinc
7b50: 20 26 26 20 21 70 53 75 62 50 61 72 73 65 2d 3e && !pSubParse->
7b60: 70 5a 6f 6d 62 69 65 54 61 62 20 29 3b 0a 20 20 pZombieTab );.
7b70: 61 73 73 65 72 74 28 20 21 70 53 75 62 50 61 72 assert( !pSubPar
7b80: 73 65 2d 3e 70 54 72 69 67 67 65 72 50 72 67 20 se->pTriggerPrg
7b90: 26 26 20 21 70 53 75 62 50 61 72 73 65 2d 3e 6e && !pSubParse->n
7ba0: 4d 61 78 41 72 67 20 29 3b 0a 20 20 73 71 6c 69 MaxArg );. sqli
7bb0: 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c te3StackFree(db,
7bc0: 20 70 53 75 62 50 61 72 73 65 29 3b 0a 0a 20 20 pSubParse);..
7bd0: 72 65 74 75 72 6e 20 70 50 72 67 3b 0a 7d 0a 20 return pPrg;.}.
7be0: 20 20 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e ./*.** Return
7bf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 a pointer to a
7c00: 54 72 69 67 67 65 72 50 72 67 20 6f 62 6a 65 63 TriggerPrg objec
7c10: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 t containing the
7c20: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 66 6f 72 sub-program for
7c30: 0a 2a 2a 20 74 72 69 67 67 65 72 20 70 54 72 69 .** trigger pTri
7c40: 67 67 65 72 20 77 69 74 68 20 64 65 66 61 75 6c gger with defaul
7c50: 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c t ON CONFLICT al
7c60: 67 6f 72 69 74 68 6d 20 6f 72 63 6f 6e 66 2e 20 gorithm orconf.
7c70: 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 54 72 If no such.** Tr
7c80: 69 67 67 65 72 50 72 67 20 6f 62 6a 65 63 74 20 iggerPrg object
7c90: 65 78 69 73 74 73 2c 20 61 20 6e 65 77 20 6f 62 exists, a new ob
7ca0: 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 ject is allocate
7cb0: 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 d and populated
7cc0: 62 65 66 6f 72 65 0a 2a 2a 20 62 65 69 6e 67 20 before.** being
7cd0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 returned..*/.sta
7ce0: 74 69 63 20 54 72 69 67 67 65 72 50 72 67 20 2a tic TriggerPrg *
7cf0: 67 65 74 52 6f 77 54 72 69 67 67 65 72 28 0a 20 getRowTrigger(.
7d00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 Parse *pParse,
7d10: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 /* Current
7d20: 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a parse context *
7d30: 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 /. Trigger *pTr
7d40: 69 67 67 65 72 2c 20 20 20 2f 2a 20 54 72 69 67 igger, /* Trig
7d50: 67 65 72 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 ger to code */.
7d60: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 Table *pTab,
7d70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 /* The tab
7d80: 6c 65 20 74 72 69 67 67 65 72 20 70 54 72 69 67 le trigger pTrig
7d90: 67 65 72 20 69 73 20 61 74 74 61 63 68 65 64 20 ger is attached
7da0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f to */. int orco
7db0: 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 nf /*
7dc0: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f ON CONFLICT algo
7dd0: 72 69 74 68 6d 2e 20 2a 2f 0a 29 7b 0a 20 20 50 rithm. */.){. P
7de0: 61 72 73 65 20 2a 70 52 6f 6f 74 20 3d 20 73 71 arse *pRoot = sq
7df0: 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 lite3ParseToplev
7e00: 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 54 72 el(pParse);. Tr
7e10: 69 67 67 65 72 50 72 67 20 2a 70 50 72 67 3b 0a iggerPrg *pPrg;.
7e20: 0a 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 . assert( pTrig
7e30: 67 65 72 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c ger->zName==0 ||
7e40: 20 70 54 61 62 3d 3d 74 61 62 6c 65 4f 66 54 72 pTab==tableOfTr
7e50: 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29 20 igger(pTrigger)
7e60: 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 6d 61 79 20 );.. /* It may
7e70: 62 65 20 74 68 61 74 20 74 68 69 73 20 74 72 69 be that this tri
7e80: 67 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 gger has already
7e90: 20 62 65 65 6e 20 63 6f 64 65 64 20 28 6f 72 20 been coded (or
7ea0: 69 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 is in the. ** p
7eb0: 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 rocess of being
7ec0: 63 6f 64 65 64 29 2e 20 49 66 20 74 68 69 73 20 coded). If this
7ed0: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 is the case, the
7ee0: 6e 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 0a n an entry with.
7ef0: 20 20 2a 2a 20 61 20 6d 61 74 63 68 69 6e 67 20 ** a matching
7f00: 54 72 69 67 67 65 72 50 72 67 2e 70 54 72 69 67 TriggerPrg.pTrig
7f10: 67 65 72 20 66 69 65 6c 64 20 77 69 6c 6c 20 62 ger field will b
7f20: 65 20 70 72 65 73 65 6e 74 20 73 6f 6d 65 77 68 e present somewh
7f30: 65 72 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 ere. ** in the
7f40: 50 61 72 73 65 2e 70 54 72 69 67 67 65 72 50 72 Parse.pTriggerPr
7f50: 67 20 6c 69 73 74 2e 20 53 65 61 72 63 68 20 66 g list. Search f
7f60: 6f 72 20 73 75 63 68 20 61 6e 20 65 6e 74 72 79 or such an entry
7f70: 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 72 67 . */. for(pPrg
7f80: 3d 70 52 6f 6f 74 2d 3e 70 54 72 69 67 67 65 72 =pRoot->pTrigger
7f90: 50 72 67 3b 20 0a 20 20 20 20 20 20 70 50 72 67 Prg; . pPrg
7fa0: 20 26 26 20 28 70 50 72 67 2d 3e 70 54 72 69 67 && (pPrg->pTrig
7fb0: 67 65 72 21 3d 70 54 72 69 67 67 65 72 20 7c 7c ger!=pTrigger ||
7fc0: 20 70 50 72 67 2d 3e 6f 72 63 6f 6e 66 21 3d 6f pPrg->orconf!=o
7fd0: 72 63 6f 6e 66 29 3b 20 0a 20 20 20 20 20 20 70 rconf); . p
7fe0: 50 72 67 3d 70 50 72 67 2d 3e 70 4e 65 78 74 0a Prg=pPrg->pNext.
7ff0: 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e );.. /* If an
8000: 20 65 78 69 73 74 69 6e 67 20 54 72 69 67 67 65 existing Trigge
8010: 72 50 72 67 20 63 6f 75 6c 64 20 6e 6f 74 20 62 rPrg could not b
8020: 65 20 6c 6f 63 61 74 65 64 2c 20 63 72 65 61 74 e located, creat
8030: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 20 2a 2f 0a e a new one. */.
8040: 20 20 69 66 28 20 21 70 50 72 67 20 29 7b 0a 20 if( !pPrg ){.
8050: 20 20 20 70 50 72 67 20 3d 20 63 6f 64 65 52 6f pPrg = codeRo
8060: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c wTrigger(pParse,
8070: 20 70 54 72 69 67 67 65 72 2c 20 70 54 61 62 2c pTrigger, pTab,
8080: 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 7d 0a 0a 20 orconf);. }..
8090: 20 72 65 74 75 72 6e 20 70 50 72 67 3b 0a 7d 0a return pPrg;.}.
80a0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 ./*.** Generate
80b0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 74 72 69 code for the tri
80c0: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 61 73 73 gger program ass
80d0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 72 69 ociated with tri
80e0: 67 67 65 72 20 70 20 6f 6e 20 0a 2a 2a 20 74 61 gger p on .** ta
80f0: 62 6c 65 20 70 54 61 62 2e 20 54 68 65 20 72 65 ble pTab. The re
8100: 67 2c 20 6f 72 63 6f 6e 66 20 61 6e 64 20 69 67 g, orconf and ig
8110: 6e 6f 72 65 4a 75 6d 70 20 70 61 72 61 6d 65 74 noreJump paramet
8120: 65 72 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 ers passed to th
8130: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 is.** function a
8140: 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 re the same as t
8150: 68 6f 73 65 20 64 65 73 63 72 69 62 65 64 20 69 hose described i
8160: 6e 20 74 68 65 20 68 65 61 64 65 72 20 66 75 6e n the header fun
8170: 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 73 71 6c ction for.** sql
8180: 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 ite3CodeRowTrigg
8190: 65 72 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c er().*/.void sql
81a0: 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 ite3CodeRowTrigg
81b0: 65 72 44 69 72 65 63 74 28 0a 20 20 50 61 72 73 erDirect(. Pars
81c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 e *pParse,
81d0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 /* Parse contex
81e0: 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a t */. Trigger *
81f0: 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 p, /* T
8200: 72 69 67 67 65 72 20 74 6f 20 63 6f 64 65 20 2a rigger to code *
8210: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c /. Table *pTab,
8220: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
8230: 74 61 62 6c 65 20 74 6f 20 63 6f 64 65 20 74 72 table to code tr
8240: 69 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20 iggers from */.
8250: 20 69 6e 74 20 72 65 67 2c 20 20 20 20 20 20 20 int reg,
8260: 20 20 20 20 20 20 2f 2a 20 52 65 67 20 61 72 72 /* Reg arr
8270: 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4f 4c ay containing OL
8280: 44 2e 2a 20 61 6e 64 20 4e 45 57 2e 2a 20 76 61 D.* and NEW.* va
8290: 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 lues */. int or
82a0: 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20 2f conf, /
82b0: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f * ON CONFLICT po
82c0: 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67 licy */. int ig
82d0: 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20 20 20 2f noreJump /
82e0: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f * Instruction to
82f0: 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52 41 49 jump to for RAI
8300: 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 29 7b SE(IGNORE) */.){
8310: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c . Vdbe *v = sql
8320: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 ite3GetVdbe(pPar
8330: 73 65 29 3b 20 2f 2a 20 4d 61 69 6e 20 56 4d 20 se); /* Main VM
8340: 2a 2f 0a 20 20 54 72 69 67 67 65 72 50 72 67 20 */. TriggerPrg
8350: 2a 70 50 72 67 3b 0a 20 20 70 50 72 67 20 3d 20 *pPrg;. pPrg =
8360: 67 65 74 52 6f 77 54 72 69 67 67 65 72 28 70 50 getRowTrigger(pP
8370: 61 72 73 65 2c 20 70 2c 20 70 54 61 62 2c 20 6f arse, p, pTab, o
8380: 72 63 6f 6e 66 29 3b 0a 20 20 61 73 73 65 72 74 rconf);. assert
8390: 28 20 70 50 72 67 20 7c 7c 20 70 50 61 72 73 65 ( pPrg || pParse
83a0: 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 ->nErr || pParse
83b0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c ->db->mallocFail
83c0: 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 ed );.. /* Code
83d0: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 the OP_Program
83e0: 6f 70 63 6f 64 65 20 69 6e 20 74 68 65 20 70 61 opcode in the pa
83f0: 72 65 6e 74 20 56 44 42 45 2e 20 50 34 20 6f 66 rent VDBE. P4 of
8400: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 the OP_Program
8410: 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 . ** is a point
8420: 65 72 20 74 6f 20 74 68 65 20 73 75 62 2d 76 64 er to the sub-vd
8430: 62 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 be containing th
8440: 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 e trigger progra
8450: 6d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 72 m. */. if( pPr
8460: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 52 65 g ){. int bRe
8470: 63 75 72 73 69 76 65 20 3d 20 28 70 2d 3e 7a 4e cursive = (p->zN
8480: 61 6d 65 20 26 26 20 30 3d 3d 28 70 50 61 72 73 ame && 0==(pPars
8490: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c e->db->flags&SQL
84a0: 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 29 ITE_RecTriggers)
84b0: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 );.. sqlite3V
84c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f dbeAddOp3(v, OP_
84d0: 50 72 6f 67 72 61 6d 2c 20 72 65 67 2c 20 69 67 Program, reg, ig
84e0: 6e 6f 72 65 4a 75 6d 70 2c 20 2b 2b 70 50 61 72 noreJump, ++pPar
84f0: 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 73 se->nMem);. s
8500: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 qlite3VdbeChange
8510: 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 P4(v, -1, (const
8520: 20 63 68 61 72 20 2a 29 70 50 72 67 2d 3e 70 50 char *)pPrg->pP
8530: 72 6f 67 72 61 6d 2c 20 50 34 5f 53 55 42 50 52 rogram, P4_SUBPR
8540: 4f 47 52 41 4d 29 3b 0a 20 20 20 20 56 64 62 65 OGRAM);. Vdbe
8550: 43 6f 6d 6d 65 6e 74 28 0a 20 20 20 20 20 20 20 Comment(.
8560: 20 28 76 2c 20 22 43 61 6c 6c 3a 20 25 73 2e 25 (v, "Call: %s.%
8570: 73 22 2c 20 28 70 2d 3e 7a 4e 61 6d 65 3f 70 2d s", (p->zName?p-
8580: 3e 7a 4e 61 6d 65 3a 22 66 6b 65 79 22 29 2c 20 >zName:"fkey"),
8590: 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72 63 6f onErrorText(orco
85a0: 6e 66 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 nf)));.. /* S
85b0: 65 74 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e et the P5 operan
85c0: 64 20 6f 66 20 74 68 65 20 4f 50 5f 50 72 6f 67 d of the OP_Prog
85d0: 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 ram instruction
85e0: 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 20 to non-zero if.
85f0: 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 ** recursive
8600: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 invocation of th
8610: 69 73 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 is trigger progr
8620: 61 6d 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 am is disallowed
8630: 2e 20 52 65 63 75 72 73 69 76 65 0a 20 20 20 20 . Recursive.
8640: 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 69 73 ** invocation is
8650: 20 64 69 73 61 6c 6c 6f 77 65 64 20 69 66 20 28 disallowed if (
8660: 61 29 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 a) the sub-progr
8670: 61 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 74 am is really a t
8680: 72 69 67 67 65 72 2c 0a 20 20 20 20 2a 2a 20 6e rigger,. ** n
8690: 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 ot a foreign key
86a0: 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 28 62 29 action, and (b)
86b0: 20 74 68 65 20 66 6c 61 67 20 74 6f 20 65 6e 61 the flag to ena
86c0: 62 6c 65 20 72 65 63 75 72 73 69 76 65 20 74 72 ble recursive tr
86d0: 69 67 67 65 72 73 0a 20 20 20 20 2a 2a 20 69 73 iggers. ** is
86e0: 20 63 6c 65 61 72 2e 20 20 2a 2f 0a 20 20 20 20 clear. */.
86f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
8700: 65 50 35 28 76 2c 20 28 75 38 29 62 52 65 63 75 eP5(v, (u8)bRecu
8710: 72 73 69 76 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f rsive);. }.}../
8720: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c *.** This is cal
8730: 6c 65 64 20 74 6f 20 63 6f 64 65 20 74 68 65 20 led to code the
8740: 72 65 71 75 69 72 65 64 20 46 4f 52 20 45 41 43 required FOR EAC
8750: 48 20 52 4f 57 20 74 72 69 67 67 65 72 73 20 66 H ROW triggers f
8760: 6f 72 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a or an operation.
8770: 2a 2a 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 ** on table pTab
8780: 2e 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 . The operation
8790: 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 73 to code triggers
87a0: 20 66 6f 72 20 28 49 4e 53 45 52 54 2c 20 55 50 for (INSERT, UP
87b0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 29 0a DATE or DELETE).
87c0: 2a 2a 20 69 73 20 67 69 76 65 6e 20 62 79 20 74 ** is given by t
87d0: 68 65 20 6f 70 20 70 61 72 61 6d 61 74 65 72 2e he op paramater.
87e0: 20 54 68 65 20 74 72 5f 74 6d 20 70 61 72 61 6d The tr_tm param
87f0: 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 eter determines
8800: 77 68 65 74 68 65 72 20 74 68 65 0a 2a 2a 20 42 whether the.** B
8810: 45 46 4f 52 45 20 6f 72 20 41 46 54 45 52 20 74 EFORE or AFTER t
8820: 72 69 67 67 65 72 73 20 61 72 65 20 63 6f 64 65 riggers are code
8830: 64 2e 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 d. If the operat
8840: 69 6f 6e 20 69 73 20 61 6e 20 55 50 44 41 54 45 ion is an UPDATE
8850: 2c 20 74 68 65 6e 0a 2a 2a 20 70 61 72 61 6d 65 , then.** parame
8860: 74 65 72 20 70 43 68 61 6e 67 65 73 20 69 73 20 ter pChanges is
8870: 70 61 73 73 65 64 20 74 68 65 20 6c 69 73 74 20 passed the list
8880: 6f 66 20 63 6f 6c 75 6d 6e 73 20 62 65 69 6e 67 of columns being
8890: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a modified..**.**
88a0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f If there are no
88b0: 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20 66 triggers that f
88c0: 69 72 65 20 61 74 20 74 68 65 20 73 70 65 63 69 ire at the speci
88d0: 66 69 65 64 20 74 69 6d 65 20 66 6f 72 20 74 68 fied time for th
88e0: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 6f e specified.** o
88f0: 70 65 72 61 74 69 6f 6e 20 6f 6e 20 70 54 61 62 peration on pTab
8900: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 , this function
8910: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a is a no-op..**.*
8920: 2a 20 54 68 65 20 72 65 67 20 61 72 67 75 6d 65 * The reg argume
8930: 6e 74 20 69 73 20 74 68 65 20 61 64 64 72 65 73 nt is the addres
8940: 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 69 s of the first i
8950: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 n an array of re
8960: 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 gisters .** that
8970: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 76 61 6c contain the val
8980: 75 65 73 20 73 75 62 73 74 69 74 75 74 65 64 20 ues substituted
8990: 66 6f 72 20 74 68 65 20 6e 65 77 2e 2a 20 61 6e for the new.* an
89a0: 64 20 6f 6c 64 2e 2a 20 72 65 66 65 72 65 6e 63 d old.* referenc
89b0: 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 74 72 69 es.** in the tri
89c0: 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 gger program. If
89d0: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 N is the number
89e0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 of columns in t
89f0: 61 62 6c 65 20 70 54 61 62 0a 2a 2a 20 28 61 20 able pTab.** (a
8a00: 63 6f 70 79 20 6f 66 20 70 54 61 62 2d 3e 6e 43 copy of pTab->nC
8a10: 6f 6c 29 2c 20 74 68 65 6e 20 72 65 67 69 73 74 ol), then regist
8a20: 65 72 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 ers are populate
8a30: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a d as follows:.**
8a40: 0a 2a 2a 20 20 20 52 65 67 69 73 74 65 72 20 20 .** Register
8a50: 20 20 20 20 20 43 6f 6e 74 61 69 6e 73 0a 2a 2a Contains.**
8a60: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d -------------
8a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 72 ---------.** r
8aa0: 65 67 2b 30 20 20 20 20 20 20 20 20 20 20 4f 4c eg+0 OL
8ab0: 44 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72 65 67 D.rowid.** reg
8ac0: 2b 31 20 20 20 20 20 20 20 20 20 20 4f 4c 44 2e +1 OLD.
8ad0: 2a 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 2d * value of left-
8ae0: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 most column of p
8af0: 54 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20 20 Tab.** ...
8b00: 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 ....**
8b10: 20 72 65 67 2b 4e 20 20 20 20 20 20 20 20 20 20 reg+N
8b20: 4f 4c 44 2e 2a 20 76 61 6c 75 65 20 6f 66 20 72 OLD.* value of r
8b30: 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e ight-most column
8b40: 20 6f 66 20 70 54 61 62 0a 2a 2a 20 20 20 72 65 of pTab.** re
8b50: 67 2b 4e 2b 31 20 20 20 20 20 20 20 20 4e 45 57 g+N+1 NEW
8b60: 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72 65 67 2b .rowid.** reg+
8b70: 4e 2b 32 20 20 20 20 20 20 20 20 4f 4c 44 2e 2a N+2 OLD.*
8b80: 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 2d 6d value of left-m
8b90: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 54 ost column of pT
8ba0: 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20 20 20 ab.** ...
8bb0: 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 ....**
8bc0: 72 65 67 2b 4e 2b 4e 2b 31 20 20 20 20 20 20 4e reg+N+N+1 N
8bd0: 45 57 2e 2a 20 76 61 6c 75 65 20 6f 66 20 72 69 EW.* value of ri
8be0: 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 ght-most column
8bf0: 6f 66 20 70 54 61 62 0a 2a 2a 0a 2a 2a 20 46 6f of pTab.**.** Fo
8c00: 72 20 4f 4e 20 44 45 4c 45 54 45 20 74 72 69 67 r ON DELETE trig
8c10: 67 65 72 73 2c 20 74 68 65 20 72 65 67 69 73 74 gers, the regist
8c20: 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 ers containing t
8c30: 68 65 20 4e 45 57 2e 2a 20 76 61 6c 75 65 73 20 he NEW.* values
8c40: 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65 will.** never be
8c50: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 accessed by the
8c60: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d trigger program
8c70: 2c 20 73 6f 20 74 68 65 79 20 61 72 65 20 6e 6f , so they are no
8c80: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 0a t allocated or .
8c90: 2a 2a 20 70 6f 70 75 6c 61 74 65 64 20 62 79 20 ** populated by
8ca0: 74 68 65 20 63 61 6c 6c 65 72 20 28 74 68 65 72 the caller (ther
8cb0: 65 20 69 73 20 6e 6f 20 64 61 74 61 20 74 6f 20 e is no data to
8cc0: 70 6f 70 75 6c 61 74 65 20 74 68 65 6d 20 77 69 populate them wi
8cd0: 74 68 20 61 6e 79 77 61 79 29 2e 20 0a 2a 2a 20 th anyway). .**
8ce0: 53 69 6d 69 6c 61 72 6c 79 2c 20 66 6f 72 20 4f Similarly, for O
8cf0: 4e 20 49 4e 53 45 52 54 20 74 72 69 67 67 65 72 N INSERT trigger
8d00: 73 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f s the values sto
8d10: 72 65 64 20 69 6e 20 74 68 65 20 4f 4c 44 2e 2a red in the OLD.*
8d20: 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 61 72 registers.** ar
8d30: 65 20 6e 65 76 65 72 20 61 63 63 65 73 73 65 64 e never accessed
8d40: 2c 20 61 6e 64 20 73 6f 20 61 72 65 20 6e 6f 74 , and so are not
8d50: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 allocated by th
8d60: 65 20 63 61 6c 6c 65 72 2e 20 53 6f 2c 20 66 6f e caller. So, fo
8d70: 72 20 61 6e 0a 2a 2a 20 4f 4e 20 49 4e 53 45 52 r an.** ON INSER
8d80: 54 20 74 72 69 67 67 65 72 2c 20 74 68 65 20 76 T trigger, the v
8d90: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 74 alue passed to t
8da0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 his function as
8db0: 70 61 72 61 6d 65 74 65 72 20 72 65 67 0a 2a 2a parameter reg.**
8dc0: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 64 61 62 is not a readab
8dd0: 6c 65 20 72 65 67 69 73 74 65 72 2c 20 61 6c 74 le register, alt
8de0: 68 6f 75 67 68 20 72 65 67 69 73 74 65 72 73 20 hough registers
8df0: 28 72 65 67 2b 4e 29 20 74 68 72 6f 75 67 68 20 (reg+N) through
8e00: 0a 2a 2a 20 28 72 65 67 2b 4e 2b 4e 2b 31 29 20 .** (reg+N+N+1)
8e10: 61 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d are..**.** Param
8e20: 65 74 65 72 20 6f 72 63 6f 6e 66 20 69 73 20 74 eter orconf is t
8e30: 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 66 6c he default confl
8e40: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 ict resolution a
8e50: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 74 68 65 lgorithm for the
8e60: 0a 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 .** trigger prog
8e70: 72 61 6d 20 74 6f 20 75 73 65 20 28 52 45 50 4c ram to use (REPL
8e80: 41 43 45 2c 20 49 47 4e 4f 52 45 20 65 74 63 2e ACE, IGNORE etc.
8e90: 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69 67 6e ). Parameter ign
8ea0: 6f 72 65 4a 75 6d 70 0a 2a 2a 20 69 73 20 74 68 oreJump.** is th
8eb0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 e instruction th
8ec0: 61 74 20 63 6f 6e 74 72 6f 6c 20 73 68 6f 75 6c at control shoul
8ed0: 64 20 6a 75 6d 70 20 74 6f 20 69 66 20 61 20 74 d jump to if a t
8ee0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 0a 2a rigger program.*
8ef0: 2a 20 72 61 69 73 65 73 20 61 6e 20 49 47 4e 4f * raises an IGNO
8f00: 52 45 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f RE exception..*/
8f10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 .void sqlite3Cod
8f20: 65 52 6f 77 54 72 69 67 67 65 72 28 0a 20 20 50 eRowTrigger(. P
8f30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 arse *pParse,
8f40: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e /* Parse con
8f50: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 text */. Trigge
8f60: 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f r *pTrigger, /
8f70: 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65 * List of trigge
8f80: 72 73 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 rs on table pTab
8f90: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 */. int op,
8fa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e /* On
8fb0: 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c 20 e of TK_UPDATE,
8fc0: 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 44 45 TK_INSERT, TK_DE
8fd0: 4c 45 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69 LETE */. ExprLi
8fe0: 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f st *pChanges, /
8ff0: 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74 20 66 * Changes list f
9000: 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20 4f 46 or any UPDATE OF
9010: 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 triggers */. i
9020: 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 nt tr_tm,
9030: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 52 /* One of TR
9040: 49 47 47 45 52 5f 42 45 46 4f 52 45 2c 20 54 52 IGGER_BEFORE, TR
9050: 49 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 20 IGGER_AFTER */.
9060: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 Table *pTab,
9070: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 /* The tab
9080: 6c 65 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 le to code trigg
9090: 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e ers from */. in
90a0: 74 20 72 65 67 2c 20 20 20 20 20 20 20 20 20 20 t reg,
90b0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 /* The first
90c0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 in an array of r
90d0: 65 67 69 73 74 65 72 73 20 28 73 65 65 20 61 62 egisters (see ab
90e0: 6f 76 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 ove) */. int or
90f0: 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20 2f conf, /
9100: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f * ON CONFLICT po
9110: 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67 licy */. int ig
9120: 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20 20 20 2f noreJump /
9130: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f * Instruction to
9140: 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52 41 49 jump to for RAI
9150: 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 29 7b SE(IGNORE) */.){
9160: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 3b 20 20 . Trigger *p;
9170: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 /* Used
9180: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 to iterate throu
9190: 67 68 20 70 54 72 69 67 67 65 72 20 6c 69 73 74 gh pTrigger list
91a0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f */.. assert( o
91b0: 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20 p==TK_UPDATE ||
91c0: 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 7c 7c op==TK_INSERT ||
91d0: 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 29 op==TK_DELETE )
91e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 5f 74 ;. assert( tr_t
91f0: 6d 3d 3d 54 52 49 47 47 45 52 5f 42 45 46 4f 52 m==TRIGGER_BEFOR
9200: 45 20 7c 7c 20 74 72 5f 74 6d 3d 3d 54 52 49 47 E || tr_tm==TRIG
9210: 47 45 52 5f 41 46 54 45 52 20 29 3b 0a 20 20 61 GER_AFTER );. a
9220: 73 73 65 72 74 28 20 28 6f 70 3d 3d 54 4b 5f 55 ssert( (op==TK_U
9230: 50 44 41 54 45 29 3d 3d 28 70 43 68 61 6e 67 65 PDATE)==(pChange
9240: 73 21 3d 30 29 20 29 3b 0a 0a 20 20 66 6f 72 28 s!=0) );.. for(
9250: 70 3d 70 54 72 69 67 67 65 72 3b 20 70 3b 20 70 p=pTrigger; p; p
9260: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 0a 20 20 20 =p->pNext){..
9270: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b /* Sanity check
9280: 69 6e 67 3a 20 20 54 68 65 20 73 63 68 65 6d 61 ing: The schema
9290: 20 66 6f 72 20 74 68 65 20 74 72 69 67 67 65 72 for the trigger
92a0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 61 62 and for the tab
92b0: 6c 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c le are. ** al
92c0: 77 61 79 73 20 64 65 66 69 6e 65 64 2e 20 20 54 ways defined. T
92d0: 68 65 20 74 72 69 67 67 65 72 20 6d 75 73 74 20 he trigger must
92e0: 62 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 73 be in the same s
92f0: 63 68 65 6d 61 20 61 73 20 74 68 65 20 74 61 62 chema as the tab
9300: 6c 65 0a 20 20 20 20 2a 2a 20 6f 72 20 65 6c 73 le. ** or els
9310: 65 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 54 e it must be a T
9320: 45 4d 50 20 74 72 69 67 67 65 72 2e 20 2a 2f 0a EMP trigger. */.
9330: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 assert( p->p
9340: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20 Schema!=0 );.
9350: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 assert( p->pTab
9360: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20 Schema!=0 );.
9370: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 assert( p->pSch
9380: 65 6d 61 3d 3d 70 2d 3e 70 54 61 62 53 63 68 65 ema==p->pTabSche
9390: 6d 61 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 ma . ||
93a0: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 50 61 72 p->pSchema==pPar
93b0: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 se->db->aDb[1].p
93c0: 53 63 68 65 6d 61 20 29 3b 0a 0a 20 20 20 20 2f Schema );.. /
93d0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 * Determine whet
93e0: 68 65 72 20 77 65 20 73 68 6f 75 6c 64 20 63 6f her we should co
93f0: 64 65 20 74 68 69 73 20 74 72 69 67 67 65 72 20 de this trigger
9400: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 */. if( p->op
9410: 3d 3d 6f 70 20 0a 20 20 20 20 20 26 26 20 70 2d ==op . && p-
9420: 3e 74 72 5f 74 6d 3d 3d 74 72 5f 74 6d 20 0a 20 >tr_tm==tr_tm .
9430: 20 20 20 20 26 26 20 63 68 65 63 6b 43 6f 6c 75 && checkColu
9440: 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f mnOverlap(p->pCo
9450: 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67 65 73 29 lumns, pChanges)
9460: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 . ){. sq
9470: 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 lite3CodeRowTrig
9480: 67 65 72 44 69 72 65 63 74 28 70 50 61 72 73 65 gerDirect(pParse
9490: 2c 20 70 2c 20 70 54 61 62 2c 20 72 65 67 2c 20 , p, pTab, reg,
94a0: 6f 72 63 6f 6e 66 2c 20 69 67 6e 6f 72 65 4a 75 orconf, ignoreJu
94b0: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d mp);. }. }.}
94c0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 69 67 67 65 72 73 ../*.** Triggers
94d0: 20 6d 61 79 20 61 63 63 65 73 73 20 76 61 6c 75 may access valu
94e0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 es stored in the
94f0: 20 6f 6c 64 2e 2a 20 6f 72 20 6e 65 77 2e 2a 20 old.* or new.*
9500: 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 0a 2a pseudo-table. .*
9510: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
9520: 72 65 74 75 72 6e 73 20 61 20 33 32 2d 62 69 74 returns a 32-bit
9530: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 bitmask indicat
9540: 69 6e 67 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e ing which column
9550: 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 6c 64 s of the .** old
9560: 2e 2a 20 6f 72 20 6e 65 77 2e 2a 20 74 61 62 6c .* or new.* tabl
9570: 65 73 20 61 63 74 75 61 6c 6c 79 20 61 72 65 20 es actually are
9580: 75 73 65 64 20 62 79 20 74 72 69 67 67 65 72 73 used by triggers
9590: 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 . This informati
95a0: 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73 on .** may be us
95b0: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 ed by the caller
95c0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 , for example, t
95d0: 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 o avoid having t
95e0: 6f 20 6c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 o load the entir
95f0: 65 0a 2a 2a 20 6f 6c 64 2e 2a 20 72 65 63 6f 72 e.** old.* recor
9600: 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 77 68 d into memory wh
9610: 65 6e 20 65 78 65 63 75 74 69 6e 67 20 61 6e 20 en executing an
9620: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 UPDATE or DELETE
9630: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 command..**.**
9640: 42 69 74 20 30 20 6f 66 20 74 68 65 20 72 65 74 Bit 0 of the ret
9650: 75 72 6e 65 64 20 6d 61 73 6b 20 69 73 20 73 65 urned mask is se
9660: 74 20 69 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f t if the left-mo
9670: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 st column of the
9680: 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 62 65 .** table may be
9690: 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20 accessed using
96a0: 61 6e 20 5b 6f 6c 64 7c 6e 65 77 5d 2e 3c 63 6f an [old|new].<co
96b0: 6c 3e 20 72 65 66 65 72 65 6e 63 65 2e 20 42 69 l> reference. Bi
96c0: 74 20 31 20 69 73 20 73 65 74 20 69 66 0a 2a 2a t 1 is set if.**
96d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 the second left
96e0: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 most column valu
96f0: 65 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 61 e is required, a
9700: 6e 64 20 73 6f 20 6f 6e 2e 20 49 66 20 74 68 65 nd so on. If the
9710: 72 65 0a 2a 2a 20 61 72 65 20 6d 6f 72 65 20 74 re.** are more t
9720: 68 61 6e 20 33 32 20 63 6f 6c 75 6d 6e 73 20 69 han 32 columns i
9730: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 n the table, and
9740: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 at least one of
9750: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 the columns.**
9760: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 with an index gr
9770: 65 61 74 65 72 20 74 68 61 6e 20 33 32 20 6d 61 eater than 32 ma
9780: 79 20 62 65 20 61 63 63 65 73 73 65 64 2c 20 30 y be accessed, 0
9790: 78 66 66 66 66 66 66 66 66 20 69 73 20 72 65 74 xffffffff is ret
97a0: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 urned..**.** It
97b0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 is not possible
97c0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 to determine if
97d0: 74 68 65 20 6f 6c 64 2e 72 6f 77 69 64 20 6f 72 the old.rowid or
97e0: 20 6e 65 77 2e 72 6f 77 69 64 20 63 6f 6c 75 6d new.rowid colum
97f0: 6e 20 69 73 20 0a 2a 2a 20 61 63 63 65 73 73 65 n is .** accesse
9800: 64 20 62 79 20 74 72 69 67 67 65 72 73 2e 20 54 d by triggers. T
9810: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 61 he caller must a
9820: 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74 68 61 lways assume tha
9830: 74 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 50 t it is..**.** P
9840: 61 72 61 6d 65 74 65 72 20 69 73 4e 65 77 20 6d arameter isNew m
9850: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 31 20 ust be either 1
9860: 6f 72 20 30 2e 20 49 66 20 69 74 20 69 73 20 30 or 0. If it is 0
9870: 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 73 6b 20 , then the mask
9880: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 70 70 6c returned.** appl
9890: 69 65 73 20 74 6f 20 74 68 65 20 6f 6c 64 2e 2a ies to the old.*
98a0: 20 74 61 62 6c 65 2e 20 49 66 20 31 2c 20 74 68 table. If 1, th
98b0: 65 20 6e 65 77 2e 2a 20 74 61 62 6c 65 2e 0a 2a e new.* table..*
98c0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 74 *.** Parameter t
98d0: 72 5f 74 6d 20 6d 75 73 74 20 62 65 20 61 20 6d r_tm must be a m
98e0: 61 73 6b 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 ask with one or
98f0: 62 6f 74 68 20 6f 66 20 74 68 65 20 54 52 49 47 both of the TRIG
9900: 47 45 52 5f 42 45 46 4f 52 45 0a 2a 2a 20 61 6e GER_BEFORE.** an
9910: 64 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20 d TRIGGER_AFTER
9920: 62 69 74 73 20 73 65 74 2e 20 56 61 6c 75 65 73 bits set. Values
9930: 20 61 63 63 65 73 73 65 64 20 62 79 20 42 45 46 accessed by BEF
9940: 4f 52 45 20 74 72 69 67 67 65 72 73 20 61 72 65 ORE triggers are
9950: 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63 6c 75 64 65 only.** include
9960: 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 d in the returne
9970: 64 20 6d 61 73 6b 20 69 66 20 74 68 65 20 54 52 d mask if the TR
9980: 49 47 47 45 52 5f 42 45 46 4f 52 45 20 62 69 74 IGGER_BEFORE bit
9990: 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 0a 2a is set in the.*
99a0: 2a 20 74 72 5f 74 6d 20 70 61 72 61 6d 65 74 65 * tr_tm paramete
99b0: 72 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 76 61 r. Similarly, va
99c0: 6c 75 65 73 20 61 63 63 65 73 73 65 64 20 62 79 lues accessed by
99d0: 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73 20 AFTER triggers
99e0: 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63 6c are only.** incl
99f0: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 uded in the retu
9a00: 72 6e 65 64 20 6d 61 73 6b 20 69 66 20 74 68 65 rned mask if the
9a10: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20 62 TRIGGER_AFTER b
9a20: 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 72 5f it is set in tr_
9a30: 74 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 tm..*/.u32 sqlit
9a40: 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61 73 6b e3TriggerColmask
9a50: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 (. Parse *pPars
9a60: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 e, /* Pars
9a70: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 e context */. T
9a80: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 rigger *pTrigger
9a90: 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 , /* List of t
9aa0: 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65 riggers on table
9ab0: 20 70 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c pTab */. ExprL
9ac0: 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 ist *pChanges,
9ad0: 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74 20 /* Changes list
9ae0: 66 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20 4f for any UPDATE O
9af0: 46 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 F triggers */.
9b00: 69 6e 74 20 69 73 4e 65 77 2c 20 20 20 20 20 20 int isNew,
9b10: 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 6e 65 /* 1 for ne
9b20: 77 2e 2a 20 72 65 66 20 6d 61 73 6b 2c 20 30 20 w.* ref mask, 0
9b30: 66 6f 72 20 6f 6c 64 2e 2a 20 72 65 66 20 6d 61 for old.* ref ma
9b40: 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 sk */. int tr_t
9b50: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 m, /*
9b60: 4d 61 73 6b 20 6f 66 20 54 52 49 47 47 45 52 5f Mask of TRIGGER_
9b70: 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52 5f 41 BEFORE|TRIGGER_A
9b80: 46 54 45 52 20 2a 2f 0a 20 20 54 61 62 6c 65 20 FTER */. Table
9b90: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f *pTab, /
9ba0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 63 * The table to c
9bb0: 6f 64 65 20 74 72 69 67 67 65 72 73 20 66 72 6f ode triggers fro
9bc0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e m */. int orcon
9bd0: 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 f /* D
9be0: 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c 49 efault ON CONFLI
9bf0: 43 54 20 70 6f 6c 69 63 79 20 66 6f 72 20 74 72 CT policy for tr
9c00: 69 67 67 65 72 20 73 74 65 70 73 20 2a 2f 0a 29 igger steps */.)
9c10: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 70 {. const int op
9c20: 20 3d 20 70 43 68 61 6e 67 65 73 20 3f 20 54 4b = pChanges ? TK
9c30: 5f 55 50 44 41 54 45 20 3a 20 54 4b 5f 44 45 4c _UPDATE : TK_DEL
9c40: 45 54 45 3b 0a 20 20 75 33 32 20 6d 61 73 6b 20 ETE;. u32 mask
9c50: 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72 20 2a = 0;. Trigger *
9c60: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 p;.. assert( is
9c70: 4e 65 77 3d 3d 31 20 7c 7c 20 69 73 4e 65 77 3d New==1 || isNew=
9c80: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 54 =0 );. for(p=pT
9c90: 72 69 67 67 65 72 3b 20 70 3b 20 70 3d 70 2d 3e rigger; p; p=p->
9ca0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 pNext){. if(
9cb0: 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 28 74 72 p->op==op && (tr
9cc0: 5f 74 6d 26 70 2d 3e 74 72 5f 74 6d 29 0a 20 20 _tm&p->tr_tm).
9cd0: 20 20 20 26 26 20 63 68 65 63 6b 43 6f 6c 75 6d && checkColum
9ce0: 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f 6c nOverlap(p->pCol
9cf0: 75 6d 6e 73 2c 70 43 68 61 6e 67 65 73 29 0a 20 umns,pChanges).
9d00: 20 20 20 29 7b 0a 20 20 20 20 20 20 54 72 69 67 ){. Trig
9d10: 67 65 72 50 72 67 20 2a 70 50 72 67 3b 0a 20 20 gerPrg *pPrg;.
9d20: 20 20 20 20 70 50 72 67 20 3d 20 67 65 74 52 6f pPrg = getRo
9d30: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c wTrigger(pParse,
9d40: 20 70 2c 20 70 54 61 62 2c 20 6f 72 63 6f 6e 66 p, pTab, orconf
9d50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 );. if( pPr
9d60: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 g ){. mas
9d70: 6b 20 7c 3d 20 70 50 72 67 2d 3e 61 43 6f 6c 6d k |= pPrg->aColm
9d80: 61 73 6b 5b 69 73 4e 65 77 5d 3b 0a 20 20 20 20 ask[isNew];.
9d90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 }. }. }..
9da0: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a return mask;.}.
9db0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 .#endif /* !defi
9dc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f ned(SQLITE_OMIT_
9dd0: 54 52 49 47 47 45 52 29 20 2a 2f 0a TRIGGER) */.