From ab00ee1bc3f3fcfae3b1d6ce51e76960b98f7748 Mon Sep 17 00:00:00 2001 From: Divjot Arora Date: Tue, 13 Oct 2026 09:56:08 +0000 Subject: [PATCH] Reject unsupported compression codecs --- cpp/src/parquet/metadata_test.cc | 21 +++++++++++++++++++++ cpp/src/parquet/thrift_internal.h | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/cpp/src/parquet/metadata_test.cc b/cpp/src/parquet/metadata_test.cc index e6ff1f929d45..ee2f0619ebf2 100644 --- a/cpp/src/parquet/metadata_test.cc +++ b/cpp/src/parquet/metadata_test.cc @@ -17,9 +17,13 @@ #include "parquet/metadata.h" +#include #include +#include + #include "arrow/util/key_value_metadata.h" +#include "parquet/exception.h" #include "parquet/file_reader.h" #include "parquet/file_writer.h" #include "parquet/schema.h" @@ -344,6 +348,23 @@ void AssertColumnChunkMinMax(const FileMetaData& metadata, } // namespace +TEST(Metadata, UnknownCompressionCodecThrows) { + format::FileMetaData thrift_metadata = SingleInt32MetadataWithStats(); + auto metadata = ParseMetadata(SerializeMetadata(thrift_metadata)); + + auto& column_chunk = thrift_metadata.row_groups.at(0).columns.at(0); + const int32_t raw_codec = 8; + static_assert(sizeof(column_chunk.meta_data.codec) == sizeof(raw_codec)); + std::memcpy(&column_chunk.meta_data.codec, &raw_codec, sizeof(raw_codec)); + + auto column = ColumnChunkMetaData::Make(&column_chunk, metadata->schema()->Column(0)); + + EXPECT_THROW_THAT([&]() { column->compression(); }, ParquetException, + ::testing::Property( + &ParquetException::what, + ::testing::HasSubstr("Unsupported compression codec value: 8"))); +} + TEST(Metadata, UnknownColumnOrderIgnoresMinMax) { format::FileMetaData thrift_metadata = SingleInt32MetadataWithStats(); // Simulate an unsupported ColumnOrder value: unknown union fields are skipped by diff --git a/cpp/src/parquet/thrift_internal.h b/cpp/src/parquet/thrift_internal.h index a74d97c1e287..5a0fc7d70e69 100644 --- a/cpp/src/parquet/thrift_internal.h +++ b/cpp/src/parquet/thrift_internal.h @@ -227,7 +227,7 @@ inline typename Compression::type LoadEnumSafe(const format::CompressionCodec::t const auto max_value = static_cast(format::CompressionCodec::LZ4_RAW); if (raw_value < min_value || raw_value > max_value) { - return Compression::UNCOMPRESSED; + throw ParquetException("Unsupported compression codec value: ", raw_value); } return FromThriftUnsafe(*in); }