Hi Anton,

The TIMESTAMPADD operator never ends up in the logical plan so essentially
there is no code for executing it. It is just used as a syntactic sugar in
the parser.

Have a look below to see how you can obtain the equivalent in relational
algebra:
https://github.com/apache/calcite/blob/8eb852039db04c132ae7a99943495f87cf39dfd2/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java#L1437

Best,
Stamatis

Στις Παρ, 22 Φεβ 2019 στις 3:51 μ.μ., ο/η Anton Haidai <
[email protected]> έγραψε:

> Hongze, thank you for your answer. Your code successfully produces a
> plan with the following node:
>
> EnumerableCalc(.... expr#6=[TIMESTAMPADD($t3, $t4, $t5)] ...)
>
> But Calcite (both 1.18 and 1.19-SNAPSHOT) can't execute this plan:
>
> Caused by: java.lang.RuntimeException: cannot translate call
> TIMESTAMPADD($t3, $t4, $t5)
> at
> org.apache.calcite.adapter.enumerable.RexToLixTranslator.translateCall(RexToLixTranslator.java:719)
> at
> org.apache.calcite.adapter.enumerable.RexToLixTranslator.translate0(RexToLixTranslator.java:693)
> at
> org.apache.calcite.adapter.enumerable.RexToLixTranslator.translate(RexToLixTranslator.java:197)
>
> While the SQL from my first message produces the following node:
>
> EnumerableCalc(expr#0..26=[{inputs}], expr#27=[1], expr#28=[1],
> expr#29=[*($t27, $t28)], expr#30=[+($t0, $t29)], EXPR$0=[$t30])
>
> And Calcite is able to execute it. So now I'm trying to replicate it
> using a RelBuilder (using INTERVAL instead of TIMESTAMP_ADD), without
> a success so far.
>
> On Fri, Feb 22, 2019 at 4:11 PM Hongze Zhang <[email protected]> wrote:
> >
> > Correct the flag:
> > TimeUnitRange.MONTH -> TimeUnit.MONTH
> >
> >
> > Best,
> > Hongze
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > At 2019-02-22 22:07:11, "Hongze Zhang" <[email protected]> wrote:
> >
> > Hi Anton,
> >
> >
> > Following code works to me:
> >
> >
> >
> > final RexNode shiftedDateField =
> >
> >     relBuilder.call(
> >
> >         SqlStdOperatorTable.TIMESTAMP_ADD,
> >
> >         relBuilder.getRexBuilder().makeFlag(TimeUnitRange.MONTH),
> >
> >         relBuilder.literal(1),
> >
> >         relBuilder.getRexBuilder().makeDateLiteral(new DateString(2019,
> 1, 1))
> >
> >     );
> >
> >
> >
> >
> >
> > Best,
> > Hongze
> >
> >
> >
> >
> >
> > At 2019-02-22 19:16:09, "Anton Haidai" <[email protected]> wrote:
> > >Hello. In SQL, I can execute a query like "SELECT TIMESTAMPADD(month,
> > >1, "date" ) FROM ..." and it works. But my attempts to do the same
> > >thing using RelBuilder are not successful, for example, this code does
> > >not work:
> > >
> > >RexNode shiftedDateField = relBuilder.call(
> > >    SqlStdOperatorTable.TIMESTAMP_ADD,
> > >    relBuilder.literal("month"),
> > >    relBuilder.literal(1),
> > >    dateFieldRef
> > >);
> > >
> > >Could you please tell me, how to make a TIMESTAMP_ADD call using
> RelBuilder?
> > >--
> > >Best regards,
> > >Anton.
> >
> >
> >
> >
> >
> >
>
>
>
> --
> Best regards,
> Anton.
>

Reply via email to