mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-22 21:23:04 +01:00
Fix #6801 - Error recompiling a package with some combination of nested functions.
This commit is contained in:
parent
ab8fca3977
commit
e1375992f4
@ -65,6 +65,7 @@ Function* Function::lookup(thread_db* tdbb, USHORT id, bool return_deleted, bool
|
|||||||
Function* function = (id < attachment->att_functions.getCount()) ? attachment->att_functions[id] : NULL;
|
Function* function = (id < attachment->att_functions.getCount()) ? attachment->att_functions[id] : NULL;
|
||||||
|
|
||||||
if (function && function->getId() == id &&
|
if (function && function->getId() == id &&
|
||||||
|
!(function->flags & Routine::FLAG_CLEARED) &&
|
||||||
!(function->flags & Routine::FLAG_BEING_SCANNED) &&
|
!(function->flags & Routine::FLAG_BEING_SCANNED) &&
|
||||||
((function->flags & Routine::FLAG_SCANNED) || noscan) &&
|
((function->flags & Routine::FLAG_SCANNED) || noscan) &&
|
||||||
!(function->flags & Routine::FLAG_BEING_ALTERED) &&
|
!(function->flags & Routine::FLAG_BEING_ALTERED) &&
|
||||||
@ -118,6 +119,7 @@ Function* Function::lookup(thread_db* tdbb, const QualifiedName& name, bool nosc
|
|||||||
Function* const function = *iter;
|
Function* const function = *iter;
|
||||||
|
|
||||||
if (function && !(function->flags & Routine::FLAG_OBSOLETE) &&
|
if (function && !(function->flags & Routine::FLAG_OBSOLETE) &&
|
||||||
|
!(function->flags & Routine::FLAG_CLEARED) &&
|
||||||
((function->flags & Routine::FLAG_SCANNED) || noscan) &&
|
((function->flags & Routine::FLAG_SCANNED) || noscan) &&
|
||||||
!(function->flags & Routine::FLAG_BEING_SCANNED) &&
|
!(function->flags & Routine::FLAG_BEING_SCANNED) &&
|
||||||
!(function->flags & Routine::FLAG_BEING_ALTERED))
|
!(function->flags & Routine::FLAG_BEING_ALTERED))
|
||||||
@ -194,7 +196,7 @@ Function* Function::loadMetadata(thread_db* tdbb, USHORT id, bool noscan, USHORT
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
function->flags |= (Routine::FLAG_BEING_SCANNED | flags);
|
function->flags |= (Routine::FLAG_BEING_SCANNED | flags);
|
||||||
function->flags &= ~Routine::FLAG_OBSOLETE;
|
function->flags &= ~(Routine::FLAG_OBSOLETE | Routine::FLAG_CLEARED);
|
||||||
|
|
||||||
function->setId(id);
|
function->setId(id);
|
||||||
attachment->att_functions[id] = function;
|
attachment->att_functions[id] = function;
|
||||||
|
@ -365,12 +365,12 @@ void Routine::remove(thread_db* tdbb)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Fully clear routine block. Some pieces of code check for empty
|
// Fully clear routine block. Some pieces of code check for empty
|
||||||
// routine name and ID, this is why we do it.
|
// routine name, this is why we do it.
|
||||||
setName(QualifiedName());
|
setName(QualifiedName());
|
||||||
setSecurityName("");
|
setSecurityName("");
|
||||||
setId(0);
|
|
||||||
setDefaultCount(0);
|
setDefaultCount(0);
|
||||||
releaseExternal();
|
releaseExternal();
|
||||||
|
flags |= FLAG_CLEARED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,6 +82,7 @@ namespace Jrd
|
|||||||
// invalidating procedure pointers from other parts of metadata cache
|
// invalidating procedure pointers from other parts of metadata cache
|
||||||
static const USHORT FLAG_CHECK_EXISTENCE = 16; // Existence lock released
|
static const USHORT FLAG_CHECK_EXISTENCE = 16; // Existence lock released
|
||||||
static const USHORT FLAG_RELOAD = 32; // Recompile before execution
|
static const USHORT FLAG_RELOAD = 32; // Recompile before execution
|
||||||
|
static const USHORT FLAG_CLEARED = 64; // Routine cleared but not removed from cache
|
||||||
|
|
||||||
static const USHORT MAX_ALTER_COUNT = 64; // Number of times an in-cache routine can be altered
|
static const USHORT MAX_ALTER_COUNT = 64; // Number of times an in-cache routine can be altered
|
||||||
|
|
||||||
|
@ -2777,6 +2777,7 @@ jrd_prc* MET_lookup_procedure(thread_db* tdbb, const QualifiedName& name, bool n
|
|||||||
jrd_prc* procedure = *iter;
|
jrd_prc* procedure = *iter;
|
||||||
|
|
||||||
if (procedure && !(procedure->flags & Routine::FLAG_OBSOLETE) &&
|
if (procedure && !(procedure->flags & Routine::FLAG_OBSOLETE) &&
|
||||||
|
!(procedure->flags & Routine::FLAG_CLEARED) &&
|
||||||
((procedure->flags & Routine::FLAG_SCANNED) || noscan) &&
|
((procedure->flags & Routine::FLAG_SCANNED) || noscan) &&
|
||||||
!(procedure->flags & Routine::FLAG_BEING_SCANNED) &&
|
!(procedure->flags & Routine::FLAG_BEING_SCANNED) &&
|
||||||
!(procedure->flags & Routine::FLAG_BEING_ALTERED))
|
!(procedure->flags & Routine::FLAG_BEING_ALTERED))
|
||||||
@ -2845,6 +2846,7 @@ jrd_prc* MET_lookup_procedure_id(thread_db* tdbb, USHORT id,
|
|||||||
|
|
||||||
if (id < (USHORT) attachment->att_procedures.getCount() && (procedure = attachment->att_procedures[id]) &&
|
if (id < (USHORT) attachment->att_procedures.getCount() && (procedure = attachment->att_procedures[id]) &&
|
||||||
procedure->getId() == id &&
|
procedure->getId() == id &&
|
||||||
|
!(procedure->flags & Routine::FLAG_CLEARED) &&
|
||||||
!(procedure->flags & Routine::FLAG_BEING_SCANNED) &&
|
!(procedure->flags & Routine::FLAG_BEING_SCANNED) &&
|
||||||
((procedure->flags & Routine::FLAG_SCANNED) || noscan) &&
|
((procedure->flags & Routine::FLAG_SCANNED) || noscan) &&
|
||||||
!(procedure->flags & Routine::FLAG_BEING_ALTERED) &&
|
!(procedure->flags & Routine::FLAG_BEING_ALTERED) &&
|
||||||
@ -3336,7 +3338,7 @@ jrd_prc* MET_procedure(thread_db* tdbb, USHORT id, bool noscan, USHORT flags)
|
|||||||
try {
|
try {
|
||||||
|
|
||||||
procedure->flags |= (Routine::FLAG_BEING_SCANNED | flags);
|
procedure->flags |= (Routine::FLAG_BEING_SCANNED | flags);
|
||||||
procedure->flags &= ~Routine::FLAG_OBSOLETE;
|
procedure->flags &= ~(Routine::FLAG_OBSOLETE | Routine::FLAG_CLEARED);
|
||||||
|
|
||||||
procedure->setId(id);
|
procedure->setId(id);
|
||||||
attachment->att_procedures[id] = procedure;
|
attachment->att_procedures[id] = procedure;
|
||||||
@ -3529,7 +3531,7 @@ jrd_prc* MET_procedure(thread_db* tdbb, USHORT id, bool noscan, USHORT flags)
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
procedure->parseBlr(tdbb, csb, &P.RDB$PROCEDURE_BLR,
|
procedure->parseBlr(tdbb, csb, &P.RDB$PROCEDURE_BLR,
|
||||||
P.RDB$DEBUG_INFO.NULL ? NULL : &P.RDB$DEBUG_INFO);
|
P.RDB$DEBUG_INFO.NULL ? NULL : &P.RDB$DEBUG_INFO);
|
||||||
}
|
}
|
||||||
catch (const Exception& ex)
|
catch (const Exception& ex)
|
||||||
|
Loading…
Reference in New Issue
Block a user