@@ -706,4 +706,46 @@ TEST_F(FieldMappingReaderTest, TestSchemaEvolutionWithDictType) {
706706 partition, expected_array);
707707}
708708
709+ TEST_F (FieldMappingReaderTest, TestReadWithSchemaEvolutionRenameCombinedCast) {
710+ // Test all 4 combinations of rename × cast:
711+ // f0: no rename, no cast (utf8 → utf8, name unchanged)
712+ // f1: rename only (int32 → int32, f1 → new_f1)
713+ // f2: cast only (int32 → utf8, name unchanged)
714+ // f3: rename + cast (int32 → utf8, f3 → new_f2)
715+ std::vector<DataField> data_fields = {
716+ DataField (0 , arrow::field (" f0" , arrow::utf8 ())),
717+ DataField (1 , arrow::field (" f1" , arrow::int32 ())),
718+ DataField (2 , arrow::field (" f2" , arrow::int32 ())),
719+ DataField (3 , arrow::field (" f3" , arrow::int32 ())),
720+ };
721+ auto data_schema = DataField::ConvertDataFieldsToArrowSchema (data_fields);
722+ auto data_array = std::dynamic_pointer_cast<arrow::StructArray>(
723+ arrow::ipc::internal::json::ArrayFromJSON (arrow::struct_ (data_schema->fields ()),
724+ R"( [
725+ ["Bob", 100, 10, 1],
726+ ["Emily", 200, 20, 2],
727+ ["Alice", 300, 30, 3]
728+ ])" )
729+ .ValueOrDie ());
730+
731+ std::vector<DataField> read_fields = {
732+ DataField (0 , arrow::field (" f0" , arrow::utf8 ())),
733+ DataField (1 , arrow::field (" new_f1" , arrow::int32 ())),
734+ DataField (2 , arrow::field (" f2" , arrow::utf8 ())),
735+ DataField (3 , arrow::field (" new_f3" , arrow::utf8 ())),
736+ };
737+ auto read_schema = DataField::ConvertDataFieldsToArrowSchema (read_fields);
738+
739+ auto expected = std::dynamic_pointer_cast<arrow::StructArray>(
740+ arrow::ipc::internal::json::ArrayFromJSON (arrow::struct_ (read_schema->fields ()),
741+ R"( [
742+ ["Bob", 100, "10", "1"],
743+ ["Emily", 200, "20", "2"],
744+ ["Alice", 300, "30", "3"]
745+ ])" )
746+ .ValueOrDie ());
747+
748+ CheckResult (data_schema, data_array, read_schema, /* predicate=*/ nullptr ,
749+ /* partition_keys=*/ {}, BinaryRow::EmptyRow (), expected);
750+ }
709751} // namespace paimon::test
0 commit comments