From 39dafb80f646ec2b8961184028c7399d6c0b5923 Mon Sep 17 00:00:00 2001 From: misi Date: Thu, 30 Oct 2025 15:11:47 +0800 Subject: [PATCH] [improve] reslove issue 9973 --- .../transform/sql/zeta/ZetaSQLFunction.java | 3 +++ .../transform/sql/zeta/CastFunctionTest.java | 26 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java index 79e5c3b1ecd..985aed65a17 100644 --- a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java +++ b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java @@ -340,6 +340,9 @@ public Object computeForValue(Expression expression, Object[] inputFields) { } parDataType = ((SeaTunnelRowType) parDataType).getFieldType(idx); res = parRowValues.getFields()[idx]; + if (res == null) { + return null; + } } return res; } diff --git a/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/CastFunctionTest.java b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/CastFunctionTest.java index b5c5ae377e0..5258a76b17a 100644 --- a/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/CastFunctionTest.java +++ b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/CastFunctionTest.java @@ -18,6 +18,7 @@ package org.apache.seatunnel.transform.sql.zeta; import org.apache.seatunnel.api.table.type.BasicType; +import org.apache.seatunnel.api.table.type.MapType; import org.apache.seatunnel.api.table.type.SeaTunnelDataType; import org.apache.seatunnel.api.table.type.SeaTunnelRow; import org.apache.seatunnel.api.table.type.SeaTunnelRowType; @@ -54,4 +55,29 @@ public void testCastFunction() { Assertions.assertEquals(Byte.parseByte("1"), f2Object); Assertions.assertEquals(Short.parseShort("1"), f3Object); } + + @Test + public void testCastFunctionWithNullNestedField() { + SQLEngine sqlEngine = SQLEngineFactory.getSQLEngine(SQLEngineFactory.EngineType.ZETA); + + SeaTunnelRowType rowType = + new SeaTunnelRowType( + new String[] {"user"}, + new SeaTunnelDataType[] { + new MapType<>(BasicType.STRING_TYPE, BasicType.STRING_TYPE) + }); + + SeaTunnelRow inputRow = new SeaTunnelRow(new Object[] {null}); + + sqlEngine.init("test", null, rowType, "select user.address as address from test"); + + SeaTunnelRowType outRowType = sqlEngine.typeMapping(null); + + SeaTunnelRow outRow = sqlEngine.transformBySQL(inputRow, outRowType).get(0); + + Object addressField = outRow.getField(0); + Assertions.assertNull( + addressField, + "When casting nested field where intermediate value is null, result should be null"); + } }