[
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)