[ https://issues.apache.org/jira/browse/CALCITE-1754?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Julian Hyde updated CALCITE-1754: --------------------------------- Summary: In Csv adapter, convert DATE and TIME values to int, and TIMESTAMP values to long (was: queries grouping by timestampadd throws ClassCastException) > In Csv adapter, convert DATE and TIME values to int, and TIMESTAMP values to > long > --------------------------------------------------------------------------------- > > Key: CALCITE-1754 > URL: https://issues.apache.org/jira/browse/CALCITE-1754 > Project: Calcite > Issue Type: Bug > Affects Versions: 1.12.0 > Reporter: hongbin ma > Assignee: Julian Hyde > Attachments: > 0001-CALCITE-1754-convert-Date-Time-Timestamp-values-to-I.patch > > > using CSVTest: > {code} > checkSql("model","select count(*), JOINEDAT from EMPS group by JOINEDAT > "); > {code} > works well, however > {code} > checkSql("model","select count(*), {fn timestampadd(SQL_TSI_DAY, 1, > JOINEDAT) } from EMPS group by {fn timestampadd(SQL_TSI_DAY, 1, JOINEDAT ) } > "); > {code} > throws > {code} > Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to > java.sql.Date > at Baz$3.apply(ANONYMOUS.java:88) > at Baz$3.apply(ANONYMOUS.java) > at > org.apache.calcite.linq4j.EnumerableDefaults.groupBy_(EnumerableDefaults.java:832) > at > org.apache.calcite.linq4j.EnumerableDefaults.groupBy(EnumerableDefaults.java:761) > at > org.apache.calcite.linq4j.DefaultEnumerable.groupBy(DefaultEnumerable.java:302) > at Baz.bind(Baz.java:70) > at > org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:331) > at > org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:294) > at > org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:553) > at > org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:544) > at > org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:193) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:67) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:44) > at > org.apache.calcite.avatica.AvaticaConnection$1.execute(AvaticaConnection.java:607) > at > org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:600) > at > org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:615) > at > org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:148) > {code} > the generated code is: > {code} > /* 1 */ public static class Record1_0 implements java.io.Serializable { > /* 2 */ public long f0; > /* 3 */ public Record1_0() {} > /* 4 */ public boolean equals(Object o) { > /* 5 */ if (this == o) { > /* 6 */ return true; > /* 7 */ } > /* 8 */ if (!(o instanceof Record1_0)) { > /* 9 */ return false; > /* 10 */ } > /* 11 */ return this.f0 == ((Record1_0) o).f0; > /* 12 */ } > /* 13 */ > /* 14 */ public int hashCode() { > /* 15 */ int h = 0; > /* 16 */ h = org.apache.calcite.runtime.Utilities.hash(h, this.f0); > /* 17 */ return h; > /* 18 */ } > /* 19 */ > /* 20 */ public int compareTo(Record1_0 that) { > /* 21 */ final int c; > /* 22 */ c = org.apache.calcite.runtime.Utilities.compare(this.f0, > that.f0); > /* 23 */ if (c != 0) { > /* 24 */ return c; > /* 25 */ } > /* 26 */ return 0; > /* 27 */ } > /* 28 */ > /* 29 */ public String toString() { > /* 30 */ return "{f0=" + this.f0 + "}"; > /* 31 */ } > /* 32 */ > /* 33 */ } > /* 34 */ > /* 35 */ org.apache.calcite.DataContext root; > /* 36 */ > /* 37 */ public org.apache.calcite.linq4j.Enumerable bind(final > org.apache.calcite.DataContext root0) { > /* 38 */ root = root0; > /* 39 */ final org.apache.calcite.rel.RelNode v0stashed = > (org.apache.calcite.rel.RelNode) root.get("v0stashed"); > /* 40 */ final org.apache.calcite.interpreter.Interpreter interpreter = > new org.apache.calcite.interpreter.Interpreter( > /* 41 */ root, > /* 42 */ v0stashed); > /* 43 */ final org.apache.calcite.linq4j.AbstractEnumerable child = new > org.apache.calcite.linq4j.AbstractEnumerable(){ > /* 44 */ public org.apache.calcite.linq4j.Enumerator enumerator() { > /* 45 */ return new org.apache.calcite.linq4j.Enumerator(){ > /* 46 */ public final org.apache.calcite.linq4j.Enumerator > inputEnumerator = interpreter.enumerator(); > /* 47 */ public void reset() { > /* 48 */ inputEnumerator.reset(); > /* 49 */ } > /* 50 */ > /* 51 */ public boolean moveNext() { > /* 52 */ return inputEnumerator.moveNext(); > /* 53 */ } > /* 54 */ > /* 55 */ public void close() { > /* 56 */ inputEnumerator.close(); > /* 57 */ } > /* 58 */ > /* 59 */ public Object current() { > /* 60 */ final Object[] current = (Object[]) > inputEnumerator.current(); > /* 61 */ return (java.sql.Date) current[9] == null ? (Integer) > null : > Integer.valueOf(org.apache.calcite.runtime.SqlFunctions.toInt(current[9]) + > (int) $L4J$C$86400000L_1_86400000L); > /* 62 */ } > /* 63 */ > /* 64 */ static final long $L4J$C$86400000L_1 = 86400000L * 1; > /* 65 */ static final long $L4J$C$86400000L_1_86400000L = > $L4J$C$86400000L_1 / 86400000L; > /* 66 */ }; > /* 67 */ } > /* 68 */ > /* 69 */ }; > /* 70 */ final org.apache.calcite.linq4j.Enumerable _inputEnumerable = > child.groupBy(org.apache.calcite.linq4j.function.Functions.identitySelector(), > new org.apache.calcite.linq4j.function.Function0() { > /* 71 */ public Object apply() { > /* 72 */ long COUNTa0s0; > /* 73 */ COUNTa0s0 = 0L; > /* 74 */ Record1_0 record0; > /* 75 */ record0 = new Record1_0(); > /* 76 */ record0.f0 = COUNTa0s0; > /* 77 */ return record0; > /* 78 */ } > /* 79 */ } > /* 80 */ , new org.apache.calcite.linq4j.function.Function2() { > /* 81 */ public Record1_0 apply(Record1_0 acc, java.sql.Date in) { > /* 82 */ acc.f0++; > /* 83 */ return acc; > /* 84 */ } > /* 85 */ public Record1_0 apply(Object acc, Object in) { > /* 86 */ return apply( > /* 87 */ (Record1_0) acc, > /* 88 */ (java.sql.Date) in); > /* 89 */ } > /* 90 */ } > /* 91 */ , new org.apache.calcite.linq4j.function.Function2() { > /* 92 */ public Object[] apply(java.sql.Date key, Record1_0 acc) { > /* 93 */ return new Object[] { > /* 94 */ key, > /* 95 */ acc.f0}; > /* 96 */ } > /* 97 */ public Object[] apply(Object key, Object acc) { > /* 98 */ return apply( > /* 99 */ (java.sql.Date) key, > /* 100 */ (Record1_0) acc); > /* 101 */ } > /* 102 */ } > /* 103 */ ); > /* 104 */ return new org.apache.calcite.linq4j.AbstractEnumerable(){ > /* 105 */ public org.apache.calcite.linq4j.Enumerator enumerator() { > /* 106 */ return new org.apache.calcite.linq4j.Enumerator(){ > /* 107 */ public final org.apache.calcite.linq4j.Enumerator > inputEnumerator = _inputEnumerable.enumerator(); > /* 108 */ public void reset() { > /* 109 */ inputEnumerator.reset(); > /* 110 */ } > /* 111 */ > /* 112 */ public boolean moveNext() { > /* 113 */ return inputEnumerator.moveNext(); > /* 114 */ } > /* 115 */ > /* 116 */ public void close() { > /* 117 */ inputEnumerator.close(); > /* 118 */ } > /* 119 */ > /* 120 */ public Object current() { > /* 121 */ final Object[] current = (Object[]) > inputEnumerator.current(); > /* 122 */ return new Object[] { > /* 123 */ current[1], > /* 124 */ current[0]}; > /* 125 */ } > /* 126 */ > /* 127 */ }; > /* 128 */ } > /* 129 */ > /* 130 */ }; > /* 131 */ } > /* 132 */ > /* 133 */ > /* 134 */ public Class getElementType() { > /* 135 */ return java.lang.Object[].class; > /* 136 */ } > /* 137 */ > /* 138 */ > {code} -- This message was sent by Atlassian JIRA (v6.3.15#6346)