diff --git a/cpp/src/parquet/metadata_test.cc b/cpp/src/parquet/metadata_test.cc index e6ff1f929d4..ee2f0619ebf 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 a74d97c1e28..5a0fc7d70e6 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); }