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>

Reply via email to