diff --git a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java index 009f66eb0a3f..33712096b623 100644 --- a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java +++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java @@ -223,6 +223,7 @@ public static SqlNode convertConditionToSqlNode(RexNode node, case GREATER_THAN_OR_EQUAL: case LESS_THAN: case LESS_THAN_OR_EQUAL: + case LIKE: node = stripCastFromString(node); operands = ((RexCall) node).getOperands(); op = ((RexCall) node).getOperator(); diff --git a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java index d24913709f09..9bf1b01558f8 100644 --- a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java +++ b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java @@ -23,6 +23,7 @@ import org.apache.calcite.plan.hep.HepProgram; import org.apache.calcite.plan.hep.HepProgramBuilder; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.rules.UnionMergeRule; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; @@ -614,6 +615,35 @@ private static String toSql(RelNode root, SqlDialect dialect) { assertThat(toSql(root, dialect), isLinux(expectedSql)); } + /** Test case for + * [CALCITE-3207] + * Fail to convert Join RelNode with like condition to sql statement . + */ + @Test public void testJoinWithLikeConditionRel2Sql() { + final RelBuilder builder = relBuilder(); + final RelNode rel = builder + .scan("EMP") + .scan("DEPT") + .join(JoinRelType.LEFT, + builder.and( + builder.call(SqlStdOperatorTable.EQUALS, + builder.field(2, 0, "DEPTNO"), + builder.field(2, 1, "DEPTNO") + ), + builder.call(SqlStdOperatorTable.LIKE, + builder.field(2, 1, "DNAME"), + builder.literal("ACCOUNTING") + ) + )).build(); + final String sql = toSql(rel); + final String expectedSql = "SELECT *\n" + + "FROM \"scott\".\"EMP\"\n" + + "LEFT JOIN \"scott\".\"DEPT\" " + + "ON \"EMP\".\"DEPTNO\" = \"DEPT\".\"DEPTNO\" " + + "AND \"DEPT\".\"DNAME\" LIKE 'ACCOUNTING'"; + assertThat(sql, isLinux(expectedSql)); + } + @Test public void testSelectQueryWithGroupByAndProjectList1() { String query = "select count(*) from \"product\" group by \"product_class_id\", \"product_id\"";