[ 
https://issues.apache.org/jira/browse/CALCITE-2349?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16503048#comment-16503048
 ] 

yuqi commented on CALCITE-2349:
-------------------------------

[~julianhyde]
As the JavaDoc says:

A special operator for the subtraction of two DATETIMEs. The format of DATETIME 
subtraction is:
"(" <datetime> "-" <datetime> ")" <interval qualifier>
This operator is special since* it needs to hold the additional interval 
qualifier specification*, when in SqlCall form. *In RexNode form, it has only 
two parameters, and the return type describes the desired type of intervall*.

This may be a little puzzled.  In SqlCall it have three operands and In RexNode 
only two. However, SqlDatetimeSubtractionOperator was initialized three and the 
return type of this operator is the type of the third operand. 

So, can you help me clarify this ? thanks 



> Failed to build RexCall with SqlDatetimeSubtractionOperator
> -----------------------------------------------------------
>
>                 Key: CALCITE-2349
>                 URL: https://issues.apache.org/jira/browse/CALCITE-2349
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.16.0
>            Reporter: yuqi
>            Assignee: Julian Hyde
>            Priority: Minor
>             Fix For: 1.17.0
>
>         Attachments: 1.png, screenshot-1.png
>
>
> When use RexBuilder to build RexCall with SqlDatetimeSubtractionOperator, it 
> will throw exception.
> {code:java}
> java.lang.IndexOutOfBoundsException: index (2) must be less than size (2)
>       at 
> com.google.common.base.Preconditions.checkElementIndex(Preconditions.java:310)
>       at 
> com.google.common.base.Preconditions.checkElementIndex(Preconditions.java:293)
>       at 
> com.google.common.collect.RegularImmutableList.get(RegularImmutableList.java:67)
>       at 
> org.apache.calcite.rex.RexCallBinding.getOperandType(RexCallBinding.java:132)
>       at 
> org.apache.calcite.sql.type.OrdinalReturnTypeInference.inferReturnType(OrdinalReturnTypeInference.java:40)
>       at 
> org.apache.calcite.sql.type.SqlTypeTransformCascade.inferReturnType(SqlTypeTransformCascade.java:54)
>       at 
> org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:470)
>       at 
> org.apache.calcite.rex.RexBuilder.deriveReturnType(RexBuilder.java:274)
>       at org.apache.calcite.rex.RexBuilder.makeCall(RexBuilder.java:248)
>       at com.netease.yuqi.calcatetest.TestThree.main(TestThree.java:100)
> {code}
> Below is My code:
> {code:java}
> public static void main(String[] args) {
>               try {
>                       SchemaPlus rootSchema = 
> Frameworks.createRootSchema(true);
>                       rootSchema.add("USERS", new AbstractTable() {
>                               public RelDataType getRowType(final 
> RelDataTypeFactory typeFactory) {
>                                       RelDataTypeFactory.FieldInfoBuilder 
> builder = typeFactory.builder();
>                                       builder.add("ID", new BasicSqlType(new 
> RelDataTypeSystemImpl() {
>                                       }, SqlTypeName.INTEGER));
>                                       builder.add("NAME", new 
> BasicSqlType(new RelDataTypeSystemImpl() {
>                                       }, SqlTypeName.CHAR));
>                                       builder.add("TIME_D", new 
> BasicSqlType(new RelDataTypeSystemImpl() {
>                                       }, SqlTypeName.TIMESTAMP));
>                                       return builder.build();
>                               }
>                       });
>                       rootSchema.add("TABLE_RESULT", new AbstractTable() {
>                               public RelDataType getRowType(final 
> RelDataTypeFactory typeFactory) {
>                                       RelDataTypeFactory.FieldInfoBuilder 
> builder = typeFactory.builder();
>                                       builder.add("ID", new BasicSqlType(new 
> RelDataTypeSystemImpl() {
>                                       }, SqlTypeName.INTEGER));
>                                       builder.add("NAME", new 
> BasicSqlType(new RelDataTypeSystemImpl() {
>                                       }, SqlTypeName.CHAR));
>                                       builder.add("SCORE", new 
> BasicSqlType(new RelDataTypeSystemImpl() {
>                                       }, SqlTypeName.INTEGER));
>                                       return builder.build();
>                               }
>                       });
>                       final FrameworkConfig config = 
> Frameworks.newConfigBuilder()
>                                       .parserConfig(SqlParser.Config.DEFAULT)
>                                       .defaultSchema(rootSchema)
>                                       .build();
>                       Planner planner = Frameworks.getPlanner(config);
>                       SqlNode parse1 = planner.parse("insert into 
> table_result(id, name, score) select a.id as id, a.name as name, 1 from users 
> a where month(a.time_d - interval '30' day) >= 2");
>                       SqlNode validate = planner.validate(parse1);
>                       RelRoot root = planner.rel(validate);
>                       RexBuilder builder1 = 
> root.rel.getCluster().getRexBuilder();
>                       LogicalFilter filter = (LogicalFilter) 
> root.rel.getInput(0).getInput(0);
>                         //get RexCall of SqlDatetimeSubtractionOperator
>                       RexCall call = (RexCall) ((RexCall) ((RexCall) 
> filter.getCondition()).operands.get(0)).getOperands().get(1);
>                       builder1.makeCall(call.getOperator(), 
> call.getOperands());
>                       HepProgramBuilder builder = new HepProgramBuilder();
>                       
> //builder.addRuleInstance(FilterJoinRule.FilterIntoJoinRule.FILTER_ON_JOIN);
>                       //builder.addRuleInstance(FilterJoinRule.JOIN);
>                       builder.addRuleCollection(Programs.RULE_SET);
>                       HepPlanner hepPlanner = new HepPlanner(builder.build());
>                       hepPlanner.setRoot(root.rel);
>                       RelNode node = hepPlanner.findBestExp();
>                       System.out.println("After-------------------->");
>                       System.out.print(RelOptUtil.toString(node));
>               } catch (Exception e) {
>                       e.printStackTrace();
>               }
>       }
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to