This is an automated email from the ASF dual-hosted git repository.
danny0405 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/master by this push:
new ac51ce7 [CALCITE-4053] RexSimplify should not pass exprs containing
non-const subExprs to RexExecutor (Shuo Cheng)
ac51ce7 is described below
commit ac51ce70b79f58e463c409f3b36f6ba2790b4369
Author: shuo.cs <[email protected]>
AuthorDate: Tue Jun 9 13:47:51 2020 +0800
[CALCITE-4053] RexSimplify should not pass exprs containing non-const
subExprs to RexExecutor (Shuo Cheng)
Currently in RexSimplify#simplifyCast, if an expression is judged as a
const expression but the outer CAST can not be removed, we pass the
original expression to RexExecutor to reduce the expression which may
leads to unexpected exception when the original expression contains
RexInputRef.
close apache/calcite#2012
---
core/src/main/java/org/apache/calcite/rex/RexSimplify.java | 3 ++-
.../java/org/apache/calcite/test/SqlToRelConverterTest.java | 5 +++++
.../org/apache/calcite/test/SqlToRelConverterTest.xml | 13 +++++++++++++
3 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
index 41eceb2..f43da20 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
@@ -1950,7 +1950,8 @@ public class RexSimplify {
break;
}
final List<RexNode> reducedValues = new ArrayList<>();
- executor.reduce(rexBuilder, ImmutableList.of(e), reducedValues);
+ final RexNode simplifiedExpr = rexBuilder.makeCast(e.getType(), operand);
+ executor.reduce(rexBuilder, ImmutableList.of(simplifiedExpr),
reducedValues);
return Objects.requireNonNull(
Iterables.getOnlyElement(reducedValues));
default:
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 a82a108..114adda 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -2610,6 +2610,11 @@ class SqlToRelConverterTest extends SqlToRelTestBase {
sql(sql).decorrelate(true).ok();
}
+ @Test void testReduceConstExpr() {
+ final String sql = "select sum(case when 'y' = 'n' then ename else 1 end)
from emp";
+ sql(sql).ok();
+ }
+
/**
* Test case for
* <a href="https://issues.apache.org/jira/browse/CALCITE-695">[CALCITE-695]
diff --git
a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
index 1bc57e3..bff936c 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -3717,6 +3717,18 @@ LogicalProject(DEPTNO=[$7])
]]>
</Resource>
</TestCase>
+ <TestCase name="testReduceConstExpr">
+ <Resource name="sql">
+ <![CDATA[select sum(case when 'y' = 'n' then ename else 1 end)
from emp]]>
+ </Resource>
+ <Resource name="plan">
+ <![CDATA[
+LogicalAggregate(group=[{}], EXPR$0=[SUM($0)])
+ LogicalProject($f0=[1:DECIMAL(19, 19)])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+ </Resource>
+ </TestCase>
<TestCase name="testSimplifyNotExistsValuesSubQuery">
<Resource name="sql">
<![CDATA[select deptno
@@ -3731,6 +3743,7 @@ LogicalProject(DEPTNO=[$7])
]]>
</Resource>
</TestCase>
+
<TestCase name="testSubQueryAggregateFunctionFollowedBySimpleOperation">
<Resource name="sql">
<![CDATA[select deptno