Uploaded image for project: 'Flink'
  1. Flink
  2. FLINK-15452

Missing type coercion when generating code with ScalarFunctionCallGen

    XMLWordPrintableJSON

Details

    Description

      I defined a UDF as follows:

      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)
        }
      }
      

       

      An examples of the parameter udfs is as follows:

       

      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;
          }
      }

       

      In this case, function getResultType return Boolean, but I get error as follows:

      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
      

       

      Another case:

      if I remove getResultType method, it cause an error when using nested udf as follows,

       nested UDF:

      CastBoolToString(IsNumber(topic))
      

      CastBoolToString required Boolean type parameter, but got Object type.

      So caused error:

      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
      

       

       

      I found that the following code in org.apache.flink.table.codegen.calls.ScalarFunctionCallGen caused the error:

      val functionCallCode =
        s"""
          |${parameters.map(_.code).mkString("\n")}
          |$resultTypeTerm $resultTerm = $functionReference.eval(
          |  ${parameters.map(_.resultTerm).mkString(", ")});
          |""".stripMargin

      if return type of $functionReference.eval is Object and $resultTypeTerm is Boolean, above error occurs.

      So add type coercion to solve the problem.

       

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              Pie-He Peijian He
              Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 10m
                  10m