diff --git a/src/dsql/StmtNodes.cpp b/src/dsql/StmtNodes.cpp index 5deb5c79d3..585bf5fa6d 100644 --- a/src/dsql/StmtNodes.cpp +++ b/src/dsql/StmtNodes.cpp @@ -2925,6 +2925,7 @@ DmlNode* ExecProcedureNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScr { SET_TDBB(tdbb); + const auto blrStartPos = csb->csb_blr_reader.getPos(); jrd_prc* procedure = NULL; QualifiedName name; @@ -2957,6 +2958,25 @@ DmlNode* ExecProcedureNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScr if (!procedure) PAR_error(csb, Arg::Gds(isc_prcnotdef) << Arg::Str(name.toString())); + else + { + if (procedure->isImplemented() && !procedure->isDefined()) + { + if (tdbb->getAttachment()->isGbak() || (tdbb->tdbb_flags & TDBB_replicator)) + { + PAR_warning( + Arg::Warning(isc_prcnotdef) << Arg::Str(name.toString()) << + Arg::Warning(isc_modnotfound)); + } + else + { + csb->csb_blr_reader.setPos(blrStartPos); + PAR_error(csb, + Arg::Gds(isc_prcnotdef) << Arg::Str(name.toString()) << + Arg::Gds(isc_modnotfound)); + } + } + } ExecProcedureNode* node = FB_NEW_POOL(pool) ExecProcedureNode(pool); node->procedure = procedure; @@ -3237,8 +3257,8 @@ void ExecProcedureNode::executeProcedure(thread_db* tdbb, Request* request) cons else if (!procedure->isDefined()) { status_exception::raise( - Arg::Gds(isc_prcnotdef) << - Arg::Str(procedure->getName().toString())); + Arg::Gds(isc_prcnotdef) << Arg::Str(procedure->getName().toString()) << + Arg::Gds(isc_modnotfound)); } const_cast(procedure.getObject())->checkReload(tdbb); diff --git a/src/jrd/RecordSourceNodes.cpp b/src/jrd/RecordSourceNodes.cpp index 05372e42cd..9107a9117b 100644 --- a/src/jrd/RecordSourceNodes.cpp +++ b/src/jrd/RecordSourceNodes.cpp @@ -889,6 +889,7 @@ ProcedureSourceNode* ProcedureSourceNode::parse(thread_db* tdbb, CompilerScratch { SET_TDBB(tdbb); + const auto blrStartPos = csb->csb_blr_reader.getPos(); jrd_prc* procedure = NULL; string* aliasString = NULL; QualifiedName name; @@ -955,6 +956,25 @@ ProcedureSourceNode* ProcedureSourceNode::parse(thread_db* tdbb, CompilerScratch if (!procedure) PAR_error(csb, Arg::Gds(isc_prcnotdef) << Arg::Str(name.toString())); + else + { + if (procedure->isImplemented() && !procedure->isDefined()) + { + if (tdbb->getAttachment()->isGbak() || (tdbb->tdbb_flags & TDBB_replicator)) + { + PAR_warning( + Arg::Warning(isc_prcnotdef) << Arg::Str(name.toString()) << + Arg::Warning(isc_modnotfound)); + } + else + { + csb->csb_blr_reader.setPos(blrStartPos); + PAR_error(csb, + Arg::Gds(isc_prcnotdef) << Arg::Str(name.toString()) << + Arg::Gds(isc_modnotfound)); + } + } + } if (procedure->prc_type == prc_executable) { diff --git a/src/jrd/recsrc/ProcedureScan.cpp b/src/jrd/recsrc/ProcedureScan.cpp index 75d3a498dc..a6825ccaf9 100644 --- a/src/jrd/recsrc/ProcedureScan.cpp +++ b/src/jrd/recsrc/ProcedureScan.cpp @@ -66,8 +66,8 @@ void ProcedureScan::open(thread_db* tdbb) const else if (!m_procedure->isDefined()) { status_exception::raise( - Arg::Gds(isc_prcnotdef) << - Arg::Str(m_procedure->getName().toString())); + Arg::Gds(isc_prcnotdef) << Arg::Str(m_procedure->getName().toString()) << + Arg::Gds(isc_modnotfound)); } const_cast(m_procedure)->checkReload(tdbb);