3232#include " ../jrd/ids.h"
3333#include " ../jrd/ini.h"
3434#include " ../jrd/tra.h"
35+ #include " ../jrd/met.h"
3536#include " ../jrd/Coercion.h"
3637#include " ../jrd/Function.h"
3738#include " ../jrd/Optimizer.h"
@@ -107,7 +108,7 @@ static void pass1Validations(thread_db* tdbb, CompilerScratch* csb, Array<Valida
107108static ForNode* pass2FindForNode (StmtNode* node, StreamType stream);
108109static void postTriggerAccess (CompilerScratch* csb, jrd_rel* ownerRelation,
109110 ExternalAccess::exa_act operation, jrd_rel* view);
110- static void preModifyEraseTriggers (thread_db* tdbb, TrigVector* * trigs,
111+ static void preModifyEraseTriggers (thread_db* tdbb, TrigVectorPtr * trigs,
111112 StmtNode::WhichTrigger whichTrig, record_param* rpb, record_param* rec, TriggerAction op);
112113static void preprocessAssignments (thread_db* tdbb, CompilerScratch* csb,
113114 StreamType stream, CompoundStmtNode* compoundNode, const Nullable<OverrideClause>* insertOverride);
@@ -2917,13 +2918,14 @@ DmlNode* ExecProcedureNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScr
29172918{
29182919 SET_TDBB (tdbb);
29192920
2921+ HazardPtr<jrd_prc> proc;
29202922 jrd_prc* procedure = NULL ;
29212923 QualifiedName name;
29222924
29232925 if (blrOp == blr_exec_pid)
29242926 {
29252927 const USHORT pid = csb->csb_blr_reader .getWord ();
2926- if (!(procedure = MetadataCache::lookup_procedure_id (tdbb, pid, false , false , 0 )))
2928+ if (!(proc = MetadataCache::lookup_procedure_id (tdbb, pid, false , false , 0 )))
29272929 name.identifier .printf (" id %d" , pid);
29282930 }
29292931 else
@@ -2944,9 +2946,12 @@ DmlNode* ExecProcedureNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScr
29442946 }
29452947 }
29462948 else
2947- procedure = MetadataCache::lookup_procedure (tdbb, name, false );
2949+ proc = MetadataCache::lookup_procedure (tdbb, name, false );
29482950 }
29492951
2952+ if (proc && !procedure)
2953+ procedure = proc.unsafePointer ();
2954+
29502955 if (!procedure)
29512956 PAR_error (csb, Arg::Gds (isc_prcnotdef) << Arg::Str (name.toString ()));
29522957
@@ -10531,7 +10536,9 @@ static RelationSourceNode* pass1Update(thread_db* tdbb, CompilerScratch* csb, jr
1053110536
1053210537 for (FB_SIZE_T i = 0 ; i < trigger->getCount (); i++)
1053310538 {
10534- if (!(*trigger)[i].sysTrigger )
10539+ HazardPtr<Trigger> tr;
10540+ trigger->load (i, tr);
10541+ if (!tr->sysTrigger )
1053510542 {
1053610543 userTriggers = true ;
1053710544 break ;
@@ -10633,7 +10640,7 @@ static void postTriggerAccess(CompilerScratch* csb, jrd_rel* ownerRelation,
1063310640}
1063410641
1063510642// Perform operation's pre-triggers, storing active rpb in chain.
10636- static void preModifyEraseTriggers (thread_db* tdbb, TrigVector* * trigs,
10643+ static void preModifyEraseTriggers (thread_db* tdbb, TrigVectorPtr * trigs,
1063710644 StmtNode::WhichTrigger whichTrig, record_param* rpb, record_param* rec, TriggerAction op)
1063810645{
1063910646 if (!tdbb->getTransaction ()->tra_rpblist )
@@ -10715,7 +10722,7 @@ static void preprocessAssignments(thread_db* tdbb, CompilerScratch* csb,
1071510722 }
1071610723 else if (relation->rel_view_rse && fld->fld_source_rel_field .first .hasData ())
1071710724 {
10718- relation = MetadataCache::lookup_relation (tdbb, fld->fld_source_rel_field .first );
10725+ relation = MetadataCache::lookup_relation (tdbb, fld->fld_source_rel_field .first ). unsafePointer () ;
1071910726
1072010727 fb_assert (relation);
1072110728 if (!relation)
0 commit comments