Repository: calcite Updated Branches: refs/heads/master 53e15af6c -> d32ee5c32
[CALCITE-2675] Type validation error as ReduceExpressionRule fails to preserve type nullability (Zoltan Haindrich) Close apache/calcite#922 Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/d32ee5c3 Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/d32ee5c3 Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/d32ee5c3 Branch: refs/heads/master Commit: d32ee5c320938b5c34ce09df2276c9570c27a301 Parents: 53e15af Author: Zoltan Haindrich <[email protected]> Authored: Thu Nov 15 17:42:01 2018 +0100 Committer: Jesus Camacho Rodriguez <[email protected]> Committed: Mon Nov 19 11:55:08 2018 -0800 ---------------------------------------------------------------------- .../calcite/rel/rules/ReduceExpressionsRule.java | 3 --- .../org/apache/calcite/test/RelOptRulesTest.java | 13 +++++++++++++ .../org/apache/calcite/test/RelOptRulesTest.xml | 17 +++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d32ee5c3/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 5ba3d3c..741d083 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 @@ -790,9 +790,6 @@ public abstract class ReduceExpressionsRule extends RelOptRule { return node; } node = super.visitCall(call); - if (node != call) { - node = simplify.simplifyUnknownAs(node, unknownAs); - } return node; } http://git-wip-us.apache.org/repos/asf/calcite/blob/d32ee5c3/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 e3a943a..e91af51 100644 --- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java @@ -2584,6 +2584,19 @@ public class RelOptRulesTest extends RelOptTestBase { + "where cast((empno + (10/2)) as int) = 13"); } + @Test public <T> void testReduceCaseNullabilityChange() throws Exception { + HepProgram program = new HepProgramBuilder() + .addRuleInstance(ReduceExpressionsRule.FILTER_INSTANCE) + .addRuleInstance(ReduceExpressionsRule.PROJECT_INSTANCE) + .build(); + + try (Hook.Closeable a = Hook.REL_BUILDER_SIMPLIFY.add(Hook.propertyJ(false))) { + checkPlanning(program, + "select case when empno = 1 then 1 when 1 IS NOT NULL then 2 else null end as qx " + + "from emp"); + } + } + @Ignore // Calcite does not support INSERT yet @Test public void testReduceCastsNullable() throws Exception { HepProgram program = new HepProgramBuilder() http://git-wip-us.apache.org/repos/asf/calcite/blob/d32ee5c3/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 a702384..7d90b75 100644 --- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml @@ -6183,6 +6183,23 @@ LogicalProject(EXPR$0=[CASE(=($1, 0), null, $0)]) ]]> </Resource> </TestCase> + <TestCase name="testReduceCaseNullabilityChange"> + <Resource name="sql"> + <![CDATA[select case when empno = 1 then 1 when 1 IS NOT NULL then 2 else null end as qx from emp]]> + </Resource> + <Resource name="planBefore"> + <![CDATA[ +LogicalProject(QX=[CASE(=($0, 1), 1, IS NOT NULL(1), 2, null)]) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) +]]> + </Resource> + <Resource name="planAfter"> + <![CDATA[ +LogicalProject(QX=[CAST(CASE(=($0, 1), 1, 2)):INTEGER]) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) +]]> + </Resource> + </TestCase> <TestCase name="testReduceConstantsDynamicFunction"> <Resource name="sql"> <