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)

Reply via email to