[
https://issues.apache.org/jira/browse/FLINK-16414?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Terry Wang updated FLINK-16414:
-------------------------------
Description:
When using TableEnvironment#sqlupdate to create a udaf or udtf function, which
doesn't override the getResultType() method, it's normal. But when using this
function in later insert sql, some exception like following will be throwed:
Exception in thread "main" org.apache.flink.table.api.ValidationException: SQL
validation failed. null
at
org.apache.flink.table.planner.calcite.FlinkPlannerImpl.org$apache$flink$table$planner$calcite$FlinkPlannerImpl$$validate(FlinkPlannerImpl.scala:130)
at
org.apache.flink.table.planner.calcite.FlinkPlannerImpl.validate(FlinkPlannerImpl.scala:105)
at
org.apache.flink.table.planner.operations.SqlToOperationConverter.convert(SqlToOperationConverter.java:127)
at
org.apache.flink.table.planner.operations.SqlToOperationConverter.convertSqlInsert(SqlToOperationConverter.java:342)
at
org.apache.flink.table.planner.operations.SqlToOperationConverter.convert(SqlToOperationConverter.java:142)
at
org.apache.flink.table.planner.delegation.ParserImpl.parse(ParserImpl.java:66)
at
org.apache.flink.table.api.internal.TableEnvironmentImpl.sqlUpdate(TableEnvironmentImpl.java:484)
The reason is in FunctionDefinitionUtil#createFunctionDefinition, we shouldn't
direct call t.getResultType or a.getAccumulatorType() or a.getResultType() but
using UserDefinedFunctionHelper#getReturnTypeOfTableFunction
UserDefinedFunctionHelper#getAccumulatorTypeOfAggregateFunction
UserDefinedFunctionHelper#getReturnTypeOfAggregateFunction instead.
```
if (udf instanceof ScalarFunction) {
return new ScalarFunctionDefinition(
name,
(ScalarFunction) udf
);
} else if (udf instanceof TableFunction) {
TableFunction t = (TableFunction) udf;
return new TableFunctionDefinition(
name,
t,
t.getResultType()
);
} else if (udf instanceof AggregateFunction) {
AggregateFunction a = (AggregateFunction) udf;
return new AggregateFunctionDefinition(
name,
a,
a.getAccumulatorType(),
a.getResultType()
);
} else if (udf instanceof TableAggregateFunction) {
TableAggregateFunction a = (TableAggregateFunction) udf;
return new TableAggregateFunctionDefinition(
name,
a,
a.getAccumulatorType(),
a.getResultType()
);
```
was:
When using TableEnvironment.sqlupdate() to create a udaf or udtf function, if
the function doesn't override the getResultType() method, it's normal. But when
using this function in the insert sql, some exception like following will be
throwed:
Exception in thread "main" org.apache.flink.table.api.ValidationException: SQL
validation failed. null
at
org.apache.flink.table.planner.calcite.FlinkPlannerImpl.org$apache$flink$table$planner$calcite$FlinkPlannerImpl$$validate(FlinkPlannerImpl.scala:130)
at
org.apache.flink.table.planner.calcite.FlinkPlannerImpl.validate(FlinkPlannerImpl.scala:105)
at
org.apache.flink.table.planner.operations.SqlToOperationConverter.convert(SqlToOperationConverter.java:127)
at
org.apache.flink.table.planner.operations.SqlToOperationConverter.convertSqlInsert(SqlToOperationConverter.java:342)
at
org.apache.flink.table.planner.operations.SqlToOperationConverter.convert(SqlToOperationConverter.java:142)
at
org.apache.flink.table.planner.delegation.ParserImpl.parse(ParserImpl.java:66)
at
org.apache.flink.table.api.internal.TableEnvironmentImpl.sqlUpdate(TableEnvironmentImpl.java:484)
The reason is in FunctionDefinitionUtil#createFunctionDefinition, we shouldn't
direct call t.getResultType or a.getAccumulatorType() or a.getResultType() but
using UserDefinedFunctionHelper#getReturnTypeOfTableFunction
UserDefinedFunctionHelper#getAccumulatorTypeOfAggregateFunction
UserDefinedFunctionHelper#getReturnTypeOfAggregateFunction instead.
```
if (udf instanceof ScalarFunction) {
return new ScalarFunctionDefinition(
name,
(ScalarFunction) udf
);
} else if (udf instanceof TableFunction) {
TableFunction t = (TableFunction) udf;
return new TableFunctionDefinition(
name,
t,
t.getResultType()
);
} else if (udf instanceof AggregateFunction) {
AggregateFunction a = (AggregateFunction) udf;
return new AggregateFunctionDefinition(
name,
a,
a.getAccumulatorType(),
a.getResultType()
);
} else if (udf instanceof TableAggregateFunction) {
TableAggregateFunction a = (TableAggregateFunction) udf;
return new TableAggregateFunctionDefinition(
name,
a,
a.getAccumulatorType(),
a.getResultType()
);
```
> create udaf/udtf function using sql casuing ValidationException: SQL
> validation failed. null
> --------------------------------------------------------------------------------------------
>
> Key: FLINK-16414
> URL: https://issues.apache.org/jira/browse/FLINK-16414
> Project: Flink
> Issue Type: Bug
> Components: Table SQL / API
> Affects Versions: 1.10.0
> Reporter: Terry Wang
> Priority: Critical
>
> When using TableEnvironment#sqlupdate to create a udaf or udtf function,
> which doesn't override the getResultType() method, it's normal. But when
> using this function in later insert sql, some exception like following will
> be throwed:
> Exception in thread "main" org.apache.flink.table.api.ValidationException:
> SQL validation failed. null
> at
> org.apache.flink.table.planner.calcite.FlinkPlannerImpl.org$apache$flink$table$planner$calcite$FlinkPlannerImpl$$validate(FlinkPlannerImpl.scala:130)
> at
> org.apache.flink.table.planner.calcite.FlinkPlannerImpl.validate(FlinkPlannerImpl.scala:105)
> at
> org.apache.flink.table.planner.operations.SqlToOperationConverter.convert(SqlToOperationConverter.java:127)
> at
> org.apache.flink.table.planner.operations.SqlToOperationConverter.convertSqlInsert(SqlToOperationConverter.java:342)
> at
> org.apache.flink.table.planner.operations.SqlToOperationConverter.convert(SqlToOperationConverter.java:142)
> at
> org.apache.flink.table.planner.delegation.ParserImpl.parse(ParserImpl.java:66)
> at
> org.apache.flink.table.api.internal.TableEnvironmentImpl.sqlUpdate(TableEnvironmentImpl.java:484)
> The reason is in FunctionDefinitionUtil#createFunctionDefinition, we
> shouldn't direct call t.getResultType or a.getAccumulatorType() or
> a.getResultType() but using
> UserDefinedFunctionHelper#getReturnTypeOfTableFunction
> UserDefinedFunctionHelper#getAccumulatorTypeOfAggregateFunction
> UserDefinedFunctionHelper#getReturnTypeOfAggregateFunction instead.
> ```
> if (udf instanceof ScalarFunction) {
> return new ScalarFunctionDefinition(
> name,
> (ScalarFunction) udf
> );
> } else if (udf instanceof TableFunction) {
> TableFunction t = (TableFunction) udf;
> return new TableFunctionDefinition(
> name,
> t,
> t.getResultType()
> );
> } else if (udf instanceof AggregateFunction) {
> AggregateFunction a = (AggregateFunction) udf;
> return new AggregateFunctionDefinition(
> name,
> a,
> a.getAccumulatorType(),
> a.getResultType()
> );
> } else if (udf instanceof TableAggregateFunction) {
> TableAggregateFunction a = (TableAggregateFunction) udf;
> return new TableAggregateFunctionDefinition(
> name,
> a,
> a.getAccumulatorType(),
> a.getResultType()
> );
> ```
--
This message was sent by Atlassian Jira
(v8.3.4#803005)