Sergey Nuyanzin created CALCITE-5489:
----------------------------------------
Summary: Cannot convert TIMESTAMP literal to class
org.apache.calcite.avatica.util.TimeUnit
Key: CALCITE-5489
URL: https://issues.apache.org/jira/browse/CALCITE-5489
Project: Calcite
Issue Type: Bug
Affects Versions: 1.33.0
Reporter: Sergey Nuyanzin
It seems it stops working after {noformat}[CALCITE-5360] Add TIMESTAMP_ADD
function (enabled in BigQuery library){noformat} for {{RexCallBinding}}
e.g. this tests starts failing
{code:java}
@Test void testTimestampDiffCall() {
final RelDataTypeFactory typeFactory = new
SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
RexBuilder rexBuilder = new RexBuilder(typeFactory);
final RexImplicationCheckerFixtures.Fixture f = new
RexImplicationCheckerFixtures.Fixture();
final TimestampString ts =
TimestampString.fromCalendarFields(Util.calendar());
rexBuilder.makeCall(SqlStdOperatorTable.TIMESTAMP_DIFF,
ImmutableList.of(rexBuilder.makeFlag(TimeUnit.QUARTER),
f.timestampLiteral(ts), f.timestampLiteral(ts)));
}
{code}
like
{noformat}
cannot convert TIMESTAMP literal to class
org.apache.calcite.avatica.util.TimeUnit
java.lang.AssertionError: cannot convert TIMESTAMP literal to class
org.apache.calcite.avatica.util.TimeUnit
at org.apache.calcite.rex.RexLiteral.getValueAs(RexLiteral.java:1143)
at
org.apache.calcite.rex.RexCallBinding.getOperandLiteralValue(RexCallBinding.java:100)
at
org.apache.calcite.sql.fun.SqlTimestampDiffFunction.inferReturnType2(SqlTimestampDiffFunction.java:69)
at
org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:537)
at
org.apache.calcite.rex.RexBuilder.deriveReturnType(RexBuilder.java:292)
at org.apache.calcite.rex.RexBuilder.makeCall(RexBuilder.java:266)
at
org.apache.calcite.rex.RexBuilderTest.testTimestampDiffCall(RexBuilderTest.java:863)
...
{noformat}
It seems it recognise {{FLAG(QUARTER)}} as a literal...
at {{org.apache.calcite.sql.fun.SqlTimestampDiffFunction#inferReturnType2}}
{code:java}
if (opBinding.getOperandLiteralValue(2, Object.class) instanceof TimeUnit) {
type1 = opBinding.getOperandType(0);
type2 = opBinding.getOperandType(1);
timeUnit = opBinding.getOperandLiteralValue(2, TimeUnit.class);
} else {
timeUnit = opBinding.getOperandLiteralValue(0, TimeUnit.class);
type1 = opBinding.getOperandType(1);
type2 = opBinding.getOperandType(2);
}
{code}
Probably the condition ahould be something like that
{code:java}
if (opBinding.getOperandLiteralValue(2, Object.class) instanceof TimeUnit) {
...}
{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)