The problem occurs at InferTypes line 41, which is a lambda:

  public static final SqlOperandTypeInference FIRST_KNOWN =
      (callBinding, returnType, operandTypes) -> {
         …
      };


And the error is to do with method handles, which are related to lambdas. Can 
you instead convert it to a method reference:

  public static final SqlOperandTypeInference FIRST_KNOWN = 
InferTypes::firstKnown;

  private static void firstKnown(
    SqlCallBinding callBinding,
    RelDataType returnType,
    RelDataType[] operandTypes) {
         …
  }

And see whether the problem goes away?

Julian


> On Nov 5, 2020, at 7:12 PM, Fan Liya <[email protected]> wrote:
> 
> We have encountered similar problems in other projects (please see
> https://issues.apache.org/jira/browse/ARROW-9315).
> The problem is not always reproducible, because it depends on the
> particular order of class loading.
> That means other systems using different versions of JVM may potentially be
> affected by the problem.
> 
> Our solution was to change some class initialization task to be lazily
> performed. FYI.
> 
> Best,
> Liya Fan
> 
> On Fri, Nov 6, 2020 at 8:20 AM Ruben Q L <[email protected]> wrote:
> 
>> Thanks for the answers.
>> Indeed, WebSphere uses IBM's own JVM, and my hypothesis is that its class
>> loader follows a different (and unlucky) order to load Calcite classes.
>> I will continue digging into it, see if I can isolate the problem, and open
>> a Jira if there is in fact something to be addressed on Calcite's side.
>> Ruben
>> 
>> 
>> On Fri, Nov 6, 2020 at 12:10 AM Julian Hyde <[email protected]>
>> wrote:
>> 
>>> As you’re using Websphere, it’s possible you’re using IBM’s Java runtime.
>>> Is that so?
>>> 
>>> Julian
>>> 
>>> 
>>>> On Nov 5, 2020, at 2:23 PM, Stamatis Zampetakis <[email protected]>
>>> wrote:
>>>> 
>>>> Hi Ruben,
>>>> 
>>>> Since you mentioned WebSphere I am wondering if it is related to some
>>> weird
>>>> problem in the ClassLoader.
>>>> If it was only a JVM problem I guess it could be reproduced outside of
>>>> WebSphere just by referencing a few Calcite classes in some specific
>>> order.
>>>> 
>>>> Other than that, it is better to use JIRA when you have code and
>>>> stacktraces; the formatting is helpful.
>>>> 
>>>> Best,
>>>> Stamatis
>>>> 
>>>> On Thu, Nov 5, 2020 at 10:00 AM Ruben Q L <[email protected]> wrote:
>>>> 
>>>>> Hello everyone,
>>>>> 
>>>>> I'm getting a strange error on WebSphere 9 (on Ubuntu) when trying to
>>> start
>>>>> an application that uses Calcite (shaded) library. The exception
>> message
>>>>> says:
>>>>> 
>>>>> **         error [-]: Unexpected error.
>>>>> **               ...
>>>>> **               Caused by: java.lang.BootstrapMethodError:
>>>>> java.lang.ExceptionInInitializerError
>>>>> **
>>>>> 
>>>>> 
>>> 
>> com.onwbp.org.apache.calcite.sql.type.InferTypes.<clinit>(InferTypes.java:41)
>>>>> **
>>>>> 
>>>>> 
>>> 
>> com.onwbp.org.apache.calcite.sql.fun.SqlMultisetSetOperator.<init>(SqlMultisetSetOperator.java:43)
>>>>> **
>>>>> 
>>>>> 
>>> 
>> com.onwbp.org.apache.calcite.sql.fun.SqlStdOperatorTable.<clinit>(SqlStdOperatorTable.java:118)
>>>>> **
>>>>> 
>>>>> 
>>> 
>> com.onwbp.org.apache.calcite.adapter.enumerable.RexToLixTranslator.<clinit>(RexToLixTranslator.java:93)
>>>>> **               java.lang.Class.forNameImpl(Native Method)
>>>>> **               java.lang.Class.forName(Class.java:348)
>>>>> **
>>>>> 
>>>>> 
>>> 
>> java.lang.invoke.MethodType.nonPrimitiveClassFromString(MethodType.java:311)
>>>>> **
>>>>> java.lang.invoke.MethodType.parseIntoClasses(MethodType.java:373)
>>>>> **
>>>>> 
>>> 
>> java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:286)
>>>>> **
>> java.lang.invoke.MethodHandle.getCPMethodTypeAt(Native
>>>>> Method)
>>>>> **
>>>>> 
>>> java.lang.invoke.MethodHandle.resolveInvokeDynamic(MethodHandle.java:849)
>>>>> **               ... 74 more
>>>>> **               Caused by: java.lang.ExceptionInInitializerError
>>>>> **
>>>>> java.lang.J9VMInternals.ensureError(J9VMInternals.java:141)
>>>>> **
>>>>> 
>>> 
>> java.lang.J9VMInternals.recordInitializationFailure(J9VMInternals.java:130)
>>>>> **               java.lang.Class.forNameImpl(Native Method)
>>>>> **               java.lang.Class.forName(Class.java:348)
>>>>> **
>>>>> 
>>>>> 
>>> 
>> java.lang.invoke.MethodType.nonPrimitiveClassFromString(MethodType.java:311)
>>>>> **
>>>>> java.lang.invoke.MethodType.parseIntoClasses(MethodType.java:373)
>>>>> **
>>>>> 
>>> 
>> java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:286)
>>>>> **
>> java.lang.invoke.MethodHandle.getCPMethodTypeAt(Native
>>>>> Method)
>>>>> **
>>>>> 
>>> java.lang.invoke.MethodHandle.resolveInvokeDynamic(MethodHandle.java:849)
>>>>> **               ... 85 more
>>>>> **               Caused by: java.lang.NullPointerException
>>>>> **
>>>>> 
>>>>> 
>>> 
>> com.onwbp.org.apache.calcite.sql.SqlCallBinding.<clinit>(SqlCallBinding.java:60)
>>>>> **               ... 92 more
>>>>> ****** 1 errors, 5 infos.
>>>>> 
>>>>> 
>>>>> As we can see there is a NPE in SqlCallBinding:60, when it tries to
>>> call a
>>>>> method on SqlStdOperatorTable.DEFAULT, which seems to be null [0].
>>>>> According to the logs, what I think is happening is a circular
>>> dependency
>>>>> issue when classes get loaded [1].
>>>>> However, so far I have only seen this error in WebSphere, in other
>>>>> environments the same application is correctly initialized and
>> launched,
>>>>> and this exception does not happen.
>>>>> 
>>>>> Has anyone ever seen an issue like this?
>>>>> Thanks,
>>>>> Ruben
>>>>> 
>>>>> WebSphere version is:
>>>>> Integrated Solutions Console, 9.0.0.1
>>>>> Build Number: cf011636.02
>>>>> Build Date: 9/6/16
>>>>> 
>>>>> It uses java 8:
>>>>> java version "1.8.0"
>>>>> Java(TM) SE Runtime Environment (build pxa6480sr3fp11-20160817_02(SR3
>>>>> FP11))
>>>>> IBM J9 VM (build 2.8, JRE 1.8.0 Linux amd64-64 Compressed References
>>>>> 20160816_315341 (JIT enabled, AOT enabled)
>>>>> J9VM - R28_20160816_1459_B315341
>>>>> JIT  - tr.r14.java.green_20160726_121883
>>>>> GC   - R28_20160816_1459_B315341_CMPRSS
>>>>> J9CL - 20160816_315341)
>>>>> JCL - 20160816_01 based on Oracle jdk8u101-b13
>>>>> 
>>>>> [0]
>>>>> 
>>>>> 
>>> 
>> https://github.com/apache/calcite/blob/2e9edae7fc57ab9c9c7c097008724ac99a1791a3/core/src/main/java/org/apache/calcite/sql/SqlCallBinding.java#L60
>>>>> 
>>>>> [1]
>>>>> *1) RexToLixTranslator.java*
>>>>> 
>>>>> /*90*/ public class RexToLixTranslator implements
>>>>> RexVisitor<RexToLixTranslator.Result> {/*91*/  public static final
>>>>> Map<Method, SqlOperator> JAVA_TO_SQL_METHOD_MAP =/*92*/
>>>>> Util.mapOf(/*93*/          findMethod(String.class, "toUpperCase"),
>>>>> SqlStdOperatorTable.UPPER,// --> LOAD SqlStdOperatorTable
>>>>> 
>>>>> *2) SqlStdOperatorTable.java*
>>>>> 
>>>>> /*118*/  public static final SqlMultisetSetOperator
>>>>> MULTISET_UNION_DISTINCT =/*119*/      new
>>>>> SqlMultisetSetOperator("MULTISET UNION DISTINCT", 14, false);// -->
>>>>> LOAD SqlMultisetSetOperator
>>>>> 
>>>>> *3) SqlMultisetSetOperator.java*
>>>>> 
>>>>> /*42*/  public SqlMultisetSetOperator(String name, int prec, boolean
>>>>> all) {/*43*/    super(/*44*/        name,/*45*/
>>>>> SqlKind.OTHER,/*46*/        prec,/*47*/        true,/*48*/
>>>>> ReturnTypes.MULTISET_NULLABLE,/*49*/        InferTypes.FIRST_KNOWN, //
>>>>> --> LOAD InferTypes/*50*/
>>>>> OperandTypes.MULTISET_MULTISET);/*51*/    this.all = all;/*52*/  }
>>>>> 
>>>>> *4) InferTypes.java*
>>>>> 
>>>>> /*41*/  public static final SqlOperandTypeInference FIRST_KNOWN
>>>>> =/*42*/      (callBinding, returnType, operandTypes) -> {/*43*/
>>>>> final RelDataType unknownType =/*44*/
>>>>> callBinding.getValidator().getUnknownType();/*45*/        RelDataType
>>>>> knownType = unknownType;/*46*/        for (SqlNode operand :
>>>>> callBinding.operands()) {/*47*/          knownType =
>>>>> SqlTypeUtil.deriveType(callBinding, operand);/*48*/          if
>>>>> (!knownType.equals(unknownType)) {/*49*/            break;/*50*/
>>>>>  }/*51*/        }
>>>>> // --> LOAD SqlCallBinding
>>>>> 
>>>>> *5) SqlCallBinding.java*
>>>>> 
>>>>> /*59*/  private static final SqlCall DEFAULT_CALL =/*60*/
>>>>> SqlStdOperatorTable.DEFAULT.createCall(SqlParserPos.ZERO);//
>>>>> SqlStdOperatorTable is still loading in 2)!
>>>>> SqlStdOperatorTable.DEFAULT in SqlStdOperatorTable:185 is null => NPE!
>>>>> 
>>> 
>>> 
>> 

Reply via email to