You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jn...@apache.org on 2015/12/01 00:22:52 UTC
calcite git commit: [CALCITE-966] VolcanoPlanner should clear
ruleNames in order to avoid rule name conflicting error
Repository: calcite
Updated Branches:
refs/heads/master 3e49bc438 -> d3c5acd3a
[CALCITE-966] VolcanoPlanner should clear ruleNames in order to avoid rule name conflicting error
close apache/calcite#167
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/d3c5acd3
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/d3c5acd3
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/d3c5acd3
Branch: refs/heads/master
Commit: d3c5acd3a95e1926e0985e99a2d802a60e096b32
Parents: 3e49bc4
Author: Jinfeng Ni <jn...@apache.org>
Authored: Thu Aug 13 17:05:05 2015 -0700
Committer: Jinfeng Ni <jn...@apache.org>
Committed: Mon Nov 30 12:13:25 2015 -0800
----------------------------------------------------------------------
.../calcite/plan/volcano/VolcanoPlanner.java | 1 +
.../org/apache/calcite/tools/PlannerTest.java | 60 ++++++++++++++++++++
2 files changed, 61 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/d3c5acd3/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
index b6ccd28..10ea16d 100644
--- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
@@ -598,6 +598,7 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
this.mapRel2Subset.clear();
this.relImportances.clear();
this.ruleQueue.clear();
+ this.ruleNames.clear();
}
public boolean addRule(RelOptRule rule) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/d3c5acd3/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/tools/PlannerTest.java b/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
index 8b24317..01816df 100644
--- a/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
+++ b/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
@@ -31,6 +31,7 @@ import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptPlanner;
import org.apache.calcite.plan.RelOptPredicateList;
import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
import org.apache.calcite.plan.RelOptTable;
import org.apache.calcite.plan.RelOptUtil;
import org.apache.calcite.plan.RelTraitDef;
@@ -40,6 +41,8 @@ import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.convert.ConverterRule;
import org.apache.calcite.rel.core.RelFactories;
import org.apache.calcite.rel.core.TableScan;
+import org.apache.calcite.rel.logical.LogicalFilter;
+import org.apache.calcite.rel.logical.LogicalProject;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
import org.apache.calcite.rel.rules.FilterMergeRule;
import org.apache.calcite.rel.rules.ProjectMergeRule;
@@ -78,9 +81,12 @@ import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
+import static org.apache.calcite.plan.RelOptRule.operand;
+
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.notNullValue;
+
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
@@ -511,6 +517,60 @@ public class PlannerTest {
+ " EnumerableTableScan(table=[[hr, emps]])\n"));
}
+ /** Unit test that calls {@link Planner#transform} twice with
+ * rule name conflicts */
+ @Test public void testPlanTransformWithRuleNameConflicts() throws Exception {
+ // Create two dummy rules with identical rules.
+ RelOptRule rule1 = new RelOptRule(
+ operand(LogicalProject.class,
+ operand(LogicalFilter.class, RelOptRule.any())),
+ "MYRULE") {
+ @Override public boolean matches(RelOptRuleCall call) {
+ return false;
+ }
+
+ public void onMatch(RelOptRuleCall call) {
+ }
+ };
+
+ RelOptRule rule2 = new RelOptRule(
+ operand(LogicalFilter.class,
+ operand(LogicalProject.class, RelOptRule.any())),
+ "MYRULE") {
+
+ @Override public boolean matches(RelOptRuleCall call) {
+ return false;
+ }
+
+ public void onMatch(RelOptRuleCall call) {
+ }
+ };
+
+ RuleSet ruleSet1 =
+ RuleSets.ofList(
+ rule1,
+ EnumerableRules.ENUMERABLE_FILTER_RULE,
+ EnumerableRules.ENUMERABLE_PROJECT_RULE);
+
+ RuleSet ruleSet2 =
+ RuleSets.ofList(
+ rule2);
+
+ Planner planner = getPlanner(null, Programs.of(ruleSet1),
+ Programs.of(ruleSet2));
+ SqlNode parse = planner.parse("select * from \"emps\"");
+ SqlNode validate = planner.validate(parse);
+ RelNode convert = planner.convert(validate);
+ RelTraitSet traitSet = planner.getEmptyTraitSet()
+ .replace(EnumerableConvention.INSTANCE);
+ RelNode transform = planner.transform(0, traitSet, convert);
+ RelNode transform2 = planner.transform(1, traitSet, transform);
+ assertThat(toString(transform2),
+ equalTo(
+ "EnumerableProject(empid=[$0], deptno=[$1], name=[$2], salary=[$3], commission=[$4])\n"
+ + " EnumerableTableScan(table=[[hr, emps]])\n"));
+ }
+
/** Tests that Hive dialect does not generate "AS". */
@Test public void testHiveDialect() throws SqlParseException {
Planner planner = getPlanner(null);