You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "yuqi (JIRA)" <ji...@apache.org> on 2018/06/01 13:41:00 UTC

[jira] [Created] (CALCITE-2349) Failed to build RexCall with SqlDatetimeSubtractionOperator

yuqi created CALCITE-2349:
-----------------------------

             Summary: 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
             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)