You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2021/05/20 00:56:50 UTC

[calcite] 01/01: [CALCITE-4610] Join on range causes AssertionError in RelToSqlConverter

This is an automated email from the ASF dual-hosted git repository.

jhyde pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git

commit 204b5ab42d9e365c55636cd0aca9f750f4d50e5d
Author: Julian Hyde <jh...@apache.org>
AuthorDate: Tue May 18 15:37:58 2021 -0700

    [CALCITE-4610] Join on range causes AssertionError in RelToSqlConverter
---
 .../apache/calcite/rel/rel2sql/SqlImplementor.java | 10 ++++++++++
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java | 23 ++++++++++++++++++++++
 2 files changed, 33 insertions(+)

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 7912359..8d5f965 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
@@ -350,6 +350,16 @@ public abstract class SqlImplementor {
       joinContext =
           leftContext.implementor().joinContext(leftContext, rightContext);
       return joinContext.toSql(null, node);
+
+    case SEARCH:
+      final RexCall search = (RexCall) node;
+      final RexLiteral literal = (RexLiteral) search.operands.get(1);
+      final Sarg sarg = castNonNull(literal.getValueAs(Sarg.class));
+      joinContext =
+          leftContext.implementor().joinContext(leftContext, rightContext);
+      return joinContext.toSql(null, search.operands.get(0), literal.getType(),
+          sarg);
+
     case IS_NULL:
     case IS_NOT_NULL:
       operands = ((RexCall) node).getOperands();
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 9b70a0d..75ea3fc 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
@@ -2914,6 +2914,29 @@ class RelToSqlConverterTest {
     }
   }
 
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-4610">[CALCITE-4610]
+   * Join on range causes AssertionError in RelToSqlConverter</a>. */
+  @Test void testJoinOnRange() {
+    final String sql = "SELECT d.deptno, e.deptno\n"
+        + "FROM dept d\n"
+        + "LEFT JOIN emp e\n"
+        + " ON d.deptno = e.deptno\n"
+        + " AND d.deptno < 15\n"
+        + " AND d.deptno > 10\n"
+        + "WHERE e.job LIKE 'PRESIDENT'";
+    final String expected = "SELECT \"DEPT\".\"DEPTNO\","
+        + " \"EMP\".\"DEPTNO\" AS \"DEPTNO0\"\n"
+        + "FROM \"SCOTT\".\"DEPT\"\n"
+        + "LEFT JOIN \"SCOTT\".\"EMP\" "
+        + "ON \"DEPT\".\"DEPTNO\" = \"EMP\".\"DEPTNO\" "
+        + "AND (\"DEPT\".\"DEPTNO\" > 10"
+        + " AND \"DEPT\".\"DEPTNO\" < 15)\n"
+        + "WHERE \"EMP\".\"JOB\" LIKE 'PRESIDENT'";
+    sql(sql)
+        .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
+        .ok(expected);
+  }
 
   /** Test case for
    * <a href="https://issues.apache.org/jira/browse/CALCITE-1586">[CALCITE-1586]