Skip to content

Commit ae524e7

Browse files
authored
Fix bug in ParquetMetaDataReader and add test of suffix reads with encryption (#7372)
1 parent a35bdf0 commit ae524e7

1 file changed

Lines changed: 30 additions & 2 deletions

File tree

parquet/src/file/metadata/reader.rs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,11 @@ impl ParquetMetaDataReader {
710710
));
711711
}
712712

713-
Ok((self.decode_footer_metadata(&meta, &footer)?, None))
713+
Ok((
714+
// need to slice off the footer or decryption fails
715+
self.decode_footer_metadata(&meta.slice(0..length), &footer)?,
716+
None,
717+
))
714718
} else {
715719
let metadata_start = suffix_len - metadata_offset;
716720
let slice = &suffix[metadata_start..suffix_len - FOOTER_SIZE];
@@ -1209,7 +1213,6 @@ mod async_tests {
12091213
use std::ops::Range;
12101214
use std::sync::atomic::{AtomicUsize, Ordering};
12111215

1212-
use crate::arrow::async_reader::MetadataFetch;
12131216
use crate::file::reader::Length;
12141217
use crate::util::test_common::file_util::get_test_file;
12151218

@@ -1435,6 +1438,31 @@ mod async_tests {
14351438
assert_eq!(suffix_fetch_count.load(Ordering::SeqCst), 1);
14361439
}
14371440

1441+
#[cfg(feature = "encryption")]
1442+
#[tokio::test]
1443+
async fn test_suffix_with_encryption() {
1444+
let mut file = get_test_file("uniform_encryption.parquet.encrypted");
1445+
let mut file2 = file.try_clone().unwrap();
1446+
1447+
let mut fetch = |range| futures::future::ready(read_range(&mut file, range));
1448+
let mut suffix_fetch = |suffix| futures::future::ready(read_suffix(&mut file2, suffix));
1449+
1450+
let input = MetadataSuffixFetchFn(&mut fetch, &mut suffix_fetch);
1451+
1452+
let key_code: &[u8] = "0123456789012345".as_bytes();
1453+
let decryption_properties = FileDecryptionProperties::builder(key_code.to_vec())
1454+
.build()
1455+
.unwrap();
1456+
1457+
// just make sure the metadata is properly decrypted and read
1458+
let expected = ParquetMetaDataReader::new()
1459+
.with_decryption_properties(Some(&decryption_properties))
1460+
.load_via_suffix_and_finish(input)
1461+
.await
1462+
.unwrap();
1463+
assert_eq!(expected.num_row_groups(), 1);
1464+
}
1465+
14381466
#[tokio::test]
14391467
async fn test_page_index() {
14401468
let mut file = get_test_file("alltypes_tiny_pages.parquet");

0 commit comments

Comments
 (0)