From 16475abb9ae7d171b550a74db872e6381f74d721 Mon Sep 17 00:00:00 2001 From: Nathan Bezualem Date: Tue, 7 Apr 2026 19:52:44 -0400 Subject: [PATCH 1/3] Add clear_all_ranges to metadata push decoder --- parquet/src/file/metadata/push_decoder.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/parquet/src/file/metadata/push_decoder.rs b/parquet/src/file/metadata/push_decoder.rs index e322525b7193..7e4beb5ad9c2 100644 --- a/parquet/src/file/metadata/push_decoder.rs +++ b/parquet/src/file/metadata/push_decoder.rs @@ -358,6 +358,11 @@ impl ParquetMetaDataPushDecoder { Ok(()) } + /// Clear any staged byte ranges currently buffered for future decode work. + pub fn clear_all_ranges(&mut self) { + self.buffers.clear_all_ranges(); + } + /// Try to decode the metadata from the pushed data, returning the /// decoded metadata or an error if not enough data is available. pub fn try_decode(&mut self) -> Result> { @@ -573,6 +578,23 @@ mod tests { assert!(metadata.offset_index().is_some()); } + #[test] + fn test_metadata_decoder_clear_all_ranges() { + let file_len = test_file_len(); + let mut metadata_decoder = ParquetMetaDataPushDecoder::try_new(file_len).unwrap(); + + metadata_decoder + .push_range(test_file_range(), TEST_FILE_DATA.clone()) + .unwrap(); + assert_eq!(metadata_decoder.buffers.buffered_bytes(), test_file_len()); + + metadata_decoder.clear_all_ranges(); + assert_eq!(metadata_decoder.buffers.buffered_bytes(), 0); + + let ranges = expect_needs_data(metadata_decoder.try_decode()); + assert_eq!(ranges, vec![test_file_len() - 8..test_file_len()]); + } + /// Decode the metadata incrementally, simulating a scenario where exactly the data needed /// is read in each step #[test] From dfbcb709893fa461f4e5f52caa49c4c6229247ca Mon Sep 17 00:00:00 2001 From: Nathan Bezualem Date: Tue, 7 Apr 2026 20:36:59 -0400 Subject: [PATCH 2/3] . From bb03505aee13ca854241e2e6686273397b3abdde Mon Sep 17 00:00:00 2001 From: Nathan Bezualem Date: Tue, 7 Apr 2026 20:40:04 -0400 Subject: [PATCH 3/3] Fix clear_all_ranges feature gating --- parquet/src/util/push_buffers.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/parquet/src/util/push_buffers.rs b/parquet/src/util/push_buffers.rs index eb4982fb3c6f..b8225ab3a1db 100644 --- a/parquet/src/util/push_buffers.rs +++ b/parquet/src/util/push_buffers.rs @@ -156,7 +156,6 @@ impl PushBuffers { } /// Clear all buffered ranges and their corresponding data - #[cfg(feature = "arrow")] pub fn clear_all_ranges(&mut self) { self.ranges.clear(); self.buffers.clear();