You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Wang Yanlin (Jira)" <ji...@apache.org> on 2019/10/05 02:34:00 UTC

[jira] [Created] (CALCITE-3388) StackOverflowError for creating structured RelDataType from class type

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)