This is an automated email from the ASF dual-hosted git repository.

gyfora pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new 40d486e2b64 [FLINK-40264][format/avro] Propagate 
legacyTimestampMapping into nested row converters
40d486e2b64 is described below

commit 40d486e2b6465680ed93305ebc51bcc87b26b995
Author: Pritam Kumar Mishra <[email protected]>
AuthorDate: Wed Jul 29 22:38:43 2026 +0530

    [FLINK-40264][format/avro] Propagate legacyTimestampMapping into nested row 
converters
    
    AvroToRowDataConverters#createConverter dispatched nested ROW types to the
    single-argument createRowConverter overload, which always assumes the legacy
    timestamp mapping. As a result a nested TIMESTAMP_LTZ column failed with
    'Unsupported type: TIMESTAMP_LTZ' even when the non-legacy mapping was
    requested, because only the non-legacy mapping supports that type.
---
 .../formats/avro/AvroToRowDataConverters.java      |  2 +-
 .../avro/AvroRowDataDeSerializationSchemaTest.java | 40 ++++++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletion(-)

diff --git 
a/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/AvroToRowDataConverters.java
 
b/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/AvroToRowDataConverters.java
index 9c63c56c4dc..97a57c1d9f0 100644
--- 
a/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/AvroToRowDataConverters.java
+++ 
b/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/AvroToRowDataConverters.java
@@ -146,7 +146,7 @@ public class AvroToRowDataConverters {
             case ARRAY:
                 return createArrayConverter((ArrayType) type, 
legacyTimestampMapping);
             case ROW:
-                return createRowConverter((RowType) type);
+                return createRowConverter((RowType) type, 
legacyTimestampMapping);
             case MAP:
             case MULTISET:
                 return createMapConverter(type, legacyTimestampMapping);
diff --git 
a/flink-formats/flink-avro/src/test/java/org/apache/flink/formats/avro/AvroRowDataDeSerializationSchemaTest.java
 
b/flink-formats/flink-avro/src/test/java/org/apache/flink/formats/avro/AvroRowDataDeSerializationSchemaTest.java
index 84f9994f666..b9253504034 100644
--- 
a/flink-formats/flink-avro/src/test/java/org/apache/flink/formats/avro/AvroRowDataDeSerializationSchemaTest.java
+++ 
b/flink-formats/flink-avro/src/test/java/org/apache/flink/formats/avro/AvroRowDataDeSerializationSchemaTest.java
@@ -27,6 +27,8 @@ import 
org.apache.flink.formats.avro.typeutils.AvroSchemaConverter;
 import org.apache.flink.formats.avro.utils.AvroTestUtils;
 import org.apache.flink.table.data.GenericRowData;
 import org.apache.flink.table.data.RowData;
+import org.apache.flink.table.data.StringData;
+import org.apache.flink.table.data.TimestampData;
 import org.apache.flink.table.data.util.DataFormatConverters;
 import org.apache.flink.table.runtime.typeutils.InternalTypeInfo;
 import org.apache.flink.table.types.AtomicDataType;
@@ -80,6 +82,7 @@ import static org.apache.flink.table.api.DataTypes.SMALLINT;
 import static org.apache.flink.table.api.DataTypes.STRING;
 import static org.apache.flink.table.api.DataTypes.TIME;
 import static org.apache.flink.table.api.DataTypes.TIMESTAMP;
+import static org.apache.flink.table.api.DataTypes.TIMESTAMP_LTZ;
 import static org.apache.flink.table.api.DataTypes.TINYINT;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -402,6 +405,43 @@ class AvroRowDataDeSerializationSchemaTest {
                 .isEqualTo("1970-01-01T00:02:03.456");
     }
 
+    @Test
+    void testTimestampTypeNewMappingInNestedRow() throws Exception {
+        // TIMESTAMP_LTZ is only supported by the non-legacy mapping, so a 
nested row holding one
+        // only converts if the flag is propagated into the nested converters 
as well.
+        final DataType dataType =
+                ROW(
+                                FIELD("id", INT().notNull()),
+                                FIELD(
+                                        "nested",
+                                        ROW(
+                                                        FIELD("ltz3", 
TIMESTAMP_LTZ(3).notNull()),
+                                                        FIELD("name", 
STRING().notNull()))
+                                                .notNull()))
+                        .notNull();
+
+        AvroRowDataSerializationSchema serializationSchema =
+                createSerializationSchema(dataType, AvroEncoding.BINARY, 
false);
+        AvroRowDataDeserializationSchema deserializationSchema =
+                createDeserializationSchema(dataType, AvroEncoding.BINARY, 
false);
+
+        final GenericRowData nested = new GenericRowData(2);
+        nested.setField(0, TimestampData.fromEpochMillis(1589530213123L));
+        nested.setField(1, StringData.fromString("inner"));
+        final GenericRowData row = new GenericRowData(2);
+        row.setField(0, 7);
+        row.setField(1, nested);
+
+        RowData roundTripped =
+                
deserializationSchema.deserialize(serializationSchema.serialize(row));
+
+        assertThat(roundTripped.getInt(0)).isEqualTo(7);
+        final RowData actualNested = roundTripped.getRow(1, 2);
+        assertThat(actualNested.getTimestamp(0, 3).toInstant())
+                .isEqualTo(Instant.ofEpochMilli(1589530213123L));
+        assertThat(actualNested.getString(1).toString()).isEqualTo("inner");
+    }
+
     private AvroRowDataSerializationSchema createSerializationSchema(
             DataType dataType, AvroEncoding encoding, boolean 
legacyTimestampMapping)
             throws Exception {

Reply via email to