Sorry about the last email, it was a bit early...
I found the exact location of the exception, in the current() method you
can see the wrong cast:
DateTimeUtils.floorDiv(*(Long) current[8]*, 86400000L))

As I explained earlier, the type of the field is TIMESTAMP, and it cannot
be cast to long this way...

please advise

On Tue, May 5, 2020 at 7:27 AM Ayelet Morris <ayelet.mor...@gigaspaces.com>
wrote:

> + Calcite support mailing list.
>
> Hi again,
>
> I didn't receive any response from you guys, but I continued to debug this
> today and managed to print the generated code and I saw a weird casting
> that might explain what happens there:
>  public Object current() {
>               final Object[] current = (Object[])
> inputEnumerator.current();
>               return* (java.sql.Timestamp) *current[8] == null ?* (Long)*
> null : 
> *Long.valueOf*(org.apache.calcite.avatica.util.DateTimeUtils.unixDateExtract(org.apache.calcite.avatica.util.TimeUnitRange.DAY,
> org.apache.calcite.avatica.util.DateTimeUtils.floorDiv((Long) current[8],
> 86400000L)));
>              }
>
> public Class getElementType() {
>    return *java.lang.Long.class*;
>  }
>
>
> I marked in *bold* the interesting casting that happens there that I need
> your help understanding:
> it seems that the code casts the value into long and then re-casts it to
> timestamp only to return as long, as you can see the element type is marked
> as long...
> Do you know why the generated code was generated this way? the field is
> TIMESTAMP and the return value from the SQL function should be long...
>
> Hope you are all well.
> Thanks!
> Ayelet
>
> On Mon, Apr 27, 2020 at 4:49 PM Ayelet Morris <
> ayelet.mor...@gigaspaces.com> wrote:
>
>> Hi Calcite Developers,
>> Hope you are all doing well at this crazy time.
>>
>> I have a question regarding Linq4j$EnumeratorIterator
>> throwing ClassCastException.
>> *Background*: I'm running a Tableau testing framework called TDVT (it's
>> in beta) in order to test our product's JDBC connector.  Our product uses
>> Calcite 1.21.0 and Avatics 1.15.0.
>>
>> I encountered this class cast exception when running timestamp related
>> sql functions (I have about 127 different SQLs failing with the same class
>> cast exception).
>> *My SQL**:* select DAYOFMONTH(datetime0) from Calcs
>> datetime0 is a java.sql.Timestamp field in my POJO, the data in the CSV
>> I'm using to fill in the POJO is written like this: '2004-07-23 21:13:37'
>> *The exception:*
>> ClassCastException: java.sql.Timestamp cannot be cast to java.lang.Long
>> at Baz$1$1.current(Unknown Source)
>> at
>> org.apache.calcite.linq4j.Linq4j$EnumeratorIterator.next(Linq4j.java:683)
>> at
>> org.apache.calcite.avatica.util.IteratorCursor.next(IteratorCursor.java:46)
>> at
>> org.apache.calcite.avatica.AvaticaResultSet.next(AvaticaResultSet.java:217)
>> at com.gigaspaces.jdbc.TimestampTest.test(TimestampTest.java:64)
>>
>> This exception is thrown when trying to perform "next()"
>> I cannot debug the generated code... I just see it being thrown there.
>>
>> I looked into the generated code for performing this (and similar) sql
>> function and couldn't find a specific time format that is required, but in
>> the documentation I saw the use of java.sql.Date as the function type, I
>> tried to run my test with Date field I have in my POJO and it did return a
>> correct result.
>> I suspect it might not be compatible with Timestamp data type, though I
>> saw in your tests you do test with timestamp '2008-1-23 12:12:12', I
>> didn't try to run the test in the DruidAdapter suite but I saw that you are
>> using a timestamp based column there.
>>
>> Do you know of a reason for this exception at this location? Did you see
>> this exception before at this location? Do you have any idea where I should
>> look for further information/clues?
>>
>> Thanks,
>> Ayelet
>>
>>
>>
>>
>>
>>
>>
>>
>>

Reply via email to