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/03/06 08:45:04 UTC
incubator-calcite git commit: [CALCITE-566] ReduceExpressionsRule
requires planner to have an Executor
Repository: incubator-calcite
Updated Branches:
refs/heads/master b659d0f3b -> 49ec28018
[CALCITE-566] ReduceExpressionsRule requires planner to have an Executor
Also fix some code style issues
Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/49ec2801
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/49ec2801
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/49ec2801
Branch: refs/heads/master
Commit: 49ec280180cfa74cb35f6a50fbcf84857f690951
Parents: b659d0f
Author: Julian Hyde <jh...@apache.org>
Authored: Tue Mar 3 20:59:08 2015 -0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue Mar 3 20:59:08 2015 -0800
----------------------------------------------------------------------
.../calcite/rel/rules/ReduceExpressionsRule.java | 12 +++++++++++-
.../apache/calcite/sql/parser/SqlParserTest.java | 3 ++-
.../org/apache/calcite/test/RelOptRulesTest.java | 17 +++++++++++++++++
.../calcite/test/SqlToRelConverterTest.java | 16 +++++++++++-----
.../apache/calcite/test/SqlValidatorTest.java | 3 ++-
.../org/apache/calcite/test/RelOptRulesTest.xml | 19 +++++++++++++++++++
6 files changed, 62 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/49ec2801/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java
index 01b05f7..8bcf4b2 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java
@@ -153,7 +153,6 @@ public abstract class ReduceExpressionsRule extends RelOptRule {
// If the expression is a IS [NOT] NULL on a non-nullable
// column, then we can either remove the filter or replace
// it with an Empty.
- SqlOperator op = rexCall.getOperator();
boolean alwaysTrue;
switch (rexCall.getKind()) {
case IS_NULL:
@@ -386,6 +385,17 @@ public abstract class ReduceExpressionsRule extends RelOptRule {
// Compute the values they reduce to.
RelOptPlanner.Executor executor =
rel.getCluster().getPlanner().getExecutor();
+ if (executor == null) {
+ // Cannot reduce expressions: caller has not set an executor in their
+ // environment. Caller should execute something like the following before
+ // invoking the planner:
+ //
+ // final RexExecutorImpl executor =
+ // new RexExecutorImpl(Schemas.createDataContext(null));
+ // rootRel.getCluster().getPlanner().setExecutor(executor);
+ return false;
+ }
+
final List<RexNode> reducedValues = Lists.newArrayList();
executor.reduce(rexBuilder, constExps2, reducedValues);
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/49ec2801/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
index 48eb1d5..70eb39c 100644
--- a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
@@ -825,7 +825,8 @@ public class SqlParserTest {
@Test public void testGroupByRollup() {
sql("select deptno from emp\n"
+ "group by rollup (deptno, deptno + 1, gender)")
- .ok("SELECT `DEPTNO`\n" + "FROM `EMP`\n"
+ .ok("SELECT `DEPTNO`\n"
+ + "FROM `EMP`\n"
+ "GROUP BY (ROLLUP(`DEPTNO`, (`DEPTNO` + 1), `GENDER`))");
// Nested rollup not ok
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/49ec2801/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index fdc0779..bb70d37 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -662,6 +662,23 @@ public class RelOptRulesTest extends RelOptTestBase {
"select * from (values (1,2)) where 1 + 2 > 3 + CAST(NULL AS INTEGER)");
}
+ /** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-566">[CALCITE-566],
+ * ReduceExpressionsRule requires planner to have an Executor</a>. */
+ @Test public void testReduceConstantsRequiresExecutor() throws Exception {
+ HepProgram program = new HepProgramBuilder()
+ .addRuleInstance(ReduceExpressionsRule.FILTER_INSTANCE)
+ .build();
+
+ // Remove the executor
+ tester.convertSqlToRel("values 1").getCluster().getPlanner()
+ .setExecutor(null);
+
+ // Rule should not fire, but there should be no NPE
+ checkPlanning(program,
+ "select * from (values (1,2)) where 1 + 2 > 3 + CAST(NULL AS INTEGER)");
+ }
+
@Test public void testAlreadyFalseEliminatesFilter() throws Exception {
HepProgram program = new HepProgramBuilder()
.addRuleInstance(ReduceExpressionsRule.FILTER_INSTANCE)
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/49ec2801/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
index ad6c13a..0d35faf 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -1043,13 +1043,19 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
rel.explain(planWriter);
pw.flush();
TestUtil.assertEqualsVerbose(
- "<RelNode type=\"LogicalProject\">\n" + "\t<Property name=\"EXPR$0\">\n"
- + "\t\t+(1, 2)\t</Property>\n" + "\t<Property name=\"EXPR$1\">\n"
- + "\t\t3\t</Property>\n" + "\t<Inputs>\n"
+ "<RelNode type=\"LogicalProject\">\n"
+ + "\t<Property name=\"EXPR$0\">\n"
+ + "\t\t+(1, 2)\t</Property>\n"
+ + "\t<Property name=\"EXPR$1\">\n"
+ + "\t\t3\t</Property>\n"
+ + "\t<Inputs>\n"
+ "\t\t<RelNode type=\"LogicalValues\">\n"
+ "\t\t\t<Property name=\"tuples\">\n"
- + "\t\t\t\t[{ true }]\t\t\t</Property>\n" + "\t\t\t<Inputs/>\n"
- + "\t\t</RelNode>\n" + "\t</Inputs>\n" + "</RelNode>\n",
+ + "\t\t\t\t[{ true }]\t\t\t</Property>\n"
+ + "\t\t\t<Inputs/>\n"
+ + "\t\t</RelNode>\n"
+ + "\t</Inputs>\n"
+ + "</RelNode>\n",
Util.toLinux(sw.toString()));
}
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/49ec2801/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
index 8a4cbc3..d569d94 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -5333,7 +5333,8 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
// self-reference is not ok, even in table not used
checkFails("with emp2 as (select * from emp),\n"
- + " emp3 as (select * from ^emp3^)\n" + "values (1)",
+ + " emp3 as (select * from ^emp3^)\n"
+ + "values (1)",
"Table 'EMP3' not found");
// self-reference not ok
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/49ec2801/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index e305849..60bd03e 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -3340,4 +3340,23 @@ LogicalProject(DEPTNO=[$0], ENAME=[$1])
]]>
</Resource>
</TestCase>
+ <TestCase name="testReduceConstantsRequiresExecutor">
+ <Resource name="sql">
+ <![CDATA[select * from (values (1,2)) where 1 + 2 > 3 + CAST(NULL AS INTEGER)]]>
+ </Resource>
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalProject(EXPR$0=[$0], EXPR$1=[$1])
+ LogicalFilter(condition=[>(+(1, 2), +(3, null))])
+ LogicalValues(tuples=[[{ 1, 2 }]])
+]]>
+ </Resource>
+ <Resource name="planAfter">
+ <![CDATA[
+LogicalProject(EXPR$0=[$0], EXPR$1=[$1])
+ LogicalFilter(condition=[>(+(1, 2), +(3, null))])
+ LogicalValues(tuples=[[{ 1, 2 }]])
+]]>
+ </Resource>
+ </TestCase>
</Root>