This is an automated email from the ASF dual-hosted git repository.
mbudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 50a4ee02c6 [CALCITE-7065] CoreRules.PROJECT_REDUCE_EXPRESSIONS crashes
when applied to a lambda
50a4ee02c6 is described below
commit 50a4ee02c67d348e35a1a1c4c9ba765a12d44ac1
Author: Mihai Budiu <[email protected]>
AuthorDate: Sat Jun 21 01:37:33 2025 +0200
[CALCITE-7065] CoreRules.PROJECT_REDUCE_EXPRESSIONS crashes when applied to
a lambda
Signed-off-by: Mihai Budiu <[email protected]>
---
.../org/apache/calcite/rel/rules/ReduceExpressionsRule.java | 10 ++++++++++
.../test/java/org/apache/calcite/test/RelOptRulesTest.java | 11 +++++++++++
.../resources/org/apache/calcite/test/RelOptRulesTest.xml | 11 +++++++++++
3 files changed, 32 insertions(+)
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 54dc204885..783e3b7bb1 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
@@ -44,6 +44,8 @@
import org.apache.calcite.rex.RexExecutor;
import org.apache.calcite.rex.RexFieldAccess;
import org.apache.calcite.rex.RexInputRef;
+import org.apache.calcite.rex.RexLambda;
+import org.apache.calcite.rex.RexLambdaRef;
import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.rex.RexLocalRef;
import org.apache.calcite.rex.RexNode;
@@ -1185,6 +1187,14 @@ private void analyzeCall(RexCall call, Constancy
callConstancy) {
@Override public Void visitFieldAccess(RexFieldAccess fieldAccess) {
return pushVariable();
}
+
+ @Override public Void visitLambda(RexLambda lambda) {
+ return pushVariable();
+ }
+
+ @Override public Void visitLambdaRef(RexLambdaRef lambda) {
+ return pushVariable();
+ }
}
/** Shuttle that pushes predicates into a CASE. */
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 f6885722d8..b8241d4e1b 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -2941,6 +2941,17 @@ private void
checkProjectCorrelateTransposeRuleSemiOrAntiCorrelate(JoinRelType t
sql(sql).withRule(CoreRules.PROJECT_JOIN_TRANSPOSE).check();
}
+ /** Test case for <a
href="https://issues.apache.org/jira/browse/CALCITE-7065">[CALCITE-7065]
+ * CoreRules.PROJECT_REDUCE_EXPRESSIONS crashes when applied to a
lambda</a>. */
+ @Test void testReduceLambda() {
+ final String sql = "select \"EXISTS\"(ARRAY[1], x -> true)";
+ sql(sql)
+ .withFactory(f ->
+ f.withOperatorTable(opTab ->
+ SqlValidatorTest.operatorTableFor(SqlLibrary.SPARK)))
+ .withRule(CoreRules.PROJECT_REDUCE_EXPRESSIONS).checkUnchanged();
+ }
+
@Test void testPushProjectPastLeftJoin() {
final String sql = "select count(*), " + NOT_STRONG_EXPR + "\n"
+ "from emp e left outer join bonus b on e.ename = b.ename\n"
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 9af18bbb62..d74fdacc52 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -15371,6 +15371,17 @@ LogicalProject(USER=['happyCalciteUser':VARCHAR(2000)])
LogicalProject(COL1=[$0])
LogicalFilter(condition=[NOT($0)])
LogicalValues(tuples=[[{ false }, { true }]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testReduceLambda">
+ <Resource name="sql">
+ <![CDATA[select "EXISTS"(ARRAY[1], x -> true)]]>
+ </Resource>
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalProject(EXPR$0=[EXISTS(ARRAY(1), (X) -> true)])
+ LogicalValues(tuples=[[{ 0 }]])
]]>
</Resource>
</TestCase>