@@ -392,6 +392,24 @@ void ROOT::Internal::RPageSource::UpdateLastUsedCluster(ROOT::DescriptorId_t clu
392392 fLastUsedCluster = clusterId;
393393}
394394
395+ ROOT ::Internal::RPageRef
396+ ROOT ::Internal::RPageSource::LoadZeroPage(ColumnHandle_t columnHandle, const RPageSummary &pageSummary)
397+ {
398+ const auto &pageInfo = pageSummary.fPageInfo ;
399+ assert (pageInfo.GetLocator ().GetType () == RNTupleLocator::kTypePageZero );
400+
401+ const auto element = columnHandle.fColumn ->GetElement ();
402+ const auto elementSize = element->GetSize ();
403+ const auto elementInMemoryType = element->GetIdentifier ().fInMemoryType ;
404+
405+ auto pageZero = fPageAllocator ->NewPage (elementSize, pageInfo.GetNElements ());
406+ pageZero.GrowUnchecked (pageInfo.GetNElements ());
407+ std::memset (pageZero.GetBuffer (), 0 , pageZero.GetNBytes ());
408+ pageZero.SetWindow (pageSummary.fColumnOffset + pageInfo.GetFirstElementIndex (),
409+ RPage::RClusterInfo (pageSummary.fClusterId , pageSummary.fColumnOffset ));
410+ return fPagePool .RegisterPage (std::move (pageZero), RPagePool::RKey{columnHandle.fPhysicalId , elementInMemoryType});
411+ }
412+
395413ROOT ::Internal::RPageRef
396414ROOT ::Internal::RPageSource::LoadPage(ColumnHandle_t columnHandle, ROOT ::NTupleSize_t globalIndex)
397415{
@@ -422,8 +440,11 @@ ROOT::Internal::RPageSource::LoadPage(ColumnHandle_t columnHandle, ROOT::NTupleS
422440 pageSummary.fPageInfo = clusterDescriptor.GetPageRange (columnId).Find (globalIndex - pageSummary.fColumnOffset );
423441 }
424442
425- if (pageSummary.fPageInfo .GetLocator ().GetType () == RNTupleLocator::kTypeUnknown )
443+ if (pageSummary.fPageInfo .GetLocator ().GetType () == RNTupleLocator::kTypeUnknown ) {
426444 throw RException (R__FAIL (" tried to read a page with an unknown locator" ));
445+ } else if (pageSummary.fPageInfo .GetLocator ().GetType () == RNTupleLocator::kTypePageZero ) {
446+ return LoadZeroPage (columnHandle, pageSummary);
447+ }
427448
428449 UpdateLastUsedCluster (pageSummary.fClusterId );
429450 return LoadPageImpl (columnHandle, pageSummary);
@@ -458,8 +479,11 @@ ROOT::Internal::RPageSource::LoadPage(ColumnHandle_t columnHandle, RNTupleLocalI
458479 pageSummary.fPageInfo = clusterDescriptor.GetPageRange (columnId).Find (localIndex.GetIndexInCluster ());
459480 }
460481
461- if (pageSummary.fPageInfo .GetLocator ().GetType () == RNTupleLocator::kTypeUnknown )
482+ if (pageSummary.fPageInfo .GetLocator ().GetType () == RNTupleLocator::kTypeUnknown ) {
462483 throw RException (R__FAIL (" tried to read a page with an unknown locator" ));
484+ } else if (pageSummary.fPageInfo .GetLocator ().GetType () == RNTupleLocator::kTypePageZero ) {
485+ return LoadZeroPage (columnHandle, pageSummary);
486+ }
463487
464488 UpdateLastUsedCluster (clusterId);
465489 return LoadPageImpl (columnHandle, pageSummary);
0 commit comments