You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Mihai Budiu (Jira)" <ji...@apache.org> on 2023/08/11 18:13:00 UTC
[jira] [Created] (CALCITE-5919) Compile-time implementation of EXTRACT ignores sub-millisecond values
Mihai Budiu created CALCITE-5919:
------------------------------------
Summary: Compile-time implementation of EXTRACT ignores sub-millisecond values
Key: CALCITE-5919
URL: https://issues.apache.org/jira/browse/CALCITE-5919
Project: Calcite
Issue Type: Bug
Components: core
Affects Versions: 1.35.0
Reporter: Mihai Budiu
When enabling the optimization rule PROJECT_REDUCE_EXPRESSIONS the compile-time evaluation of an expression like EXTRACT(MICROSECONDS FROM TIME '13:30:25.575401') will produce a result up to milliseconds only, irrespective of the type system provided. (This query will evaluate to 25575000 instead of 25575401).
The bug is in RexImpTable.ExtractImplementor, here:
{code:java}
case MILLISECOND:
case MICROSECOND:
case NANOSECOND:
if (sqlTypeName == SqlTypeName.DATE) {
return Expressions.constant(0L);
}
operand = mod(operand, TimeUnit.MINUTE.multiplier.longValue(), !isIntervalType); // << BUG
return Expressions.multiply(
operand, Expressions.constant((long) (1 / unit.multiplier.doubleValue())));
{code}
The mod operation uses a multiplier for MINUTE that is expressed in milliseconds, so it always truncates away values below milliseconds. The multiplier seems to assume that the type system precision for TIME is set to 3, which is the default value, but may be overridden.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)