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