[ 
https://issues.apache.org/jira/browse/CALCITE-4108?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17154477#comment-17154477
 ] 

Feng Zhu commented on CALCITE-4108:
-----------------------------------

I still cannot reproduce it.

Test case1: both *tp* and *o* in same pg datasource

Test case2: *tp* in one pg datasource, *o* in another pg datasource
{code:java}
public static class Record2_0 implements java.io.Serializable {
  public double f0;
  public boolean f1;
  public Record2_0() {}
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (!(o instanceof Record2_0)) {
      return false;
    }
    return this.f0 == ((Record2_0) o).f0 && this.f1 == ((Record2_0) o).f1;
  }  public int hashCode() {
    int h = 0;
    h = org.apache.calcite.runtime.Utilities.hash(h, this.f0);
    h = org.apache.calcite.runtime.Utilities.hash(h, this.f1);
    return h;
  }  public int compareTo(Record2_0 that) {
    int c;
    c = org.apache.calcite.runtime.Utilities.compare(this.f0, that.f0);
    if (c != 0) {
      return c;
    }
    c = org.apache.calcite.runtime.Utilities.compare(this.f1, that.f1);
    if (c != 0) {
      return c;
    }
    return 0;
  }  public String toString() {
    return "{f0=" + this.f0 + ", f1=" + this.f1 + "}";
  }}public org.apache.calcite.linq4j.Enumerable bind(final 
org.apache.calcite.DataContext root) {
  final org.apache.calcite.runtime.ResultSetEnumerable enumerable = 
org.apache.calcite.runtime.ResultSetEnumerable.of((javax.sql.DataSource) 
root.getRootSchema().getSubSchema("pg").unwrap(javax.sql.DataSource.class), 
"SELECT *\r\nFROM \"public\".\"tp\"", new 
org.apache.calcite.linq4j.function.Function1() {
    public org.apache.calcite.linq4j.function.Function0 apply(final 
java.sql.ResultSet resultSet) {
      return new org.apache.calcite.linq4j.function.Function0() {
          public Object apply() {
            try {
              final Object[] values = new Object[2];
              values[0] = resultSet.getObject(1);
              values[1] = resultSet.getDouble(2);
              if (resultSet.wasNull()) {
                values[1] = null;
              }
              return values;
            } catch (java.sql.SQLException e) {
              throw new RuntimeException(
                e);
            }
          }
        }
      ;
    }
    public Object apply(final Object resultSet) {
      return apply(
        (java.sql.ResultSet) resultSet);
    }
  }
  );
  enumerable.setTimeout(root);
  final org.apache.calcite.runtime.ResultSetEnumerable enumerable0 = 
org.apache.calcite.runtime.ResultSetEnumerable.of((javax.sql.DataSource) 
root.getRootSchema().getSubSchema("pg2").unwrap(javax.sql.DataSource.class), 
"SELECT *\r\nFROM \"public\".\"oo\"", new 
org.apache.calcite.linq4j.function.Function1() {
    public org.apache.calcite.linq4j.function.Function0 apply(final 
java.sql.ResultSet resultSet) {
      return new org.apache.calcite.linq4j.function.Function0() {
          public Object apply() {
            try {
              final Object value;
              value = resultSet.getObject(1);
              return value;
            } catch (java.sql.SQLException e) {
              throw new RuntimeException(
                e);
            }
          }
        }
      ;
    }
    public Object apply(final Object resultSet) {
      return apply(
        (java.sql.ResultSet) resultSet);
    }
  }
  );
  enumerable0.setTimeout(root);
  java.util.List accumulatorAdders = new java.util.LinkedList();
  accumulatorAdders.add(new org.apache.calcite.linq4j.function.Function2() {
    public Record2_0 apply(Record2_0 acc, Object[] in) {
      final Double inp1_ = (Double) in[1];
      if (inp1_ != null) {
        acc.f1 = true;
        acc.f0 = org.apache.calcite.runtime.SqlFunctions.greater(acc.f0, 
inp1_.doubleValue());
      }
      return acc;
    }
    public Record2_0 apply(Object acc, Object in) {
      return apply(
        (Record2_0) acc,
        (Object[]) in);
    }
  }
  );
  org.apache.calcite.adapter.enumerable.AggregateLambdaFactory lambdaFactory = 
new org.apache.calcite.adapter.enumerable.BasicAggregateLambdaFactory(
    new org.apache.calcite.linq4j.function.Function0() {
      public Object apply() {
        double a0s0;
        boolean a0s1;
        a0s1 = false;
        a0s0 = Double.longBitsToDouble(-4503599627370497L);
        Record2_0 record0;
        record0 = new Record2_0();
        record0.f0 = a0s0;
        record0.f1 = a0s1;
        return record0;
      }
    }
,
    accumulatorAdders);
  return 
org.apache.calcite.linq4j.EnumerableDefaults.mergeJoin(enumerable.orderBy(new 
org.apache.calcite.linq4j.function.Function1() {
      public String apply(Object[] v) {
        return v[0] == null ? (String) null : v[0].toString();
      }
      public Object apply(Object v) {
        return apply(
          (Object[]) v);
      }
    }
    , org.apache.calcite.linq4j.function.Functions.nullsComparator(false, 
false)), enumerable0.orderBy(new org.apache.calcite.linq4j.function.Function1() 
{
      public String apply(String v) {
        return v;
      }
      public Object apply(Object v) {
        return apply(
          (String) v);
      }
    }
    , org.apache.calcite.linq4j.function.Functions.nullsComparator(false, 
false)), new org.apache.calcite.linq4j.function.Function1() {
      public String apply(Object[] left) {
        return left[0] == null ? (String) null : left[0].toString();
      }
      public Object apply(Object left) {
        return apply(
          (Object[]) left);
      }
    }
    , new org.apache.calcite.linq4j.function.Function1() {
      public String apply(String right) {
        return right;
      }
      public Object apply(Object right) {
        return apply(
          (String) right);
      }
    }
    , null, new org.apache.calcite.linq4j.function.Function2() {
      public Object[] apply(Object[] left, String right) {
        return new Object[] {
            left[0],
            left[1],
            right};
      }
      public Object[] apply(Object left, Object right) {
        return apply(
          (Object[]) left,
          (String) right);
      }
    }
    , org.apache.calcite.linq4j.JoinType.INNER, new java.util.Comparator(){
      public int compare(String v0, String v1) {
        final int c;
        c = org.apache.calcite.runtime.Utilities.compareNullsLast(v0, v1);
        if (c != 0) {
          return c;
        }
        return 0;
      }      public int compare(Object o0, Object o1) {
        return this.compare((String) o0, (String) o1);
      }    }).groupBy(new org.apache.calcite.linq4j.function.Function1() {
      public String apply(Object[] a0) {
        return a0[0] == null ? (String) null : a0[0].toString();
      }
      public Object apply(Object a0) {
        return apply(
          (Object[]) a0);
      }
    }
    , lambdaFactory.accumulatorInitializer(), lambdaFactory.accumulatorAdder(), 
lambdaFactory.resultSelector(new org.apache.calcite.linq4j.function.Function2() 
{
      public Object[] apply(String key, Record2_0 acc) {
        return new Object[] {
            key,
            acc.f1 ? Double.valueOf(acc.f0) : (Double) null};
      }
      public Object[] apply(Object key, Object acc) {
        return apply(
          (String) key,
          (Record2_0) acc);
      }
    }
    ));
}
{code}
 

> ClassCastException: java.lang.Float cannot be cast to java.lang.Double
> ----------------------------------------------------------------------
>
>                 Key: CALCITE-4108
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4108
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.23.0
>         Environment: JDK 1.8
>            Reporter: Roman Churganov
>            Assignee: Feng Zhu
>            Priority: Critical
>
> running a query  like :
> {{select tp.o, MAX( tp.n )}}
> {{  from tp join o on tp.o = o.k}}
> {{  group by tp.o}}
> type of tp.n in Schema is FLOAT, value of tp.n returned from table is of type 
> java.lang.Float, Calcite makes grouping internally and get error
>  
> {{java.lang.ClassCastException: java.lang.Float cannot be cast to 
> java.lang.Doublejava.lang.ClassCastException: java.lang.Float cannot be cast 
> to java.lang.Double at Baz$1.apply(Unknown Source) at Baz$1.apply(Unknown 
> Source) at Baz$1.apply(Unknown Source) at 
> org.apache.calcite.adapter.enumerable.SequencedAdderAggregateLambdaFactory$AccumulatorAdderSeq.apply(SequencedAdderAggregateLambdaFactory.java:81)
>  at 
> org.apache.calcite.linq4j.EnumerableDefaults.groupBy_(EnumerableDefaults.java:806)
>  at 
> org.apache.calcite.linq4j.EnumerableDefaults.groupBy(EnumerableDefaults.java:739)
>  at 
> org.apache.calcite.linq4j.DefaultEnumerable.groupBy(DefaultEnumerable.java:299)
>  at Baz.bind(Unknown Source)}}
>  
>  
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to