[ 
https://issues.apache.org/jira/browse/CALCITE-5489?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Sergey Nuyanzin updated CALCITE-5489:
-------------------------------------
    Description: 
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.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}
Probably the condition should be something like that
{code:java}
    if (opBinding.getOperandLiteralValue(2, Object.class) instanceof TimeUnit) {
...}

{code}

  was:
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 should be something like that
{code:java}
    if (opBinding.getOperandLiteralValue(2, Object.class) instanceof TimeUnit) {
...}

{code}


> 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
>          Components: core
>    Affects Versions: 1.33.0
>            Reporter: Sergey Nuyanzin
>            Priority: Major
>
> 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.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}
> Probably the condition should 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)

Reply via email to