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);
}