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

Julian Hyde commented on CALCITE-2349:
--------------------------------------

You're probably supplying the wrong number of operands. {{<timestamp> - 
<interval>}} has two operands. {{<timestamp> - <timestamp> <time unit>}} has 
three. Just because you get an error it doesn't mean the bug is in Calcite's 
code.

> 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
>
>
> 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