[ https://issues.apache.org/jira/browse/CALCITE-5489?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Julian Hyde resolved CALCITE-5489. ---------------------------------- Resolution: Fixed Fixed in [c4155b8d|https://github.com/apache/calcite/commit/c4155b8daba4d2d5048a5877df82a57aede1ddc7]; thanks for the test case, [~Sergey Nuyanzin], and the PR, [~tanclary]! > When creating a RexCall to TIMESTAMP_DIFF function, cannot convert a > TIMESTAMP literal to a org.apache.calcite.avatica.util.TimeUnit > ------------------------------------------------------------------------------------------------------------------------------------ > > Key: CALCITE-5489 > URL: https://issues.apache.org/jira/browse/CALCITE-5489 > Project: Calcite > Issue Type: Bug > Components: core > Reporter: Sergey Nuyanzin > Assignee: Tanner Clary > Priority: Blocker > Labels: pull-request-available > Fix For: 1.33.0 > > Time Spent: 1h 40m > Remaining Estimate: 0h > > It seems it stops working after > {noformat} > [CALCITE-5360] Add TIMESTAMP_ADD function (enabled in BigQuery > library){noformat} > for {{RexCallBinding}} > e.g. this test 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.isOperandLiteral(0, true)) { > 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} -- This message was sent by Atlassian Jira (v8.20.10#820010)