You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Luis Fernando Kauer (JIRA)" <ji...@apache.org> on 2017/10/05 14:57:01 UTC

[jira] [Created] (CALCITE-2000) UNNEST a collection that has a field with nested data generates an Exception

Luis Fernando Kauer created CALCITE-2000:
--------------------------------------------

             Summary: UNNEST a collection that has a field with nested data generates an Exception
                 Key: CALCITE-2000
                 URL: https://issues.apache.org/jira/browse/CALCITE-2000
             Project: Calcite
          Issue Type: Bug
            Reporter: Luis Fernando Kauer
            Assignee: Julian Hyde


When unnesting a column that has another level of nesting it generates the following exception:
{noformat}
Caused by: java.lang.ArrayStoreException
	at java.lang.System.arraycopy(Native Method)
	at org.apache.calcite.runtime.SqlFunctions$ProductComparableListEnumerator.current(SqlFunctions.java:2312)
	at org.apache.calcite.runtime.SqlFunctions$ProductComparableListEnumerator.current(SqlFunctions.java:1)
	at org.apache.calcite.linq4j.EnumerableDefaults$17$1.current(EnumerableDefaults.java:1968)
	at org.apache.calcite.linq4j.EnumerableDefaults$11$1.moveNext(EnumerableDefaults.java:1225)
	at Baz$4$1.moveNext(Unknown Source)
	at org.apache.calcite.linq4j.Linq4j$EnumeratorIterator.<init>(Linq4j.java:680)
	at org.apache.calcite.linq4j.Linq4j.enumeratorIterator(Linq4j.java:98)
	at org.apache.calcite.linq4j.AbstractEnumerable.iterator(AbstractEnumerable.java:33)
	at org.apache.calcite.avatica.MetaImpl.createCursor(MetaImpl.java:90)
	at org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:206)
	at org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:67)
	at org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:1)
	at org.apache.calcite.avatica.AvaticaConnection$1.execute(AvaticaConnection.java:630)
	at org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:607)
	at org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:638)
	at org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:149)
	... 29 more
{noformat}

The problem is that Calcite uses FlatLists internally that expect items to implement Comparable.  
However, a column with a nested collection will have an array or a List as the column value, which do not implement Comparable, so it generates the Exception.
To test this in JdbcTest, I created a field in Employee with a collection.
For simplicity, I created a field called dependents in Employee class:

{code:java}
public static class HrSchema {
    @Override public String toString() {
      return "HrSchema";
    }

    public final Dependent[] dependents = {
        new Dependent(10, "Michael"),
        new Dependent(10, "Jane"),
    };
    public final Employee[] emps = {
      new Employee(100, 10, "Bill", 10000, 1000, Arrays.asList(dependents)),
      new Employee(200, 20, "Eric", 8000, 500,  Collections.<Dependent>emptyList()),
      new Employee(150, 10, "Sebastian", 7000, null,  Collections.<Dependent>emptyList()),
      new Employee(110, 10, "Theodore", 11500, 250,  Collections.<Dependent>emptyList()),
    };
    public final Department[] depts = {
      new Department(10, "Sales", Arrays.asList(emps[0], emps[2]),
          new Location(-122, 38)),
      new Department(30, "Marketing", Collections.<Employee>emptyList(),
          new Location(0, 52)),
      new Department(40, "HR", Collections.singletonList(emps[1]), null),
    };
    public final Dependent[] locations = {
      new Dependent(10, "San Francisco"),
      new Dependent(20, "San Diego"),
    };

    public QueryableTable foo(int count) {
      return Smalls.generateStrings(count);
    }

    public TranslatableTable view(String s) {
      return Smalls.view(s);
    }
  }

  public static class Employee {
    public final int empid;
    public final int deptno;
    public final String name;
    public final float salary;
    public final Integer commission;
    public final List<Dependent> dependents;

    public Employee(int empid, int deptno, String name, float salary,
        Integer commission) {
      this(empid, deptno, name, salary, commission, Collections.<Dependent>emptyList());
    }

    public Employee(int empid, int deptno, String name, float salary,
        Integer commission, List<Dependent> dependents) {
      this.empid = empid;
      this.deptno = deptno;
      this.name = name;
      this.salary = salary;
      this.commission = commission;
      this.dependents = dependents;
    }

    @Override public String toString() {
      return "Employee [empid: " + empid + ", deptno: " + deptno
          + ", name: " + name + "]";
    }

    @Override public boolean equals(Object obj) {
      return obj == this
          || obj instanceof Employee
          && empid == ((Employee) obj).empid;
    }
  }
{code}

Just running the test case JdbcTest.testUnnestArrayColumn generates the exception.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)