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 2014/07/22 22:29:01 UTC
git commit: Eliminate duplicate conditions in
RexProgramBuilder.addCondition, not RexBuilder.makeCall as previously.
Repository: incubator-optiq
Updated Branches:
refs/heads/master b059c093d -> 4ef9f4675
Eliminate duplicate conditions in RexProgramBuilder.addCondition, not RexBuilder.makeCall as previously.
Project: http://git-wip-us.apache.org/repos/asf/incubator-optiq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-optiq/commit/4ef9f467
Tree: http://git-wip-us.apache.org/repos/asf/incubator-optiq/tree/4ef9f467
Diff: http://git-wip-us.apache.org/repos/asf/incubator-optiq/diff/4ef9f467
Branch: refs/heads/master
Commit: 4ef9f46757528d21c510eb8bd171fa04ba86e36d
Parents: b059c09
Author: Julian Hyde <jh...@apache.org>
Authored: Tue Jul 22 12:17:49 2014 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue Jul 22 12:17:49 2014 -0700
----------------------------------------------------------------------
.../main/java/org/eigenbase/relopt/RelOptUtil.java | 1 +
.../src/main/java/org/eigenbase/rex/RexBuilder.java | 10 ----------
.../java/org/eigenbase/rex/RexProgramBuilder.java | 16 +++++++++-------
.../java/org/eigenbase/test/RexProgramTest.java | 8 ++++++--
core/src/test/resources/sql/misc.oq | 8 ++++++++
5 files changed, 24 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/4ef9f467/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java b/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
index b03948f..5d46953 100644
--- a/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
+++ b/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
@@ -1376,6 +1376,7 @@ public abstract class RelOptUtil {
planner.addRule(RemoveEmptyRules.JOIN_RIGHT_INSTANCE);
planner.addRule(RemoveEmptyRules.SORT_FETCH_ZERO_INSTANCE);
planner.addRule(WindowedAggSplitterRule.PROJECT);
+ planner.addRule(MergeFilterRule.INSTANCE);
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/4ef9f467/core/src/main/java/org/eigenbase/rex/RexBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rex/RexBuilder.java b/core/src/main/java/org/eigenbase/rex/RexBuilder.java
index 5a82c7c..a3ac037 100644
--- a/core/src/main/java/org/eigenbase/rex/RexBuilder.java
+++ b/core/src/main/java/org/eigenbase/rex/RexBuilder.java
@@ -206,16 +206,6 @@ public class RexBuilder {
public RexNode makeCall(
SqlOperator op,
List<? extends RexNode> exprs) {
- // TODO jvs 12-Jun-2010: Find a better place for this;
- // it surely does not belong here.
- if (op == SqlStdOperatorTable.AND
- && exprs.size() == 2
- && exprs.get(0).equals(exprs.get(1))) {
- // Avoid generating 'AND(x, x)'; this can cause plan explosions if a
- // relnode is its own child and is merged with itself.
- return exprs.get(0);
- }
-
final RelDataType type = deriveReturnType(op, typeFactory, exprs);
return new RexCall(type, op, exprs);
}
http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/4ef9f467/core/src/main/java/org/eigenbase/rex/RexProgramBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rex/RexProgramBuilder.java b/core/src/main/java/org/eigenbase/rex/RexProgramBuilder.java
index 73db3be..e7a0a3e 100644
--- a/core/src/main/java/org/eigenbase/rex/RexProgramBuilder.java
+++ b/core/src/main/java/org/eigenbase/rex/RexProgramBuilder.java
@@ -248,14 +248,16 @@ public class RexProgramBuilder {
conditionRef = registerInput(expr);
} else {
// AND the new condition with the existing condition.
+ // If the new condition is identical to the existing condition, skip it.
RexLocalRef ref = registerInput(expr);
- final RexLocalRef andRef =
- registerInput(
- rexBuilder.makeCall(
- SqlStdOperatorTable.AND,
- conditionRef,
- ref));
- conditionRef = andRef;
+ if (!ref.equals(conditionRef)) {
+ conditionRef =
+ registerInput(
+ rexBuilder.makeCall(
+ SqlStdOperatorTable.AND,
+ conditionRef,
+ ref));
+ }
}
}
http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/4ef9f467/core/src/test/java/org/eigenbase/test/RexProgramTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/eigenbase/test/RexProgramTest.java b/core/src/test/java/org/eigenbase/test/RexProgramTest.java
index 7904199..3a65eae 100644
--- a/core/src/test/java/org/eigenbase/test/RexProgramTest.java
+++ b/core/src/test/java/org/eigenbase/test/RexProgramTest.java
@@ -120,16 +120,20 @@ public class RexProgramTest {
}
/**
- * Tests that AND(x, x) is translated to x.
+ * Checks translation of AND(x, x).
*/
@Test public void testDuplicateAnd() {
+ // RexProgramBuilder used to translate AND(x, x) to x.
+ // Now it translates it to AND(x, x).
+ // The optimization of AND(x, x) => x occurs at a higher level.
final RexProgramBuilder builder = createProg(2);
final String program = builder.getProgram(true).toString();
TestUtil.assertEqualsVerbose(
"(expr#0..1=[{inputs}], expr#2=[+($t0, $t1)], expr#3=[1], "
+ "expr#4=[+($t0, $t3)], expr#5=[+($t2, $t4)], "
+ "expr#6=[+($t0, $t0)], expr#7=[>($t2, $t0)], "
- + "a=[$t5], b=[$t6], $condition=[$t7])",
+ + "expr#8=[AND($t7, $t7)], expr#9=[AND($t8, $t7)], "
+ + "a=[$t5], b=[$t6], $condition=[$t9])",
program);
}
http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/4ef9f467/core/src/test/resources/sql/misc.oq
----------------------------------------------------------------------
diff --git a/core/src/test/resources/sql/misc.oq b/core/src/test/resources/sql/misc.oq
index b8f72b0..21711f6 100644
--- a/core/src/test/resources/sql/misc.oq
+++ b/core/src/test/resources/sql/misc.oq
@@ -226,5 +226,13 @@ EnumerableCalcRel(expr#0..56=[{inputs}], $f0=[$t20], $f1=[$t21], $f2=[$t22], $f3
EnumerableTableAccessRel(table=[[foodmart2, customer]])
!plan
+# Check that when filters are merged, duplicate conditions are eliminated.
+select * from (
+ select * from "days"
+ where "day" = 1)
+where "day" = 1;
+EnumerableCalcRel(expr#0..1=[{inputs}], expr#2=[1], expr#3=[=($t0, $t2)], proj#0..1=[{exprs}], $condition=[$t3])
+ EnumerableTableAccessRel(table=[[foodmart2, days]])
+!plan
# End misc.oq