mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Simplification of the trigger code. (CVS 1976)
FossilOrigin-Name: 9fa904d94ec1787bc8b97ec06a5423248fcb67fb
This commit is contained in:
12
manifest
12
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Fix\sfor\stickets\s#912\sand\s#922.\s\sProblem\sintroduced\sby\scheck-in\s(1973).\s(CVS\s1975)
|
C Simplification\sof\sthe\strigger\scode.\s(CVS\s1976)
|
||||||
D 2004-09-24T12:24:07
|
D 2004-09-24T12:24:36
|
||||||
F Makefile.in abdeb5bd9d017822691884935c320037c33f6ee6
|
F Makefile.in abdeb5bd9d017822691884935c320037c33f6ee6
|
||||||
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
|
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
|
||||||
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
||||||
@@ -69,7 +69,7 @@ F src/test3.c 5b5b0f3d11b097399c1054fff73d8f3711092301
|
|||||||
F src/test4.c 7c6b9fc33dd1f3f93c7f1ee6e5e6d016afa6c1df
|
F src/test4.c 7c6b9fc33dd1f3f93c7f1ee6e5e6d016afa6c1df
|
||||||
F src/test5.c b001fa7f1b9e2dc5c2331de62fc641b5ab2bd7a1
|
F src/test5.c b001fa7f1b9e2dc5c2331de62fc641b5ab2bd7a1
|
||||||
F src/tokenize.c 418ef7ba1149603a30dcf0057e04a3ea0e99edbe
|
F src/tokenize.c 418ef7ba1149603a30dcf0057e04a3ea0e99edbe
|
||||||
F src/trigger.c 3591b88baac4253c93733e34e4d1d74c549fe8a8
|
F src/trigger.c d1f770ee37a80391dd6d0948ee821b0272f99ae7
|
||||||
F src/update.c 7157084216c4b02a23cdb23eb6d246aa9034fa4d
|
F src/update.c 7157084216c4b02a23cdb23eb6d246aa9034fa4d
|
||||||
F src/utf.c 328890099db492dda5620ee5f924e244c6e57ff7
|
F src/utf.c 328890099db492dda5620ee5f924e244c6e57ff7
|
||||||
F src/util.c f9b661a3b80a1469777771776a59a5f0e2f193fc
|
F src/util.c f9b661a3b80a1469777771776a59a5f0e2f193fc
|
||||||
@@ -247,7 +247,7 @@ F www/tclsqlite.tcl 560ecd6a916b320e59f2917317398f3d59b7cc25
|
|||||||
F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9
|
F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9
|
||||||
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
|
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
|
||||||
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
|
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
|
||||||
P a35e52276998f8db2407115b07f30bd490982944
|
P 9001e2220d2e35b81a9b7dc70c012f94bb6db679
|
||||||
R 5792bfa085a00a00bd1d4a9801cd2ff0
|
R fcc40213cf4f43ad3198270005b0847c
|
||||||
U drh
|
U drh
|
||||||
Z d6e2d9c37d8b22b397c88a0920962493
|
Z e0420e53be5e67880217af54cf3a9844
|
||||||
|
@@ -1 +1 @@
|
|||||||
9001e2220d2e35b81a9b7dc70c012f94bb6db679
|
9fa904d94ec1787bc8b97ec06a5423248fcb67fb
|
@@ -650,6 +650,7 @@ static int codeTriggerProgram(
|
|||||||
assert( pTriggerStep!=0 );
|
assert( pTriggerStep!=0 );
|
||||||
assert( v!=0 );
|
assert( v!=0 );
|
||||||
sqlite3VdbeAddOp(v, OP_ContextPush, 0, 0);
|
sqlite3VdbeAddOp(v, OP_ContextPush, 0, 0);
|
||||||
|
VdbeComment((v, "# begin trigger %s", pStepList->pTrig->name));
|
||||||
while( pTriggerStep ){
|
while( pTriggerStep ){
|
||||||
orconf = (orconfin == OE_Default)?pTriggerStep->orconf:orconfin;
|
orconf = (orconfin == OE_Default)?pTriggerStep->orconf:orconfin;
|
||||||
pParse->trigStack->orconf = orconf;
|
pParse->trigStack->orconf = orconf;
|
||||||
@@ -697,6 +698,7 @@ static int codeTriggerProgram(
|
|||||||
pTriggerStep = pTriggerStep->pNext;
|
pTriggerStep = pTriggerStep->pNext;
|
||||||
}
|
}
|
||||||
sqlite3VdbeAddOp(v, OP_ContextPop, 0, 0);
|
sqlite3VdbeAddOp(v, OP_ContextPop, 0, 0);
|
||||||
|
VdbeComment((v, "# end trigger %s", pStepList->pTrig->name));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -732,8 +734,9 @@ int sqlite3CodeRowTrigger(
|
|||||||
int orconf, /* ON CONFLICT policy */
|
int orconf, /* ON CONFLICT policy */
|
||||||
int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */
|
int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */
|
||||||
){
|
){
|
||||||
Trigger * pTrigger;
|
Trigger *pTrigger;
|
||||||
TriggerStack * pTriggerStack;
|
TriggerStack *pStack;
|
||||||
|
TriggerStack trigStackEntry;
|
||||||
|
|
||||||
assert(op == TK_UPDATE || op == TK_INSERT || op == TK_DELETE);
|
assert(op == TK_UPDATE || op == TK_INSERT || op == TK_DELETE);
|
||||||
assert(tr_tm == TK_BEFORE || tr_tm == TK_AFTER );
|
assert(tr_tm == TK_BEFORE || tr_tm == TK_AFTER );
|
||||||
@@ -748,12 +751,10 @@ int sqlite3CodeRowTrigger(
|
|||||||
if( pTrigger->op == op && pTrigger->tr_tm == tr_tm &&
|
if( pTrigger->op == op && pTrigger->tr_tm == tr_tm &&
|
||||||
pTrigger->foreach == TK_ROW ){
|
pTrigger->foreach == TK_ROW ){
|
||||||
fire_this = 1;
|
fire_this = 1;
|
||||||
pTriggerStack = pParse->trigStack;
|
for(pStack=pParse->trigStack; pStack; pStack=pStack->pNext){
|
||||||
while( pTriggerStack ){
|
if( pStack->pTrigger==pTrigger ){
|
||||||
if( pTriggerStack->pTrigger == pTrigger ){
|
|
||||||
fire_this = 0;
|
fire_this = 0;
|
||||||
}
|
}
|
||||||
pTriggerStack = pTriggerStack->pNext;
|
|
||||||
}
|
}
|
||||||
if( op == TK_UPDATE && pTrigger->pColumns &&
|
if( op == TK_UPDATE && pTrigger->pColumns &&
|
||||||
!checkColumnOverLap(pTrigger->pColumns, pChanges) ){
|
!checkColumnOverLap(pTrigger->pColumns, pChanges) ){
|
||||||
@@ -761,10 +762,7 @@ int sqlite3CodeRowTrigger(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIX ME: Can we not omit the sqliteMalloc() and make pTriggerStack
|
if( fire_this ){
|
||||||
** point to a stack variable?
|
|
||||||
*/
|
|
||||||
if( fire_this && (pTriggerStack = sqliteMalloc(sizeof(TriggerStack)))!=0 ){
|
|
||||||
int endTrigger;
|
int endTrigger;
|
||||||
SrcList dummyTablist;
|
SrcList dummyTablist;
|
||||||
Expr * whenExpr;
|
Expr * whenExpr;
|
||||||
@@ -773,21 +771,20 @@ int sqlite3CodeRowTrigger(
|
|||||||
dummyTablist.nSrc = 0;
|
dummyTablist.nSrc = 0;
|
||||||
|
|
||||||
/* Push an entry on to the trigger stack */
|
/* Push an entry on to the trigger stack */
|
||||||
pTriggerStack->pTrigger = pTrigger;
|
trigStackEntry.pTrigger = pTrigger;
|
||||||
pTriggerStack->newIdx = newIdx;
|
trigStackEntry.newIdx = newIdx;
|
||||||
pTriggerStack->oldIdx = oldIdx;
|
trigStackEntry.oldIdx = oldIdx;
|
||||||
pTriggerStack->pTab = pTab;
|
trigStackEntry.pTab = pTab;
|
||||||
pTriggerStack->pNext = pParse->trigStack;
|
trigStackEntry.pNext = pParse->trigStack;
|
||||||
pTriggerStack->ignoreJump = ignoreJump;
|
trigStackEntry.ignoreJump = ignoreJump;
|
||||||
pParse->trigStack = pTriggerStack;
|
pParse->trigStack = &trigStackEntry;
|
||||||
sqlite3AuthContextPush(pParse, &sContext, pTrigger->name);
|
sqlite3AuthContextPush(pParse, &sContext, pTrigger->name);
|
||||||
|
|
||||||
/* code the WHEN clause */
|
/* code the WHEN clause */
|
||||||
endTrigger = sqlite3VdbeMakeLabel(pParse->pVdbe);
|
endTrigger = sqlite3VdbeMakeLabel(pParse->pVdbe);
|
||||||
whenExpr = sqlite3ExprDup(pTrigger->pWhen);
|
whenExpr = sqlite3ExprDup(pTrigger->pWhen);
|
||||||
if( sqlite3ExprResolveIds(pParse, &dummyTablist, 0, whenExpr) ){
|
if( sqlite3ExprResolveIds(pParse, &dummyTablist, 0, whenExpr) ){
|
||||||
pParse->trigStack = pParse->trigStack->pNext;
|
pParse->trigStack = trigStackEntry.pNext;
|
||||||
sqliteFree(pTriggerStack);
|
|
||||||
sqlite3ExprDelete(whenExpr);
|
sqlite3ExprDelete(whenExpr);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -797,9 +794,8 @@ int sqlite3CodeRowTrigger(
|
|||||||
codeTriggerProgram(pParse, pTrigger->step_list, orconf);
|
codeTriggerProgram(pParse, pTrigger->step_list, orconf);
|
||||||
|
|
||||||
/* Pop the entry off the trigger stack */
|
/* Pop the entry off the trigger stack */
|
||||||
pParse->trigStack = pParse->trigStack->pNext;
|
pParse->trigStack = trigStackEntry.pNext;
|
||||||
sqlite3AuthContextPop(&sContext);
|
sqlite3AuthContextPop(&sContext);
|
||||||
sqliteFree(pTriggerStack);
|
|
||||||
|
|
||||||
sqlite3VdbeResolveLabel(pParse->pVdbe, endTrigger);
|
sqlite3VdbeResolveLabel(pParse->pVdbe, endTrigger);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user