From 58d0874fc9d7a37c02ed02cdbb8ebd4b74f1ee62 Mon Sep 17 00:00:00 2001 From: lxy264173 Date: Wed, 20 May 2026 11:09:11 +0800 Subject: [PATCH 1/2] refactor: refactor FieldMappingReader and add tests --- src/paimon/core/io/field_mapping_reader.cpp | 2 +- .../core/io/field_mapping_reader_test.cpp | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/paimon/core/io/field_mapping_reader.cpp b/src/paimon/core/io/field_mapping_reader.cpp index 4125c82a1..fdb88c653 100644 --- a/src/paimon/core/io/field_mapping_reader.cpp +++ b/src/paimon/core/io/field_mapping_reader.cpp @@ -107,7 +107,7 @@ Result> FieldMappingReader::CastNonPartitionArrayI single_column_array, non_partition_info_.non_partition_read_schema[i].Type(), arrow_pool_.get())); casted_array.push_back(casted); - casted_field_names.push_back(non_partition_info_.non_partition_read_schema[i].Name()); + casted_field_names.push_back(non_partition_info_.non_partition_data_schema[i].Name()); } else { // read and data type may both be string type, but after adapter transform, type may be // dictionary, need reconstruct struct type diff --git a/src/paimon/core/io/field_mapping_reader_test.cpp b/src/paimon/core/io/field_mapping_reader_test.cpp index 17cef91a6..53f0c0d0a 100644 --- a/src/paimon/core/io/field_mapping_reader_test.cpp +++ b/src/paimon/core/io/field_mapping_reader_test.cpp @@ -706,4 +706,46 @@ TEST_F(FieldMappingReaderTest, TestSchemaEvolutionWithDictType) { partition, expected_array); } +TEST_F(FieldMappingReaderTest, TestReadWithSchemaEvolutionRenameCombinedCast) { + // Test all 4 combinations of rename × cast: + // f0: no rename, no cast (utf8 → utf8, name unchanged) + // f1: rename only (int32 → int32, f1 → new_f1) + // f2: cast only (int32 → utf8, name unchanged) + // f3: rename + cast (int32 → utf8, f3 → new_f2) + std::vector data_fields = { + DataField(0, arrow::field("f0", arrow::utf8())), + DataField(1, arrow::field("f1", arrow::int32())), + DataField(2, arrow::field("f2", arrow::int32())), + DataField(3, arrow::field("f3", arrow::int32())), + }; + auto data_schema = DataField::ConvertDataFieldsToArrowSchema(data_fields); + auto data_array = std::dynamic_pointer_cast( + arrow::ipc::internal::json::ArrayFromJSON(arrow::struct_(data_schema->fields()), + R"([ + ["Bob", 100, 10, 1], + ["Emily", 200, 20, 2], + ["Alice", 300, 30, 3] + ])") + .ValueOrDie()); + + std::vector read_fields = { + DataField(0, arrow::field("f0", arrow::utf8())), + DataField(1, arrow::field("new_f1", arrow::int32())), + DataField(2, arrow::field("f2", arrow::utf8())), + DataField(3, arrow::field("new_f3", arrow::utf8())), + }; + auto read_schema = DataField::ConvertDataFieldsToArrowSchema(read_fields); + + auto expected = std::dynamic_pointer_cast( + arrow::ipc::internal::json::ArrayFromJSON(arrow::struct_(read_schema->fields()), + R"([ + ["Bob", 100, "10", "1"], + ["Emily", 200, "20", "2"], + ["Alice", 300, "30", "3"] + ])") + .ValueOrDie()); + + CheckResult(data_schema, data_array, read_schema, /*predicate=*/nullptr, + /*partition_keys=*/{}, BinaryRow::EmptyRow(), expected); +} } // namespace paimon::test From 7d572f873dafd268b0e38c26dd956e3e5d5671cf Mon Sep 17 00:00:00 2001 From: lxy264173 Date: Wed, 20 May 2026 11:35:58 +0800 Subject: [PATCH 2/2] fix inner --- src/paimon/common/data/blob_defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/paimon/common/data/blob_defs.h b/src/paimon/common/data/blob_defs.h index ba595cdfd..7e3ebe94f 100644 --- a/src/paimon/common/data/blob_defs.h +++ b/src/paimon/common/data/blob_defs.h @@ -33,7 +33,7 @@ class BlobDefs { /// To create a Blob field: /// @code /// std::unordered_map blob_metadata_map = { - /// {Blob::EXTENSION_TYPE_KEY, Blob::EXTENSION_TYPE_VALUE} + /// {Blob::kExtensionTypeKey, Blob::kExtensionTypeValue} /// }; /// auto field = arrow::field("my_blob_field", arrow::large_binary(), false, /// std::make_shared(blob_metadata_map));