I am getting start of Calcite. I want to translate a `SqlNode` to `RelNode`, but fails due to assertion error of type mismatch: ``` ref: CHAR(1) NOT NULL input: CHAR(1) NOT NULL ```
The code is simple: ``` private static final String sql = "select u.name as user_name\n" + "from users u\n" + "where u.age > 30"; ``` and I am trying to parse -> validate -> convert this sql. ``` 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(); } }); rootSchema.add("JOBS", new AbstractTable() { @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("COMPANY", new BasicSqlType(new RelDataTypeSystemImpl() {}, SqlTypeName.CHAR)); return builder.build(); } }); FrameworkConfig frameworkConfig = Frameworks.newConfigBuilder() .defaultSchema(rootSchema) .build(); final Planner planner = Frameworks.getPlanner(frameworkConfig); SqlNode parse = planner.parse(sql); SqlNode validate = planner.validate(parse); planner.rel(validate); ``` When I running the code, line `planner.rel(validate)` gets error and says: ``` java.lang.AssertionError: type mismatch: ref: CHAR(1) NOT NULL input: CHAR(1) NOT NULL at org.apache.calcite.util.Litmus$1.fail(Litmus.java:31) at org.apache.calcite.plan.RelOptUtil.eq(RelOptUtil.java:2000) at org.apache.calcite.rex.RexChecker.visitInputRef(RexChecker.java:125) at org.apache.calcite.rex.RexChecker.visitInputRef(RexChecker.java:57) at org.apache.calcite.rex.RexInputRef.accept(RexInputRef.java:112) at org.apache.calcite.rel.core.Project.isValid(Project.java:192) at org.apache.calcite.rel.core.Project.<init>(Project.java:83) at org.apache.calcite.rel.logical.LogicalProject.<init>(LogicalProject.java:62) at org.apache.calcite.rel.logical.LogicalProject.create(LogicalProject.java:112) at org.apache.calcite.rel.logical.LogicalProject.create(LogicalProject.java:100) at org.apache.calcite.rel.core.RelFactories$ProjectFactoryImpl.createProject(RelFactories.java:158) at org.apache.calcite.tools.RelBuilder.project(RelBuilder.java:1414) at org.apache.calcite.tools.RelBuilder.projectNamed(RelBuilder.java:1470) at org.apache.calcite.sql2rel.SqlToRelConverter.convertSelectList(SqlToRelConverter.java:3955) at org.apache.calcite.sql2rel.SqlToRelConverter.convertSelectImpl(SqlToRelConverter.java:670) at org.apache.calcite.sql2rel.SqlToRelConverter.convertSelect(SqlToRelConverter.java:627) at org.apache.calcite.sql2rel.SqlToRelConverter.convertQueryRecursive(SqlToRelConverter.java:3181) at org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:563) at org.apache.calcite.prepare.PlannerImpl.rel(PlannerImpl.java:254) at org.apache.calcite.test.MyTest.firstTest(MyTest.java:141) ``` Actually, if I do project on `user.id` or `user.age` (`INTEGER` type), `SqlNode` convert works fine. However, when I project on `user.name` (`CHAR` type), the convert throws errors. I am working on branch-1.21. Thanks for sharing some ideas.