@@ -813,11 +813,17 @@ Status ParquetFileFragment::EnsureCompleteMetadata(parquet::arrow::FileReader* r
813
813
814
814
Status ParquetFileFragment::SetMetadata (
815
815
std::shared_ptr<parquet::FileMetaData> metadata,
816
- std::shared_ptr<parquet::arrow::SchemaManifest> manifest) {
816
+ std::shared_ptr<parquet::arrow::SchemaManifest> manifest,
817
+ std::shared_ptr<parquet::FileMetaData> original_metadata) {
817
818
DCHECK (row_groups_.has_value ());
818
819
819
820
metadata_ = std::move (metadata);
820
821
manifest_ = std::move (manifest);
822
+ original_metadata_ = original_metadata ? std::move (original_metadata) : metadata_;
823
+ // The SchemaDescriptor needs to be owned by a FileMetaData instance,
824
+ // because SchemaManifest only stores a raw pointer (GH-39562).
825
+ DCHECK_EQ (manifest_->descr , original_metadata_->schema ())
826
+ << " SchemaDescriptor should be owned by the original FileMetaData" ;
821
827
822
828
statistics_expressions_.resize (row_groups_->size (), compute::literal (true ));
823
829
statistics_expressions_complete_.resize (manifest_->descr ->num_columns (), false );
@@ -846,7 +852,8 @@ Result<FragmentVector> ParquetFileFragment::SplitByRowGroup(
846
852
parquet_format_.MakeFragment (source_, partition_expression (),
847
853
physical_schema_, {row_group}));
848
854
849
- RETURN_NOT_OK (fragment->SetMetadata (metadata_, manifest_));
855
+ RETURN_NOT_OK (fragment->SetMetadata (metadata_, manifest_,
856
+ /* original_metadata=*/ original_metadata_));
850
857
fragments[i++] = std::move (fragment);
851
858
}
852
859
@@ -1106,7 +1113,8 @@ ParquetDatasetFactory::CollectParquetFragments(const Partitioning& partitioning)
1106
1113
format_->MakeFragment ({path, filesystem_}, std::move (partition_expression),
1107
1114
physical_schema_, std::move (row_groups)));
1108
1115
1109
- RETURN_NOT_OK (fragment->SetMetadata (metadata_subset, manifest_));
1116
+ RETURN_NOT_OK (fragment->SetMetadata (metadata_subset, manifest_,
1117
+ /* original_metadata=*/ metadata_));
1110
1118
fragments[i++] = std::move (fragment);
1111
1119
}
1112
1120
0 commit comments