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 2015/08/11 06:54:26 UTC

incubator-calcite git commit: [CALCITE-833] RelOptUtil.splitJoinCondition incorrectly splits a join condition (Hsuan-Yi Chu)

Repository: incubator-calcite
Updated Branches:
  refs/heads/master e827bf0a2 -> a61be0db7


[CALCITE-833] RelOptUtil.splitJoinCondition incorrectly splits a join condition (Hsuan-Yi Chu)

Close apache/incubator-calcite#119


Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/a61be0db
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/a61be0db
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/a61be0db

Branch: refs/heads/master
Commit: a61be0db744081af4c375fb0dcbae4a95041ff9d
Parents: e827bf0
Author: Hsuan-Yi Chu <hs...@usc.edu>
Authored: Sun Aug 9 16:44:26 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Aug 10 20:47:36 2015 -0700

----------------------------------------------------------------------
 .../org/apache/calcite/plan/RelOptUtil.java     |  4 +-
 .../apache/calcite/test/RexTransformerTest.java | 42 ++++++++++++++++++++
 2 files changed, 43 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a61be0db/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
index 04733cf..76af520 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
@@ -1111,9 +1111,7 @@ public abstract class RelOptUtil {
 
         boolean foundInput = false;
         for (int i = 0; i < inputs.size() && !foundInput; i++) {
-          final int lowerLimit = inputsRange[i].nextSetBit(0);
-          final int upperLimit = inputsRange[i].length();
-          if (projRefs.nextSetBit(lowerLimit) < upperLimit) {
+          if (inputsRange[i].contains(projRefs)) {
             leftInput = i;
             leftFields = inputs.get(leftInput).getRowType().getFieldList();
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a61be0db/core/src/test/java/org/apache/calcite/test/RexTransformerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RexTransformerTest.java b/core/src/test/java/org/apache/calcite/test/RexTransformerTest.java
index 2242f9c..b7ea814 100644
--- a/core/src/test/java/org/apache/calcite/test/RexTransformerTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RexTransformerTest.java
@@ -17,8 +17,12 @@
 package org.apache.calcite.test;
 
 import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
+import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.logical.LogicalJoin;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.rel.type.RelDataTypeSystem;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexInputRef;
@@ -33,6 +37,8 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertFalse;
@@ -57,6 +63,13 @@ public class RexTransformerTest {
 
   //~ Methods ----------------------------------------------------------------
 
+  /** Converts a SQL string to a relational expression using mock schema. */
+  private static RelNode toRel(String sql) {
+    final SqlToRelTestBase test = new SqlToRelTestBase() {
+    };
+    return test.createTester().convertSqlToRel(sql);
+  }
+
   @Before public void setUp() {
     typeFactory = new JavaTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
     rexBuilder = new RexBuilder(typeFactory);
@@ -352,6 +365,35 @@ public class RexTransformerTest {
         is("DECIMAL(6, 7) NOT NULL"));
     assertThat(literal3.getValue().toString(), is("0.0123456"));
   }
+
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-833">[CALCITE-833]
+   * RelOptUtil.splitJoinCondition attempts to split a Join-Condition which
+   * has a remaining condition</a>. */
+  @Test public void testSplitJoinCondition() {
+    final String sql = "select * \n"
+        + "from emp a \n"
+        + "INNER JOIN dept b \n"
+        + "ON CAST(a.empno AS int) <> b.deptno";
+
+    final RelNode relNode = toRel(sql);
+    final LogicalJoin join = (LogicalJoin) relNode.getInput(0);
+    final List<RexNode> leftJoinKeys = new ArrayList<>();
+    final List<RexNode> rightJoinKeys = new ArrayList<>();
+    final ArrayList<RelDataTypeField> sysFieldList = new ArrayList<>();
+    final RexNode remaining = RelOptUtil.splitJoinCondition(sysFieldList,
+        join.getInputs().get(0),
+        join.getInputs().get(1),
+        join.getCondition(),
+        leftJoinKeys,
+        rightJoinKeys,
+        null,
+        null);
+
+    assertThat(remaining.toString(), is("<>(CAST($0):INTEGER NOT NULL, $9)"));
+    assertThat(leftJoinKeys.isEmpty(), is(true));
+    assertThat(rightJoinKeys.isEmpty(), is(true));
+  }
 }
 
 // End RexTransformerTest.java