@@ -586,8 +586,10 @@ CompareDescriptorStructure(const ROOT::RNTupleDescriptor &dst, const ROOT::RNTup
586586}
587587
588588// Applies late model extension to `destination`, adding all `newFields` to it.
589- static void ExtendDestinationModel (std::span<const ROOT::RFieldDescriptor *> newFields, ROOT::RNTupleModel &dstModel,
590- RNTupleMergeData &mergeData, std::vector<RCommonField> &commonFields)
589+ [[nodiscard]]
590+ static ROOT::RResult<void >
591+ ExtendDestinationModel (std::span<const ROOT::RFieldDescriptor *> newFields, ROOT::RNTupleModel &dstModel,
592+ RNTupleMergeData &mergeData, std::vector<RCommonField> &commonFields)
591593{
592594 assert (newFields.size () > 0 ); // no point in calling this with 0 new cols
593595
@@ -636,14 +638,20 @@ static void ExtendDestinationModel(std::span<const ROOT::RFieldDescriptor *> new
636638 ROOT::Internal::GetProjectedFieldsOfModel (dstModel).Add (std::move (field), fieldMap);
637639 }
638640 dstModel.Freeze ();
639- mergeData.fDestination .UpdateSchema (changeset, mergeData.fNumDstEntries );
641+ try {
642+ mergeData.fDestination .UpdateSchema (changeset, mergeData.fNumDstEntries );
643+ } catch (const ROOT::RException &ex) {
644+ return R__FAIL (ex.GetError ().GetReport ());
645+ }
640646
641647 commonFields.reserve (commonFields.size () + newFields.size ());
642648 for (const auto *field : newFields) {
643649 const auto newFieldInDstId = mergeData.fDstDescriptor .FindFieldId (field->GetFieldName ());
644650 const auto &newFieldInDst = mergeData.fDstDescriptor .GetFieldDescriptor (newFieldInDstId);
645651 commonFields.emplace_back (*field, newFieldInDst);
646652 }
653+
654+ return ROOT::RResult<void >::Success ();
647655}
648656
649657// Generates default (zero) values for the given columns
@@ -1184,7 +1192,9 @@ ROOT::RResult<void> RNTupleMerger::Merge(std::span<RPageSource *> sources, const
11841192 if (descCmp.fExtraSrcFields .size ()) {
11851193 if (mergeOpts.fMergingMode == ENTupleMergingMode::kUnion ) {
11861194 // late model extension for all fExtraSrcFields in Union mode
1187- ExtendDestinationModel (descCmp.fExtraSrcFields , *fModel , mergeData, descCmp.fCommonFields );
1195+ auto res = ExtendDestinationModel (descCmp.fExtraSrcFields , *fModel , mergeData, descCmp.fCommonFields );
1196+ if (!res)
1197+ return R__FORWARD_ERROR (res);
11881198 } else if (mergeOpts.fMergingMode == ENTupleMergingMode::kStrict ) {
11891199 // If the current source has extra fields and we're in Strict mode, error
11901200 std::string msg = " Source RNTuple has extra fields that the destination RNTuple doesn't have:" ;
0 commit comments