You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@flink.apache.org by "Peijian He (Jira)" <ji...@apache.org> on 2020/01/02 02:42:00 UTC
[jira] [Created] (FLINK-15452) Missing type coercion when
generating code with ScalarFunctionCallGen
Peijian He created FLINK-15452:
----------------------------------
Summary: Missing type coercion when generating code with ScalarFunctionCallGen
Key: FLINK-15452
URL: https://issues.apache.org/jira/browse/FLINK-15452
Project: Flink
Issue Type: Bug
Components: Table SQL / Planner
Affects Versions: 1.9.0
Reporter: Peijian He
Fix For: 1.9.0
I defined a UDF as follows:
{code:java}
class ScalarFunction1(val udfs: UDF1[Any, Any]) extends ScalarFunction {
def eval(t1: Any): Any = {
udfs.eval(t1)
}
override def open(context: FunctionContext): Unit = {
udfs.open()
}
override def close(): Unit = {
udfs.close()
}
override def getResultType(signature: Array[Class[_]]): typeinfo.TypeInformation[_] = {
toDataType(udfs.getReturnType)
}
}
{code}
An examples of the parameter udfs is as follows:
{code:java}
public class IsNumber extends UDF1<String, Boolean> {
@Override
public void open() {
}
@Override
public void close() {
}
@Override
public Boolean eval(String str) {
for (int i = 0; i < str.length(); i++){
if (!Character.isDigit(str.charAt(i))){
return false;
}
}
return true;
}
}{code}
In this case, function getResultType return Boolean, but I get error as follows:
{code:java}
Caused by: org.codehaus.commons.compiler.CompileException: Line 118, Column 10: Assignment conversion not possible from type "java.lang.Object" to type "java.lang.Boolean" at org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:12124) at org.codehaus.janino.UnitCompiler.assignmentConversion(UnitCompiler.java:10975) at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:2578) at org.codehaus.janino.UnitCompiler.access$2700(UnitCompiler.java:215) at org.codehaus.janino.UnitCompiler$6.visitLocalVariableDeclarationStatement(UnitCompiler.java:1503) at org.codehaus.janino.UnitCompiler$6.visitLocalVariableDeclarationStatement(UnitCompiler.java:1487) at org.codehaus.janino.Java$LocalVariableDeclarationStatement.accept(Java.java:3511) at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:1487) at org.codehaus.janino.UnitCompiler.compileStatements(UnitCompiler.java:1567) at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:3388) at org.codehaus.janino.UnitCompiler.compileDeclaredMethods(UnitCompiler.java:1357) at org.codehaus.janino.UnitCompiler.compileDeclaredMethods(UnitCompiler.java:1330) at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:822) at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:432) at org.codehaus.janino.UnitCompiler.access$400(UnitCompiler.java:215) at org.codehaus.janino.UnitCompiler$2.visitPackageMemberClassDeclaration(UnitCompiler.java:411) at org.codehaus.janino.UnitCompiler$2.visitPackageMemberClassDeclaration(UnitCompiler.java:406) at org.codehaus.janino.Java$PackageMemberClassDeclaration.accept(Java.java:1414) at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:406) at org.codehaus.janino.UnitCompiler.compileUnit(UnitCompiler.java:378) at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:237) at org.codehaus.janino.SimpleCompiler.compileToClassLoader(SimpleCompiler.java:465) at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:216) at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:207) at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:80) at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:75) at org.apache.flink.table.codegen.Compiler$class.compile(Compiler.scala:33) ... 10 more
{code}
Another case:
if I remove getResultType method, it cause an error when using nested udf as follows,
nested UDF:
{code:java}
CastBoolToString(IsNumber(topic))
{code}
CastBoolToString required Boolean type parameter, but got Object type.
So caused error:
{code:java}
Caused by: org.codehaus.commons.compiler.CompileException: Line 118, Column 10: Assignment conversion not possible from type "java.lang.Object" to type "java.lang.Boolean"
at org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:12124)
at org.codehaus.janino.UnitCompiler.assignmentConversion(UnitCompiler.java:10975)
at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:2578)
at org.codehaus.janino.UnitCompiler.access$2700(UnitCompiler.java:215)
at org.codehaus.janino.UnitCompiler$6.visitLocalVariableDeclarationStatement(UnitCompiler.java:1503)
at org.codehaus.janino.UnitCompiler$6.visitLocalVariableDeclarationStatement(UnitCompiler.java:1487)
at org.codehaus.janino.Java$LocalVariableDeclarationStatement.accept(Java.java:3511)
at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:1487)
at org.codehaus.janino.UnitCompiler.compileStatements(UnitCompiler.java:1567)
at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:3388)
at org.codehaus.janino.UnitCompiler.compileDeclaredMethods(UnitCompiler.java:1357)
at org.codehaus.janino.UnitCompiler.compileDeclaredMethods(UnitCompiler.java:1330)
at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:822)
at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:432)
at org.codehaus.janino.UnitCompiler.access$400(UnitCompiler.java:215)
at org.codehaus.janino.UnitCompiler$2.visitPackageMemberClassDeclaration(UnitCompiler.java:411)
at org.codehaus.janino.UnitCompiler$2.visitPackageMemberClassDeclaration(UnitCompiler.java:406)
at org.codehaus.janino.Java$PackageMemberClassDeclaration.accept(Java.java:1414)
at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:406)
at org.codehaus.janino.UnitCompiler.compileUnit(UnitCompiler.java:378)
at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:237)
at org.codehaus.janino.SimpleCompiler.compileToClassLoader(SimpleCompiler.java:465)
at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:216)
at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:207)
at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:80)
at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:75)
at org.apache.flink.table.codegen.Compiler$class.compile(Compiler.scala:33)
... 10 more
{code}
I found that the following code in org.apache.flink.table.codegen.calls.ScalarFunctionCallGen caused the error:
{code:java}
val functionCallCode =
s"""
|${parameters.map(_.code).mkString("\n")}
|$resultTypeTerm $resultTerm = $functionReference.eval(
| ${parameters.map(_.resultTerm).mkString(", ")});
|""".stripMargin{code}
if return type of $functionReference.eval is Object and $resultTypeTerm is Boolean, above error occurs.
So add type coercion to solve the problem.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)