Uploaded image for project: 'Calcite'
  1. Calcite
  2. CALCITE-3388

StackOverflowError for creating structured RelDataType from class type

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Cannot Reproduce
    • None
    • None
    • None

    Description

      When creating a structured RelDataType from a java type with recursion reference,

      StackOverflowError occurs, full stack trace
       

      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)
      

      Add the test case in JavaTypeFactoryTest to reproduce the exception

       /***/
        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);
        }
      

       

      Better to check for recursion and throw an exception explicitly.

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              yanlin-Lynn Wang Yanlin
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 50m
                  50m