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