Rather than > relBuilder.getRexBuilder().makeDateLiteral(new DateString(2019, 1, 1))
I think you can use > relBuilder.literal(new DateString(2019, 1, 1)) (Or should be able to.) Same effect, a bit less code. > On Feb 22, 2019, at 8:21 AM, Anton Haidai <anton.hai...@gmail.com> wrote: > > Stamatis, Hongze - thank you for your help, it works now. > > On Fri, Feb 22, 2019 at 6:05 PM Hongze Zhang <notify...@126.com> wrote: >> >>> 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)As @Stamatis has said, this is normal. Calcite >>> doesn't provide an implementation for TIMESTAMPADD by default.Below is an >>> usage example of operator DATETIME_PLUS if you are using RexBuilder:final >>> RexNode shiftedDateField = >> relBuilder.call( >> SqlStdOperatorTable.DATETIME_PLUS, >> rexBuilder.makeTimestampLiteral(new TimestampString(2019, 1, 1, 0, 0, 0), 0), >> rexBuilder.makeCall(SqlStdOperatorTable.MULTIPLY, >> rexBuilder.makeIntervalLiteral( >> TimeUnit.MONTH.multiplier, >> new SqlIntervalQualifier(TimeUnit.MONTH, null, >> SqlParserPos.ZERO) >> ), >> relBuilder.literal(1) >> ) >> ); >> >> >> >> >> >> >> >> >> >> >> >> >> >> 在 2019-02-22 23:49:35,"Stamatis Zampetakis" <zabe...@gmail.com> 写道: >>> 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 < >>> anton.hai...@gmail.com> έγραψε: >>> >>>> 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 <notify...@126.com> wrote: >>>>> >>>>> Correct the flag: >>>>> TimeUnitRange.MONTH -> TimeUnit.MONTH >>>>> >>>>> >>>>> Best, >>>>> Hongze >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> At 2019-02-22 22:07:11, "Hongze Zhang" <notify...@126.com> 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" <anton.hai...@gmail.com> 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. >>>> > > > > -- > Best regards, > Anton.