@@ -861,6 +861,51 @@ TEST(ParquetSchemaProjectionTest, ProjectDecimalType) {
861861 ASSERT_PROJECTED_FIELD (projection.fields [0 ], 0 );
862862}
863863
864+ TEST (ParquetSchemaProjectionTest, ProjectSmallDecimalTypes) {
865+ struct TestCase {
866+ ::parquet::Type::type physical_type;
867+ int32_t precision;
868+ ::arrow::Type::type arrow_type;
869+ };
870+ const std::array cases = {
871+ TestCase{.physical_type = ::parquet::Type::INT32 ,
872+ .precision = 9 ,
873+ .arrow_type = ::arrow::Type::DECIMAL32 },
874+ TestCase{.physical_type = ::parquet::Type::INT64 ,
875+ .precision = 18 ,
876+ .arrow_type = ::arrow::Type::DECIMAL64 },
877+ };
878+ auto properties = ::parquet::default_arrow_reader_properties ();
879+ properties.set_smallest_decimal_enabled (true );
880+
881+ for (const auto & test_case : cases) {
882+ SCOPED_TRACE (test_case.precision );
883+ auto node = ::parquet::schema::PrimitiveNode::Make (
884+ " value" , ::parquet::Repetition::REQUIRED ,
885+ ::parquet::LogicalType::Decimal (test_case.precision, 2 ), test_case.physical_type,
886+ /* primitive_length=*/ -1, /* field_id=*/ 1);
887+ ::parquet::SchemaDescriptor descriptor;
888+ descriptor.Init (MakeGroupNode (" iceberg_schema" , {node}));
889+ ::parquet::arrow::SchemaManifest manifest;
890+ ASSERT_TRUE (::parquet::arrow::SchemaManifest::Make (
891+ &descriptor, /* key_value_metadata=*/ nullptr , properties, &manifest)
892+ .ok ());
893+ ASSERT_EQ (manifest.schema_fields [0 ].field ->type ()->id (), test_case.arrow_type );
894+
895+ auto project_decimal = [&](int32_t precision, int32_t scale) {
896+ return Project (
897+ Schema ({SchemaField::MakeRequired (1 , " value" , decimal (precision, scale))}),
898+ manifest);
899+ };
900+ EXPECT_THAT (project_decimal (test_case.precision , 2 ), IsOk ());
901+ EXPECT_THAT (project_decimal (test_case.precision + 1 , 2 ), IsOk ());
902+ EXPECT_THAT (project_decimal (test_case.precision - 1 , 2 ),
903+ IsError (ErrorKind::kInvalidSchema ));
904+ EXPECT_THAT (project_decimal (test_case.precision , 3 ),
905+ IsError (ErrorKind::kInvalidSchema ));
906+ }
907+ }
908+
864909TEST (ParquetSchemaProjectionTest, ProjectDecimalIncompatible) {
865910 Schema expected_schema ({
866911 SchemaField::MakeRequired (/* field_id=*/ 1 , " value" , iceberg::decimal (18 , 3 )),
0 commit comments