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 2016/11/23 02:41:38 UTC
calcite git commit: [CALCITE-1502] AssertionError in
ReduceExpressionsRule when CASE is used with optional value and literal
(Serhii Harnyk)
Repository: calcite
Updated Branches:
refs/heads/master b196b26d0 -> 9b62ab3dc
[CALCITE-1502] AssertionError in ReduceExpressionsRule when CASE is used with optional value and literal (Serhii Harnyk)
Close apache/calcite#328
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/9b62ab3d
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/9b62ab3d
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/9b62ab3d
Branch: refs/heads/master
Commit: 9b62ab3dca7c3c8aac3f8c0106ecc459a291d9a6
Parents: b196b26
Author: Serhii-Harnyk <se...@gmail.com>
Authored: Tue Nov 22 13:22:57 2016 +0000
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue Nov 22 18:40:52 2016 -0800
----------------------------------------------------------------------
.../java/org/apache/calcite/rex/RexUtil.java | 7 ++++---
.../apache/calcite/test/RelOptRulesTest.java | 12 +++++++++++
.../org/apache/calcite/test/RelOptRulesTest.xml | 21 ++++++++++++++++++++
3 files changed, 37 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/9b62ab3d/core/src/main/java/org/apache/calcite/rex/RexUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rex/RexUtil.java b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
index 5766177..0301d7a 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexUtil.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
@@ -1819,10 +1819,11 @@ public class RexUtil {
}
assert newOperands.size() % 2 == 1;
if (newOperands.size() == 1 || values.size() == 1) {
- if (!call.getType().equals(newOperands.get(newOperands.size() - 1).getType())) {
- return rexBuilder.makeCast(call.getType(), newOperands.get(newOperands.size() - 1));
+ final RexNode last = Util.last(newOperands);
+ if (!call.getType().equals(last.getType())) {
+ return rexBuilder.makeAbstractCast(call.getType(), last);
}
- return newOperands.get(newOperands.size() - 1);
+ return last;
}
trueFalse:
if (call.getType().getSqlTypeName() == SqlTypeName.BOOLEAN) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/9b62ab3d/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 82269b3..a87da61 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -213,6 +213,18 @@ public class RelOptRulesTest extends RelOptTestBase {
checkPlanning(tester, preProgram, hepPlanner, sql);
}
+ @Test public void testReduceNullableCase() {
+ HepProgramBuilder builder = new HepProgramBuilder();
+ builder.addRuleClass(ReduceExpressionsRule.class);
+ HepPlanner hepPlanner = new HepPlanner(builder.build());
+ hepPlanner.addRule(ReduceExpressionsRule.PROJECT_INSTANCE);
+
+ final String sql = "SELECT CASE WHEN 1=2 "
+ + "THEN cast((values(1)) as integer) "
+ + "ELSE 2 end from (values(1))";
+ sql(sql).with(hepPlanner).check();
+ }
+
@Test public void testProjectToWindowRuleForMultipleWindows() {
HepProgram preProgram = new HepProgramBuilder()
.build();
http://git-wip-us.apache.org/repos/asf/calcite/blob/9b62ab3d/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 6c97d6a..0e7432f 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -61,6 +61,27 @@ LogicalProject(SAL=[$5])
]]>
</Resource>
</TestCase>
+ <TestCase name="testReduceNullableCase">
+ <Resource name="sql">
+ <![CDATA[SELECT CASE WHEN 1=2 THEN cast((values(1)) as integer) ELSE 2 end as state_nm from (values(1)) as a]]>
+ </Resource>
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalProject(EXPR$0=[CASE(=(1, 2), CAST($1):INTEGER, 2)])
+ LogicalJoin(condition=[true], joinType=[left])
+ LogicalValues(tuples=[[{ 1 }]])
+ LogicalValues(tuples=[[{ 1 }]])
+]]>
+ </Resource>
+ <Resource name="planAfter">
+ <![CDATA[
+LogicalProject(EXPR$0=[CAST(2):INTEGER])
+ LogicalJoin(condition=[true], joinType=[left])
+ LogicalValues(tuples=[[{ 1 }]])
+ LogicalValues(tuples=[[{ 1 }]])
+]]>
+ </Resource>
+ </TestCase>
<TestCase name="testWindowInParenthesis">
<Resource name="sql">
<![CDATA[select count(*) over (w), count(*) over w