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

snuyanzin 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 ee827dfcebf [FLINK-39253][table] Preserve field names in `ROW` 
function from `AS` aliases
ee827dfcebf is described below

commit ee827dfcebf09aad25f26782e865027e8639e04d
Author: Mika Naylor <[email protected]>
AuthorDate: Fri Apr 17 09:07:21 2026 +0200

    [FLINK-39253][table] Preserve field names in `ROW` function from `AS` 
aliases
---
 .../resolver/rules/ResolveCallByArgumentsRule.java     | 17 +++++++++++++++++
 .../flink/table/types/inference/CallContext.java       |  5 +++++
 .../types/inference/strategies/RowTypeStrategy.java    |  7 ++++++-
 .../table/types/inference/utils/CastCallContext.java   |  6 ++++++
 .../table/planner/functions/RowFunctionITCase.java     | 18 +++++++++++++++++-
 5 files changed, 51 insertions(+), 2 deletions(-)

diff --git 
a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/expressions/resolver/rules/ResolveCallByArgumentsRule.java
 
b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/expressions/resolver/rules/ResolveCallByArgumentsRule.java
index e298953f69e..2af2a97399d 100644
--- 
a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/expressions/resolver/rules/ResolveCallByArgumentsRule.java
+++ 
b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/expressions/resolver/rules/ResolveCallByArgumentsRule.java
@@ -681,6 +681,23 @@ final class ResolveCallByArgumentsRule implements 
ResolverRule {
                     .collect(Collectors.toList());
         }
 
+        @Override
+        public Optional<String> getArgumentName(int pos) {
+            final ResolvedExpression arg = getArgument(pos);
+
+            if (arg instanceof CallExpression) {
+                final CallExpression call = (CallExpression) arg;
+                if (call.getFunctionDefinition() == 
BuiltInFunctionDefinitions.AS) {
+                    final List<ResolvedExpression> children = 
call.getResolvedChildren();
+                    if (children.size() >= 2 && children.get(1) instanceof 
ValueLiteralExpression) {
+                        return ((ValueLiteralExpression) 
children.get(1)).getValueAs(String.class);
+                    }
+                }
+            }
+
+            return Optional.empty();
+        }
+
         @Override
         public Optional<DataType> getOutputDataType() {
             return Optional.empty();
diff --git 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/CallContext.java
 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/CallContext.java
index aff38de7fa7..7c987430289 100644
--- 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/CallContext.java
+++ 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/CallContext.java
@@ -113,6 +113,11 @@ public interface CallContext {
      */
     List<DataType> getArgumentDataTypes();
 
+    /** Returns the name/alias of the argument at the given position if one is 
available. */
+    default Optional<String> getArgumentName(int pos) {
+        return Optional.empty();
+    }
+
     /**
      * Returns the inferred output data type of the function call.
      *
diff --git 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/strategies/RowTypeStrategy.java
 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/strategies/RowTypeStrategy.java
index c9bedb827cd..7e631a91463 100644
--- 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/strategies/RowTypeStrategy.java
+++ 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/strategies/RowTypeStrategy.java
@@ -37,7 +37,12 @@ class RowTypeStrategy implements TypeStrategy {
         List<DataType> argumentDataTypes = callContext.getArgumentDataTypes();
         DataTypes.Field[] fields =
                 IntStream.range(0, argumentDataTypes.size())
-                        .mapToObj(idx -> DataTypes.FIELD("f" + idx, 
argumentDataTypes.get(idx)))
+                        .mapToObj(
+                                idx -> {
+                                    String fieldName =
+                                            
callContext.getArgumentName(idx).orElse("f" + idx);
+                                    return DataTypes.FIELD(fieldName, 
argumentDataTypes.get(idx));
+                                })
                         .toArray(DataTypes.Field[]::new);
 
         return Optional.of(DataTypes.ROW(fields).notNull());
diff --git 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/utils/CastCallContext.java
 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/utils/CastCallContext.java
index 9b710254847..f04055c5d5d 100644
--- 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/utils/CastCallContext.java
+++ 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/utils/CastCallContext.java
@@ -115,6 +115,12 @@ public final class CastCallContext implements CallContext {
         return expectedArguments;
     }
 
+    @Override
+    public Optional<String> getArgumentName(int pos) {
+        // argument names remain regardless of casting
+        return originalContext.getArgumentName(pos);
+    }
+
     @Override
     public Optional<DataType> getOutputDataType() {
         return Optional.ofNullable(outputDataType);
diff --git 
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/RowFunctionITCase.java
 
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/RowFunctionITCase.java
index 4e41f24a31a..be83d3d4562 100644
--- 
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/RowFunctionITCase.java
+++ 
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/RowFunctionITCase.java
@@ -115,7 +115,23 @@ class RowFunctionITCase extends BuiltInFunctionTestBase {
                                                 DataTypes.FIELD("b", 
DataTypes.TINYINT()),
                                                 DataTypes.FIELD("c", 
DataTypes.BIGINT()),
                                                 DataTypes.FIELD("d", 
DataTypes.BOOLEAN()))
-                                        .notNull()));
+                                        .notNull()),
+                TestSetSpec.forFunction(
+                                BuiltInFunctionDefinitions.ROW, "with aliased 
fields using .as()")
+                        .onFieldsWithData(100, "abc", 75.50)
+                        .andDataTypes(DataTypes.INT(), DataTypes.STRING(), 
DataTypes.DOUBLE())
+                        .testTableApiResult(
+                                row($("f0").as("a"), $("f1").as("b"), 
$("f2").as("c")),
+                                Row.of(100, "abc", 75.50),
+                                DataTypes.ROW(
+                                                DataTypes.FIELD("a", 
DataTypes.INT()),
+                                                DataTypes.FIELD("b", 
DataTypes.STRING()),
+                                                DataTypes.FIELD("c", 
DataTypes.DOUBLE()))
+                                        .notNull())
+                        .testTableApiResult(
+                                row($("f0").as("a"), $("f1").as("b"), 
$("f2").as("c")).get("a"),
+                                100,
+                                DataTypes.INT()));
     }
 
     // 
--------------------------------------------------------------------------------------------

Reply via email to