mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-22 22:43:03 +01:00
Ensure the DDL trigger requests are cached (#7426)
While this commit does not fix all problems with cached triggers, I see no good reason to defer it.
This commit is contained in:
parent
0493422c9f
commit
00c2d10102
@ -560,8 +560,9 @@ void EXE_execute_ddl_triggers(thread_db* tdbb, jrd_tra* transaction, bool preTri
|
|||||||
{
|
{
|
||||||
TrigVector triggers;
|
TrigVector triggers;
|
||||||
TrigVector* triggersPtr = &triggers;
|
TrigVector* triggersPtr = &triggers;
|
||||||
|
HalfStaticArray<Trigger*, 4> cachedTriggers;
|
||||||
|
|
||||||
for (const auto& trigger : *attachment->att_ddl_triggers)
|
for (auto& trigger : *attachment->att_ddl_triggers)
|
||||||
{
|
{
|
||||||
const auto type = trigger.type & ~TRIGGER_TYPE_MASK;
|
const auto type = trigger.type & ~TRIGGER_TYPE_MASK;
|
||||||
const bool preTrigger = ((type & 1) == 0);
|
const bool preTrigger = ((type & 1) == 0);
|
||||||
@ -569,11 +570,14 @@ void EXE_execute_ddl_triggers(thread_db* tdbb, jrd_tra* transaction, bool preTri
|
|||||||
if ((type & (1LL << action)) && (preTriggers == preTrigger))
|
if ((type & (1LL << action)) && (preTriggers == preTrigger))
|
||||||
{
|
{
|
||||||
triggers.add() = trigger;
|
triggers.add() = trigger;
|
||||||
|
cachedTriggers.add(&trigger);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (triggers.hasData())
|
if (triggers.hasData())
|
||||||
{
|
{
|
||||||
|
FbLocalStatus tempStatus;
|
||||||
|
|
||||||
jrd_tra* const oldTransaction = tdbb->getTransaction();
|
jrd_tra* const oldTransaction = tdbb->getTransaction();
|
||||||
tdbb->setTransaction(transaction);
|
tdbb->setTransaction(transaction);
|
||||||
|
|
||||||
@ -581,14 +585,24 @@ void EXE_execute_ddl_triggers(thread_db* tdbb, jrd_tra* transaction, bool preTri
|
|||||||
{
|
{
|
||||||
EXE_execute_triggers(tdbb, &triggersPtr, NULL, NULL, TRIGGER_DDL,
|
EXE_execute_triggers(tdbb, &triggersPtr, NULL, NULL, TRIGGER_DDL,
|
||||||
preTriggers ? StmtNode::PRE_TRIG : StmtNode::POST_TRIG);
|
preTriggers ? StmtNode::PRE_TRIG : StmtNode::POST_TRIG);
|
||||||
|
}
|
||||||
|
catch (const Exception& ex)
|
||||||
|
{
|
||||||
|
ex.stuffException(&tempStatus);
|
||||||
|
}
|
||||||
|
|
||||||
tdbb->setTransaction(oldTransaction);
|
tdbb->setTransaction(oldTransaction);
|
||||||
}
|
|
||||||
catch (const Exception&)
|
// Triggers could be compiled inside EXE_execute_triggers(),
|
||||||
|
// so ensure the new pointers are copied back to the cache
|
||||||
|
fb_assert(triggers.getCount() == cachedTriggers.getCount());
|
||||||
|
for (unsigned i = 0; i < triggers.getCount(); i++)
|
||||||
{
|
{
|
||||||
tdbb->setTransaction(oldTransaction);
|
*cachedTriggers[i] = triggers[i];
|
||||||
throw;
|
triggers[i].extTrigger = nullptr; // avoid deletion inside d'tor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tempStatus.check();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user