This is an automated email from the ASF dual-hosted git repository.

zhenchen 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 a51df251a4 Add test cases for SetOpToFilterRule to verify that PROJECT 
containing non-deterministic expressions and subqueries are not merged
a51df251a4 is described below

commit a51df251a4953cc45b98babd4bcc524358ad74c7
Author: Zhen Chen <[email protected]>
AuthorDate: Sat Apr 4 00:16:32 2026 +0800

    Add test cases for SetOpToFilterRule to verify that PROJECT containing 
non-deterministic expressions and subqueries are not merged
---
 .../org/apache/calcite/test/RelOptRulesTest.java   | 26 +++++++++++
 .../org/apache/calcite/test/RelOptRulesTest.xml    | 52 ++++++++++++++++++++++
 2 files changed, 78 insertions(+)

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 1009d3688e..bd983836d2 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -11395,6 +11395,32 @@ private void 
checkLoptOptimizeJoinRule(LoptOptimizeJoinRule rule) {
         .check();
   }
 
+  // If the PROJECT clause contains non-deterministic expressions,
+  // they will not be merged.
+  @Test void testUnionToFilterRuleWithNonDeterministicProject() {
+    final String sql = "SELECT mgr, comm, rand() FROM emp WHERE mgr = 12\n"
+        + "UNION\n"
+        + "SELECT mgr, comm, rand() FROM emp WHERE comm = 5\n";
+    sql(sql)
+        .withPreRule(CoreRules.PROJECT_FILTER_TRANSPOSE)
+        .withRule(CoreRules.UNION_FILTER_TO_FILTER)
+        .checkUnchanged();
+  }
+
+  // If the projection contains a subquery, merging will not be performed.
+  @Test void testUnionToFilterRuleWithSubqueryProject() {
+    final String sql = "SELECT 1, (SELECT COUNT(*) FROM dept)\n"
+        + "FROM emp WHERE mgr = 12\n"
+        + "UNION\n"
+        + "SELECT 1, (SELECT COUNT(*) FROM dept)\n"
+        + "FROM emp WHERE comm = 5\n";
+
+    sql(sql)
+        .withPreRule(CoreRules.PROJECT_FILTER_TRANSPOSE)
+        .withRule(CoreRules.UNION_FILTER_TO_FILTER)
+        .checkUnchanged();
+  }
+
   /** Test case of
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7002";>[CALCITE-7002]
    * Create an optimization rule to eliminate UNION
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 f04ced869d..ece2ad5258 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -21495,6 +21495,27 @@ LogicalUnion(all=[false])
   LogicalFilter(condition=[SEARCH($0, Sarg[5, 10])])
     LogicalProject(DEPTNO=[$0])
       LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+    </Resource>
+  </TestCase>
+  <TestCase name="testUnionToFilterRuleWithNonDeterministicProject">
+    <Resource name="sql">
+      <![CDATA[SELECT mgr, comm, rand() FROM emp WHERE mgr = 12
+UNION
+SELECT mgr, comm, rand() FROM emp WHERE comm = 5
+]]>
+    </Resource>
+    <Resource name="planBefore">
+      <![CDATA[
+LogicalUnion(all=[false])
+  LogicalProject(MGR=[$0], COMM=[$1], EXPR$2=[RAND()])
+    LogicalFilter(condition=[=($0, 12)])
+      LogicalProject(MGR=[$3], COMM=[$6])
+        LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+  LogicalProject(MGR=[$0], COMM=[$1], EXPR$2=[RAND()])
+    LogicalFilter(condition=[=($1, 5)])
+      LogicalProject(MGR=[$3], COMM=[$6])
+        LogicalTableScan(table=[[CATALOG, SALES, EMP]])
 ]]>
     </Resource>
   </TestCase>
@@ -21520,6 +21541,37 @@ LogicalUnion(all=[false])
 LogicalAggregate(group=[{0, 1}])
   LogicalProject(MGR=[$3], COMM=[$6])
     LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+    </Resource>
+  </TestCase>
+  <TestCase name="testUnionToFilterRuleWithSubqueryProject">
+    <Resource name="sql">
+      <![CDATA[SELECT 1, (SELECT COUNT(*) FROM dept)
+FROM emp WHERE mgr = 12
+UNION
+SELECT 1, (SELECT COUNT(*) FROM dept)
+FROM emp WHERE comm = 5
+]]>
+    </Resource>
+    <Resource name="planBefore">
+      <![CDATA[
+LogicalUnion(all=[false])
+  LogicalProject(EXPR$0=[1], EXPR$1=[$SCALAR_QUERY({
+LogicalAggregate(group=[{}], EXPR$0=[COUNT()])
+  LogicalProject($f0=[0])
+    LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+})])
+    LogicalFilter(condition=[=($0, 12)])
+      LogicalProject(MGR=[$3])
+        LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+  LogicalProject(EXPR$0=[1], EXPR$1=[$SCALAR_QUERY({
+LogicalAggregate(group=[{}], EXPR$0=[COUNT()])
+  LogicalProject($f0=[0])
+    LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+})])
+    LogicalFilter(condition=[=($0, 5)])
+      LogicalProject(COMM=[$6])
+        LogicalTableScan(table=[[CATALOG, SALES, EMP]])
 ]]>
     </Resource>
   </TestCase>

Reply via email to