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>