Wang Yanlin created CALCITE-3388: ------------------------------------ Summary: StackOverflowError for creating structured RelDataType from class type Key: CALCITE-3388 URL: https://issues.apache.org/jira/browse/CALCITE-3388 Project: Calcite Issue Type: Bug Reporter: Wang Yanlin
When creating a structured RelDataType from a java type with recursion reference, StackOverflowError occurs, full stack trace {noformat} java.lang.StackOverflowError at java.lang.Class.privateGetPublicFields(Class.java:2600) at java.lang.Class.getFields(Class.java:1557) at org.apache.calcite.rel.type.RelDataTypeFactoryImpl.fieldsOf(RelDataTypeFactoryImpl.java:440) at org.apache.calcite.rel.type.RelDataTypeFactoryImpl.access$700(RelDataTypeFactoryImpl.java:50) at org.apache.calcite.rel.type.RelDataTypeFactoryImpl$JavaType.<init>(RelDataTypeFactoryImpl.java:568) at org.apache.calcite.rel.type.RelDataTypeFactoryImpl$JavaType.<init>(RelDataTypeFactoryImpl.java:560) at org.apache.calcite.rel.type.RelDataTypeFactoryImpl$JavaType.<init>(RelDataTypeFactoryImpl.java:554) at org.apache.calcite.rel.type.RelDataTypeFactoryImpl.createJavaType(RelDataTypeFactoryImpl.java:120) at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createType(JavaTypeFactoryImpl.java:143) at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createStructType(JavaTypeFactoryImpl.java:82) at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createType(JavaTypeFactoryImpl.java:158) at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createStructType(JavaTypeFactoryImpl.java:82) at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createType(JavaTypeFactoryImpl.java:158) at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createStructType(JavaTypeFactoryImpl.java:82) at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createType(JavaTypeFactoryImpl.java:158) at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createStructType(JavaTypeFactoryImpl.java:82) {noformat} Add the test case in JavaTypeFactoryTest to reproduce the exception {noformat} /***/ private static class RecursionStruct { public Integer intField; public RecursionStruct next; } /***/ private static class RecursionStruct1 { public Integer intField; public RecursionStruct2 struct2; } /***/ private static class RecursionStruct2 { public Integer intField; public RecursionStruct1 struct1; } @Test public void testRecursion() { TYPE_FACTORY.createStructType(RecursionStruct.class); TYPE_FACTORY.createStructType(RecursionStruct1.class); } {noformat} Better to check for recursion and throw an exception explicitly. -- This message was sent by Atlassian Jira (v8.3.4#803005)