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()));
}
//
--------------------------------------------------------------------------------------------