mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-22 20:43:02 +01:00
Correction: revert code related with WITH CHECK OPTION internal triggers.
This commit is contained in:
parent
31780d5054
commit
aaf0e33414
@ -11549,10 +11549,13 @@ static RelationSourceNode* pass1Update(thread_db* tdbb, CompilerScratch* csb, jr
|
||||
bool userTriggers = false;
|
||||
|
||||
for (FB_SIZE_T i = 0; i < trigger->getCount(); i++)
|
||||
{
|
||||
if (!(*trigger)[i].sysTrigger)
|
||||
{
|
||||
userTriggers = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (userTriggers)
|
||||
{
|
||||
|
@ -1498,7 +1498,8 @@ void Monitoring::dumpAttachment(thread_db* tdbb, Attachment* attachment, ULONG g
|
||||
{
|
||||
request->adjustCallerStats();
|
||||
|
||||
if (!(request->getStatement()->flags & Statement::FLAG_INTERNAL) &&
|
||||
if (!(request->getStatement()->flags &
|
||||
(Statement::FLAG_INTERNAL | Statement::FLAG_SYS_TRIGGER)) &&
|
||||
request->req_caller)
|
||||
{
|
||||
putCall(record, request);
|
||||
@ -1512,7 +1513,7 @@ void Monitoring::dumpAttachment(thread_db* tdbb, Attachment* attachment, ULONG g
|
||||
|
||||
for (const auto statement : attachment->att_statements)
|
||||
{
|
||||
if (!(statement->flags & Statement::FLAG_INTERNAL))
|
||||
if (!(statement->flags & (Statement::FLAG_INTERNAL | Statement::FLAG_SYS_TRIGGER)))
|
||||
{
|
||||
const string plan = Optimizer::getPlan(tdbb, statement, true);
|
||||
putStatement(record, statement, plan);
|
||||
@ -1526,7 +1527,7 @@ void Monitoring::dumpAttachment(thread_db* tdbb, Attachment* attachment, ULONG g
|
||||
{
|
||||
const auto statement = request->getStatement();
|
||||
|
||||
if (!(statement->flags & Statement::FLAG_INTERNAL))
|
||||
if (!(statement->flags & (Statement::FLAG_INTERNAL | Statement::FLAG_SYS_TRIGGER)))
|
||||
{
|
||||
const string plan = Optimizer::getPlan(tdbb, statement, true);
|
||||
putRequest(record, request, plan);
|
||||
|
@ -34,10 +34,11 @@ class PlanEntry;
|
||||
class Statement : public pool_alloc<type_req>
|
||||
{
|
||||
public:
|
||||
static const unsigned FLAG_SYS_TRIGGER = 0x01;
|
||||
static const unsigned FLAG_INTERNAL = 0x02;
|
||||
static const unsigned FLAG_IGNORE_PERM = 0x04;
|
||||
//static const unsigned FLAG_VERSION4 = 0x08;
|
||||
static const unsigned FLAG_POWERFUL = FLAG_INTERNAL | FLAG_IGNORE_PERM;
|
||||
static const unsigned FLAG_POWERFUL = FLAG_SYS_TRIGGER | FLAG_INTERNAL | FLAG_IGNORE_PERM;
|
||||
|
||||
//static const unsigned MAP_LENGTH; // CVC: Moved to dsql/Nodes.h as STREAM_MAP_LENGTH
|
||||
static const unsigned MAX_CLONES = 1000;
|
||||
|
@ -944,6 +944,9 @@ void Trigger::compile(thread_db* tdbb)
|
||||
if (ssDefiner.asBool())
|
||||
statement->triggerInvoker = att->getUserId(owner);
|
||||
|
||||
if (sysTrigger)
|
||||
statement->flags |= Statement::FLAG_SYS_TRIGGER | Statement::FLAG_INTERNAL;
|
||||
|
||||
if (flags & TRG_ignore_perm)
|
||||
statement->flags |= Statement::FLAG_IGNORE_PERM;
|
||||
}
|
||||
@ -9221,7 +9224,11 @@ ISC_STATUS thread_db::getCancelState(ISC_STATUS* secondary)
|
||||
if ((attachment->att_flags & ATT_cancel_raise) &&
|
||||
!(attachment->att_flags & ATT_cancel_disable))
|
||||
{
|
||||
if ((!transaction || !(transaction->tra_flags & TRA_system)))
|
||||
if ((!request ||
|
||||
!(request->getStatement()->flags &
|
||||
// temporary change to fix shutdown
|
||||
(/*Statement::FLAG_INTERNAL | */Statement::FLAG_SYS_TRIGGER))) &&
|
||||
(!transaction || !(transaction->tra_flags & TRA_system)))
|
||||
{
|
||||
return isc_cancelled;
|
||||
}
|
||||
|
@ -142,6 +142,7 @@ public:
|
||||
Firebird::HalfStaticArray<UCHAR, 128> debugInfo; // Debug info
|
||||
Statement* statement = nullptr; // Compiled statement
|
||||
bool releaseInProgress = false;
|
||||
bool sysTrigger = false;
|
||||
FB_UINT64 type = 0; // Trigger type
|
||||
USHORT flags = 0; // Flags as they are in RDB$TRIGGERS table
|
||||
jrd_rel* relation = nullptr; // Trigger parent relation
|
||||
|
@ -115,7 +115,7 @@ static int blocking_ast_relation(void*);
|
||||
static int partners_ast_relation(void*);
|
||||
static int rescan_ast_relation(void*);
|
||||
static ULONG get_rel_flags_from_FLAGS(USHORT);
|
||||
static void get_trigger(thread_db*, jrd_rel*, bid*, bid*, TrigVector**, const TEXT*, FB_UINT64,
|
||||
static void get_trigger(thread_db*, jrd_rel*, bid*, bid*, TrigVector**, const TEXT*, FB_UINT64, bool,
|
||||
USHORT, const MetaName&, const string&, const bid*, TriState ssDefiner);
|
||||
static bool get_type(thread_db*, USHORT*, const UCHAR*, const TEXT*);
|
||||
static void lookup_view_contexts(thread_db*, jrd_rel*);
|
||||
@ -124,7 +124,7 @@ static ValueExprNode* parse_field_default_blr(thread_db* tdbb, bid* blob_id);
|
||||
static BoolExprNode* parse_field_validation_blr(thread_db* tdbb, bid* blob_id, const MetaName name);
|
||||
static bool resolve_charset_and_collation(thread_db*, USHORT*, const UCHAR*, const UCHAR*);
|
||||
static void save_trigger_data(thread_db*, TrigVector**, jrd_rel*, Statement*, blb*, blb*,
|
||||
const TEXT*, FB_UINT64, USHORT, const MetaName&, const string&,
|
||||
const TEXT*, FB_UINT64, bool, USHORT, const MetaName&, const string&,
|
||||
const bid*, TriState ssDefiner);
|
||||
static void scan_partners(thread_db*, jrd_rel*);
|
||||
static bool verify_TRG_ignore_perm(thread_db*, const MetaName&);
|
||||
@ -2003,6 +2003,7 @@ void MET_load_trigger(thread_db* tdbb,
|
||||
triggers,
|
||||
TRG.RDB$TRIGGER_NAME,
|
||||
TRG.RDB$TRIGGER_TYPE,
|
||||
(bool) TRG.RDB$SYSTEM_FLAG,
|
||||
trig_flags,
|
||||
engine,
|
||||
entryPoint,
|
||||
@ -2023,6 +2024,7 @@ void MET_load_trigger(thread_db* tdbb,
|
||||
triggers + trigger_action,
|
||||
TRG.RDB$TRIGGER_NAME,
|
||||
(UCHAR) trigger_action,
|
||||
(bool) TRG.RDB$SYSTEM_FLAG,
|
||||
trig_flags,
|
||||
engine,
|
||||
entryPoint,
|
||||
@ -4545,7 +4547,7 @@ ULONG MET_get_rel_flags_from_TYPE(USHORT type)
|
||||
static void get_trigger(thread_db* tdbb, jrd_rel* relation,
|
||||
bid* blob_id, bid* debug_blob_id, TrigVector** ptr,
|
||||
const TEXT* name, FB_UINT64 type,
|
||||
USHORT flags,
|
||||
bool sys_trigger, USHORT flags,
|
||||
const MetaName& engine, const string& entryPoint,
|
||||
const bid* body, TriState ssDefiner)
|
||||
{
|
||||
@ -4575,7 +4577,7 @@ static void get_trigger(thread_db* tdbb, jrd_rel* relation,
|
||||
debugInfoBlob = blb::open(tdbb, attachment->getSysTransaction(), debug_blob_id);
|
||||
|
||||
save_trigger_data(tdbb, ptr, relation, NULL, blrBlob, debugInfoBlob,
|
||||
name, type, flags, engine, entryPoint, body, ssDefiner);
|
||||
name, type, sys_trigger, flags, engine, entryPoint, body, ssDefiner);
|
||||
}
|
||||
|
||||
|
||||
@ -4927,7 +4929,7 @@ static bool resolve_charset_and_collation(thread_db* tdbb,
|
||||
static void save_trigger_data(thread_db* tdbb, TrigVector** ptr, jrd_rel* relation,
|
||||
Statement* statement, blb* blrBlob, blb* debugInfoBlob,
|
||||
const TEXT* name, FB_UINT64 type,
|
||||
USHORT flags,
|
||||
bool sys_trigger, USHORT flags,
|
||||
const MetaName& engine, const string& entryPoint,
|
||||
const bid* body, TriState ssDefiner)
|
||||
{
|
||||
@ -4984,6 +4986,7 @@ static void save_trigger_data(thread_db* tdbb, TrigVector** ptr, jrd_rel* relati
|
||||
|
||||
t.type = type;
|
||||
t.flags = flags;
|
||||
t.sysTrigger = sys_trigger;
|
||||
t.statement = statement;
|
||||
t.relation = relation;
|
||||
t.engine = engine;
|
||||
@ -5179,7 +5182,18 @@ void MET_store_dependencies(thread_db* tdbb,
|
||||
|
||||
SET_TDBB(tdbb);
|
||||
|
||||
const bool checkTableScope = dependency_type == obj_computed;
|
||||
const Trigger* t = nullptr;
|
||||
const bool checkTableScope =
|
||||
(dependency_type == obj_computed) ||
|
||||
(dependency_type == obj_trigger) && (dep_rel != 0) &&
|
||||
(
|
||||
(t = findTrigger(dep_rel->rel_pre_erase, object_name)) ||
|
||||
(t = findTrigger(dep_rel->rel_pre_modify, object_name)) ||
|
||||
(t = findTrigger(dep_rel->rel_pre_store, object_name)) ||
|
||||
(t = findTrigger(dep_rel->rel_post_erase, object_name)) ||
|
||||
(t = findTrigger(dep_rel->rel_post_modify, object_name)) ||
|
||||
(t = findTrigger(dep_rel->rel_post_store, object_name))
|
||||
) && t && (t->sysTrigger);
|
||||
|
||||
while (dependencies.hasData())
|
||||
{
|
||||
|
@ -431,7 +431,8 @@ public:
|
||||
const auto attachment = m_tdbb->getAttachment();
|
||||
const auto trace_mgr = attachment->att_trace_manager;
|
||||
|
||||
m_need_trace = trace_mgr->needs(ITraceFactory::TRACE_EVENT_TRIGGER_COMPILE);
|
||||
m_need_trace = !trigger->sysTrigger &&
|
||||
trace_mgr->needs(ITraceFactory::TRACE_EVENT_TRIGGER_COMPILE);
|
||||
|
||||
if (!m_need_trace)
|
||||
return;
|
||||
@ -528,7 +529,8 @@ public:
|
||||
const auto transaction = m_tdbb->getTransaction();
|
||||
const auto trace_mgr = attachment->att_trace_manager;
|
||||
|
||||
m_need_trace = trace_mgr->needs(ITraceFactory::TRACE_EVENT_TRIGGER_EXECUTE);
|
||||
m_need_trace = !(m_request->getStatement()->flags & Statement::FLAG_SYS_TRIGGER) &&
|
||||
trace_mgr->needs(ITraceFactory::TRACE_EVENT_TRIGGER_EXECUTE);
|
||||
|
||||
if (!m_need_trace)
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user