0

I want to build Calcite RelNode with RelBuilder, and serialize it, send to another system.

But I found, if I build a filter node, the condition will be simplified as a SEARCH RexCall, and the value is Sarg, as shown in the following picture. enter image description here

If I use RelJsonWriter to serialize the RelNode, it will have an AssertError. I found out it was because of Sarg.

My code is as follows, my Calcite version is calcite-core-1.32.0.

Am I using it the wrong way?

 @Test
    public void buildFilterTest() {
        try {
            SchemaPlus rootSchema = Frameworks.createRootSchema(true);
            rootSchema.add("USERS", new AbstractTable() { // note: add a table
                @Override
                public RelDataType getRowType(final RelDataTypeFactory typeFactory) {
                    RelDataTypeFactory.Builder builder = typeFactory.builder();
                    builder.add("ID", new BasicSqlType(new RelDataTypeSystemImpl() {}, SqlTypeName.INTEGER));
                    builder.add("NAME", new BasicSqlType(new RelDataTypeSystemImpl() {}, SqlTypeName.CHAR));
                    builder.add("AGE", new BasicSqlType(new RelDataTypeSystemImpl() {}, SqlTypeName.INTEGER));
                    return builder.build();
                }
            });
            final FrameworkConfig config = Frameworks.newConfigBuilder().parserConfig(SqlParser.Config.DEFAULT)
                    .defaultSchema(rootSchema).build();
            RelBuilder builder = RelBuilder.create(config);

            builder.scan("USERS");
            builder.project(builder.field("ID"));
            RexNode greater = builder.call(SqlStdOperatorTable.GREATER_THAN, builder.field("ID"), builder.literal(0));
            RexNode lesser = builder.call(SqlStdOperatorTable.LESS_THAN, builder.field("ID"), builder.literal(100));
            builder.filter(builder.call(SqlStdOperatorTable.AND, greater, lesser));
            RelNode relNode = builder.build();

            RelJsonWriter writer = new RelJsonWriter();
            relNode.explain(writer);
            String res = writer.asString();
            log.info("success");
        } catch (AssertionError e) {
            e.printStackTrace();
        }
    }
lulijun
  • 415
  • 3
  • 22

1 Answers1

1

There was a bug in serializing SEARCH to and from JSON, CALCITE-5614, fixed in Calcite 1.35.

Julian Hyde
  • 1,239
  • 7
  • 10