aboutsummaryrefslogtreecommitdiff
path: root/src/trigger.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2004-09-24 12:24:36 +0000
committerdrh <drh@noemail.net>2004-09-24 12:24:36 +0000
commit670404626d62aa0f408a05d11d99c342ae46b58a (patch)
treeb7b654ad3cfdb1b360e82a5ca08950d4256d4b4b /src/trigger.c
parent145716b323bee1770fa4d1a88cb9fcc2065abdf8 (diff)
downloadsqlite-670404626d62aa0f408a05d11d99c342ae46b58a.tar.gz
sqlite-670404626d62aa0f408a05d11d99c342ae46b58a.zip
Simplification of the trigger code. (CVS 1976)
FossilOrigin-Name: 9fa904d94ec1787bc8b97ec06a5423248fcb67fb
Diffstat (limited to 'src/trigger.c')
-rw-r--r--src/trigger.c38
1 files changed, 17 insertions, 21 deletions
diff --git a/src/trigger.c b/src/trigger.c
index 90ab54e3f..50600b0af 100644
--- a/src/trigger.c
+++ b/src/trigger.c
@@ -650,6 +650,7 @@ static int codeTriggerProgram(
assert( pTriggerStep!=0 );
assert( v!=0 );
sqlite3VdbeAddOp(v, OP_ContextPush, 0, 0);
+ VdbeComment((v, "# begin trigger %s", pStepList->pTrig->name));
while( pTriggerStep ){
orconf = (orconfin == OE_Default)?pTriggerStep->orconf:orconfin;
pParse->trigStack->orconf = orconf;
@@ -697,6 +698,7 @@ static int codeTriggerProgram(
pTriggerStep = pTriggerStep->pNext;
}
sqlite3VdbeAddOp(v, OP_ContextPop, 0, 0);
+ VdbeComment((v, "# end trigger %s", pStepList->pTrig->name));
return 0;
}
@@ -732,8 +734,9 @@ int sqlite3CodeRowTrigger(
int orconf, /* ON CONFLICT policy */
int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */
){
- Trigger * pTrigger;
- TriggerStack * pTriggerStack;
+ Trigger *pTrigger;
+ TriggerStack *pStack;
+ TriggerStack trigStackEntry;
assert(op == TK_UPDATE || op == TK_INSERT || op == TK_DELETE);
assert(tr_tm == TK_BEFORE || tr_tm == TK_AFTER );
@@ -748,12 +751,10 @@ int sqlite3CodeRowTrigger(
if( pTrigger->op == op && pTrigger->tr_tm == tr_tm &&
pTrigger->foreach == TK_ROW ){
fire_this = 1;
- pTriggerStack = pParse->trigStack;
- while( pTriggerStack ){
- if( pTriggerStack->pTrigger == pTrigger ){
+ for(pStack=pParse->trigStack; pStack; pStack=pStack->pNext){
+ if( pStack->pTrigger==pTrigger ){
fire_this = 0;
}
- pTriggerStack = pTriggerStack->pNext;
}
if( op == TK_UPDATE && pTrigger->pColumns &&
!checkColumnOverLap(pTrigger->pColumns, pChanges) ){
@@ -761,10 +762,7 @@ int sqlite3CodeRowTrigger(
}
}
- /* FIX ME: Can we not omit the sqliteMalloc() and make pTriggerStack
- ** point to a stack variable?
- */
- if( fire_this && (pTriggerStack = sqliteMalloc(sizeof(TriggerStack)))!=0 ){
+ if( fire_this ){
int endTrigger;
SrcList dummyTablist;
Expr * whenExpr;
@@ -773,21 +771,20 @@ int sqlite3CodeRowTrigger(
dummyTablist.nSrc = 0;
/* Push an entry on to the trigger stack */
- pTriggerStack->pTrigger = pTrigger;
- pTriggerStack->newIdx = newIdx;
- pTriggerStack->oldIdx = oldIdx;
- pTriggerStack->pTab = pTab;
- pTriggerStack->pNext = pParse->trigStack;
- pTriggerStack->ignoreJump = ignoreJump;
- pParse->trigStack = pTriggerStack;
+ trigStackEntry.pTrigger = pTrigger;
+ trigStackEntry.newIdx = newIdx;
+ trigStackEntry.oldIdx = oldIdx;
+ trigStackEntry.pTab = pTab;
+ trigStackEntry.pNext = pParse->trigStack;
+ trigStackEntry.ignoreJump = ignoreJump;
+ pParse->trigStack = &trigStackEntry;
sqlite3AuthContextPush(pParse, &sContext, pTrigger->name);
/* code the WHEN clause */
endTrigger = sqlite3VdbeMakeLabel(pParse->pVdbe);
whenExpr = sqlite3ExprDup(pTrigger->pWhen);
if( sqlite3ExprResolveIds(pParse, &dummyTablist, 0, whenExpr) ){
- pParse->trigStack = pParse->trigStack->pNext;
- sqliteFree(pTriggerStack);
+ pParse->trigStack = trigStackEntry.pNext;
sqlite3ExprDelete(whenExpr);
return 1;
}
@@ -797,9 +794,8 @@ int sqlite3CodeRowTrigger(
codeTriggerProgram(pParse, pTrigger->step_list, orconf);
/* Pop the entry off the trigger stack */
- pParse->trigStack = pParse->trigStack->pNext;
+ pParse->trigStack = trigStackEntry.pNext;
sqlite3AuthContextPop(&sContext);
- sqliteFree(pTriggerStack);
sqlite3VdbeResolveLabel(pParse->pVdbe, endTrigger);
}