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

Mihai Budiu commented on CALCITE-7878:
--------------------------------------

There are lots of bugs in the handling of timestamps related to precision.

> A java.sql.Timestamp column is typed TIMESTAMP(0), but comparisons on it see 
> milliseconds
> -----------------------------------------------------------------------------------------
>
>                 Key: CALCITE-7878
>                 URL: https://issues.apache.org/jira/browse/CALCITE-7878
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>            Reporter: Vladimir Sitnikov
>            Priority: Major
>
> A column declared with 
> {{typeFactory.createJavaType(java.sql.Timestamp.class)}} holds 
> {{java.sql.Timestamp.valueOf("2018-12-14 18:29:34.123")}}. In one row, 
> comparisons see the milliseconds, while {{CAST}} to {{VARCHAR}} and {{MAX}} 
> return the value without them:
> ||Query||Result on main ({{6ff13eaccd}})||
> |{{select 1 from T where "ts" = TIMESTAMP '2018-12-14 18:29:34.123'}}|one row|
> |{{select 1 from T where "ts" > TIMESTAMP '2018-12-14 18:29:34.122'}}|one row|
> |{{select cast("ts" as varchar(30)) from T}}|{{2018-12-14 18:29:34}}|
> |{{select cast("ts" as TIMESTAMP(3)) from T}}|{{2018-12-14 18:29:34.123}}|
> |{{select max("ts") from T}}|{{2018-12-14 18:29:34}}|
> Table setup (Object[] rows over a {{QueryableTable}}):
> {code:java}
> typeFactory.createStructType(
>     Arrays.asList(
>         typeFactory.createJavaType(java.sql.Date.class),
>         typeFactory.createJavaType(java.sql.Time.class),
>         typeFactory.createJavaType(java.sql.Timestamp.class)),
>     Arrays.asList("dt", "tm", "ts"));
> // one row: Date.valueOf("2018-12-14"), Time.valueOf("18:29:34"),
> //          Timestamp.valueOf("2018-12-14 18:29:34.123")
> {code}
> Expected: the cast and the comparisons agree. Either both keep the 
> milliseconds ({{cast("ts" as varchar(30))}} returns {{2018-12-14 
> 18:29:34.123}}), or both drop them ({{"ts" = TIMESTAMP '2018-12-14 
> 18:29:34.123'}} returns no row).
> Guess, not needed for the report above: {{JavaType}} does not override 
> {{getPrecision()}}, so the column becomes {{TIMESTAMP}} with the default 
> precision 0 from {{RelDataTypeSystemImpl.getDefaultPrecision}}, while the 
> comparison code reads the {{Timestamp}} value with its milliseconds. PR 971 
> (CALCITE-1703) proposed overriding {{JavaType.getPrecision()}} to return 9 
> for {{java.sql.Timestamp}}.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to