From 8734c8152416a7e974ce18da1e80cbb7ce2bed29 Mon Sep 17 00:00:00 2001 From: xiedeyantu Date: Sat, 4 Apr 2026 00:16:32 +0800 Subject: [PATCH] Add test cases for SetOpToFilterRule to verify that PROJECT containing non-deterministic expressions and subqueries are not merged --- .../apache/calcite/test/RelOptRulesTest.java | 26 ++++++++++ .../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 1009d3688e1..bd983836d21 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 * [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 f04ced869df..ece2ad5258a 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]]) +]]> + + + + + + + + @@ -21520,6 +21541,37 @@ LogicalUnion(all=[false]) LogicalAggregate(group=[{0, 1}]) LogicalProject(MGR=[$3], COMM=[$6]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) +]]> + + + + + + + +