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!
>>>>>
>>>
>>>
>>