Skip to content

Commit 3a7de46

Browse files
committed
tmp
1 parent e2ebc45 commit 3a7de46

File tree

3 files changed

+48
-28
lines changed

3 files changed

+48
-28
lines changed

parquet/src/column/writer/mod.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1353,19 +1353,25 @@ impl<'a, E: ColumnValueEncoder> GenericColumnWriter<'a, E> {
13531353
builder: ColumnChunkMetaDataBuilder,
13541354
) -> ColumnChunkMetaDataBuilder {
13551355
if let Some(encryption_properties) = self.props.file_encryption_properties.as_ref() {
1356+
let column_crypto_metadata = get_column_crypto_metadata(
1357+
encryption_properties,
1358+
&self.descr,
1359+
);
1360+
13561361
if encryption_properties.encrypt_footer() {
1362+
// Encrypted footer: clear statistics from plaintext metadata
13571363
builder
1358-
.set_column_crypto_metadata(get_column_crypto_metadata(
1359-
encryption_properties,
1360-
&self.descr,
1361-
))
1362-
.clear_statistics()
1364+
.set_column_crypto_metadata(column_crypto_metadata)
1365+
.clear_statistics()
13631366
} else {
1364-
builder
1365-
.set_column_crypto_metadata(get_column_crypto_metadata(
1366-
encryption_properties,
1367-
&self.descr,
1368-
))
1367+
// Plaintext footer: clear statistics if column is encrypted
1368+
let builder = builder.set_column_crypto_metadata(column_crypto_metadata.clone());
1369+
if column_crypto_metadata.is_some() {
1370+
// Column is encrypted, strip statistics from plaintext metadata
1371+
builder.clear_statistics()
1372+
} else {
1373+
builder
1374+
}
13691375
}
13701376
} else {
13711377
builder

parquet/src/file/metadata/writer.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,7 @@ impl MetadataObjectWriter {
632632
Some(file_encryptor) => {
633633
let unencrypted_row_groups = row_groups.clone();
634634
// TODO: unencrypted_row_groups should not contain statistics for encrypted columns
635+
635636
let encrypted_row_groups = Self::encrypt_row_groups(row_groups, file_encryptor)?;
636637
Ok((encrypted_row_groups, Some(unencrypted_row_groups)))
637638
}
@@ -783,6 +784,17 @@ impl MetadataObjectWriter {
783784
let ciphertext = column_encryptor.encrypt(&buffer, &aad)?;
784785

785786
column_chunk.encrypted_column_metadata = Some(ciphertext);
787+
788+
// For plaintext footer mode: strip statistics and encoding_stats from plaintext metadata
789+
// These are available in the encrypted_column_metadata for readers with the column key
790+
if !file_encryptor.properties().encrypt_footer() {
791+
column_chunk.statistics = None;
792+
// column_chunk.page_encoding_stats = None;
793+
// return Ok(ColumnChunkMetaData {
794+
// statistics: None,
795+
// ..column_chunk
796+
// })
797+
}
786798
}
787799
}
788800

parquet/tests/encryption/encryption.rs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -765,15 +765,16 @@ pub fn test_row_group_statistics_plaintext_encrypted_write() {
765765

766766
let row_group = &metadata.row_groups()[0];
767767
assert_eq!(row_group.columns().len(), 1);
768-
let column_stats = &row_group.columns()[0].statistics().unwrap();
769-
assert_eq!(
770-
column_stats.min_bytes_opt(),
771-
Some(3i32.to_le_bytes().as_slice())
772-
);
773-
assert_eq!(
774-
column_stats.max_bytes_opt(),
775-
Some(19i32.to_le_bytes().as_slice())
776-
);
768+
assert!(&row_group.columns()[0].statistics().is_none());
769+
// let column_stats = &row_group.columns()[0].statistics().unwrap();
770+
// assert_eq!(
771+
// column_stats.min_bytes_opt(),
772+
// Some(3i32.to_le_bytes().as_slice())
773+
// );
774+
// assert_eq!(
775+
// column_stats.max_bytes_opt(),
776+
// Some(19i32.to_le_bytes().as_slice())
777+
// );
777778

778779
// TODO: statistics shouldn't be available without decryption when footer is plaintext
779780
//
@@ -786,15 +787,16 @@ pub fn test_row_group_statistics_plaintext_encrypted_write() {
786787

787788
let row_group = &metadata.row_groups()[0];
788789
assert_eq!(row_group.columns().len(), 1);
789-
let column_stats = &row_group.columns()[0].statistics().unwrap();
790-
assert_eq!(
791-
column_stats.min_bytes_opt(),
792-
Some(3i32.to_le_bytes().as_slice())
793-
);
794-
assert_eq!(
795-
column_stats.max_bytes_opt(),
796-
Some(19i32.to_le_bytes().as_slice())
797-
);
790+
assert!(&row_group.columns()[0].statistics().is_none());
791+
// let column_stats = &row_group.columns()[0].statistics().unwrap();
792+
// assert_eq!(
793+
// column_stats.min_bytes_opt(),
794+
// Some(3i32.to_le_bytes().as_slice())
795+
// );
796+
// assert_eq!(
797+
// column_stats.max_bytes_opt(),
798+
// Some(19i32.to_le_bytes().as_slice())
799+
// );
798800

799801
let builder =
800802
ParquetRecordBatchReaderBuilder::try_new_with_options(temp_file, options).unwrap();

0 commit comments

Comments
 (0)