From 7096f67a3132506e0a58909d44ec08de1f0a6393 Mon Sep 17 00:00:00 2001 From: Adriano dos Santos Fernandes Date: Mon, 11 Apr 2022 22:50:27 -0300 Subject: [PATCH] Fix #7168 - Ignore missing UDR libraries during restore. --- src/dsql/StmtNodes.cpp | 6 ++++ src/jrd/ExtEngineManager.cpp | 52 +++++++++++++++++++++++--------- src/jrd/Function.epp | 2 +- src/jrd/met.epp | 6 +++- src/jrd/recsrc/ProcedureScan.cpp | 6 ++++ 5 files changed, 55 insertions(+), 17 deletions(-) diff --git a/src/dsql/StmtNodes.cpp b/src/dsql/StmtNodes.cpp index fcf0bc36f4..5deb5c79d3 100644 --- a/src/dsql/StmtNodes.cpp +++ b/src/dsql/StmtNodes.cpp @@ -3234,6 +3234,12 @@ void ExecProcedureNode::executeProcedure(thread_db* tdbb, Request* request) cons Arg::Gds(isc_proc_pack_not_implemented) << Arg::Str(procedure->getName().identifier) << Arg::Str(procedure->getName().package)); } + else if (!procedure->isDefined()) + { + status_exception::raise( + Arg::Gds(isc_prcnotdef) << + Arg::Str(procedure->getName().toString())); + } const_cast(procedure.getObject())->checkReload(tdbb); diff --git a/src/jrd/ExtEngineManager.cpp b/src/jrd/ExtEngineManager.cpp index 2b049f75ef..1fbe449a67 100644 --- a/src/jrd/ExtEngineManager.cpp +++ b/src/jrd/ExtEngineManager.cpp @@ -1298,6 +1298,9 @@ void ExtEngineManager::makeFunction(thread_db* tdbb, CompilerScratch* csb, Jrd:: metadata->inputParameters.assignRefNoIncr(Routine::createMetadata(udf->getInputFields(), true)); metadata->outputParameters.assignRefNoIncr(Routine::createMetadata(udf->getOutputFields(), true)); + udf->setInputFormat(Routine::createFormat(pool, metadata->inputParameters, false)); + udf->setOutputFormat(Routine::createFormat(pool, metadata->outputParameters, true)); + FbLocalStatus status; RefPtr inBuilder(REF_NO_INCR, metadata->inputParameters->getBuilder(&status)); @@ -1314,12 +1317,23 @@ void ExtEngineManager::makeFunction(thread_db* tdbb, CompilerScratch* csb, Jrd:: externalFunction = attInfo->engine->makeFunction(&status, attInfo->context, metadata, inBuilder, outBuilder); - status.check(); - if (!externalFunction) + try { - status_exception::raise( - Arg::Gds(isc_eem_func_not_returned) << udf->getName().toString() << engine); + status.check(); + + if (!externalFunction) + { + status_exception::raise( + Arg::Gds(isc_eem_func_not_returned) << udf->getName().toString() << engine); + } + } + catch (const Exception&) + { + if (tdbb->getAttachment()->isGbak()) + return; + else + throw; } extInputParameters.assignRefNoIncr(inBuilder->getMetadata(&status)); @@ -1329,9 +1343,6 @@ void ExtEngineManager::makeFunction(thread_db* tdbb, CompilerScratch* csb, Jrd:: status.check(); } - udf->setInputFormat(Routine::createFormat(pool, metadata->inputParameters, false)); - udf->setOutputFormat(Routine::createFormat(pool, metadata->outputParameters, true)); - const Format* extInputFormat = Routine::createFormat(pool, extInputParameters, false); const Format* extOutputFormat = Routine::createFormat(pool, extOutputParameters, true); @@ -1423,6 +1434,9 @@ void ExtEngineManager::makeProcedure(thread_db* tdbb, CompilerScratch* csb, jrd_ metadata->inputParameters.assignRefNoIncr(Routine::createMetadata(prc->getInputFields(), true)); metadata->outputParameters.assignRefNoIncr(Routine::createMetadata(prc->getOutputFields(), true)); + prc->setInputFormat(Routine::createFormat(pool, metadata->inputParameters, false)); + prc->setOutputFormat(Routine::createFormat(pool, metadata->outputParameters, true)); + FbLocalStatus status; RefPtr inBuilder(REF_NO_INCR, metadata->inputParameters->getBuilder(&status)); @@ -1439,13 +1453,24 @@ void ExtEngineManager::makeProcedure(thread_db* tdbb, CompilerScratch* csb, jrd_ externalProcedure = attInfo->engine->makeProcedure(&status, attInfo->context, metadata, inBuilder, outBuilder); - status.check(); - if (!externalProcedure) + try { - status_exception::raise( - Arg::Gds(isc_eem_proc_not_returned) << - prc->getName().toString() << engine); + status.check(); + + if (!externalProcedure) + { + status_exception::raise( + Arg::Gds(isc_eem_proc_not_returned) << + prc->getName().toString() << engine); + } + } + catch (const Exception&) + { + if (tdbb->getAttachment()->isGbak()) + return; + else + throw; } extInputParameters.assignRefNoIncr(inBuilder->getMetadata(&status)); @@ -1455,9 +1480,6 @@ void ExtEngineManager::makeProcedure(thread_db* tdbb, CompilerScratch* csb, jrd_ status.check(); } - prc->setInputFormat(Routine::createFormat(pool, metadata->inputParameters, false)); - prc->setOutputFormat(Routine::createFormat(pool, metadata->outputParameters, true)); - const Format* extInputFormat = Routine::createFormat(pool, extInputParameters, false); const Format* extOutputFormat = Routine::createFormat(pool, extOutputParameters, true); diff --git a/src/jrd/Function.epp b/src/jrd/Function.epp index 9396bd786b..cc54bdbd19 100644 --- a/src/jrd/Function.epp +++ b/src/jrd/Function.epp @@ -460,7 +460,7 @@ Function* Function::loadMetadata(thread_db* tdbb, USHORT id, bool noscan, USHORT throw; } - fb_assert(function->getStatement()->function == function); + fb_assert(!function->isDefined() || function->getStatement()->function == function); } else { diff --git a/src/jrd/met.epp b/src/jrd/met.epp index bfffdfc7a8..de67421056 100644 --- a/src/jrd/met.epp +++ b/src/jrd/met.epp @@ -3401,6 +3401,7 @@ jrd_prc* MET_procedure(thread_db* tdbb, USHORT id, bool noscan, USHORT flags) procedure->invoker = attachment->getUserId(procedure->owner); procedure->setImplemented(true); + procedure->setDefined(true); procedure->getInputFields().resize(P.RDB$PROCEDURE_INPUTS); procedure->getOutputFields().resize(P.RDB$PROCEDURE_OUTPUTS); procedure->setDefaultCount(0); @@ -3525,6 +3526,9 @@ jrd_prc* MET_procedure(thread_db* tdbb, USHORT id, bool noscan, USHORT flags) dbb->dbb_extManager->makeProcedure(tdbb, csb, procedure, P.RDB$ENGINE_NAME, (P.RDB$ENTRYPOINT.NULL ? "" : P.RDB$ENTRYPOINT), body.begin()); + + if (!procedure->getExternal()) + procedure->setDefined(false); } else { @@ -3553,7 +3557,7 @@ jrd_prc* MET_procedure(thread_db* tdbb, USHORT id, bool noscan, USHORT flags) throw; } - fb_assert(procedure->getStatement()->procedure == procedure); + fb_assert(!procedure->isDefined() || procedure->getStatement()->procedure == procedure); } else { diff --git a/src/jrd/recsrc/ProcedureScan.cpp b/src/jrd/recsrc/ProcedureScan.cpp index 34655a7a00..75d3a498dc 100644 --- a/src/jrd/recsrc/ProcedureScan.cpp +++ b/src/jrd/recsrc/ProcedureScan.cpp @@ -63,6 +63,12 @@ void ProcedureScan::open(thread_db* tdbb) const Arg::Gds(isc_proc_pack_not_implemented) << Arg::Str(m_procedure->getName().identifier) << Arg::Str(m_procedure->getName().package)); } + else if (!m_procedure->isDefined()) + { + status_exception::raise( + Arg::Gds(isc_prcnotdef) << + Arg::Str(m_procedure->getName().toString())); + } const_cast(m_procedure)->checkReload(tdbb);