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 800e84d852 [CALCITE-7319] FILTER_INTO_JOIN rule loses correlation
variable context in HepPlanner
800e84d852 is described below
commit 800e84d8529c5699d2493f290f9b2be945f7fac1
Author: Zhen Chen <[email protected]>
AuthorDate: Wed Dec 10 21:04:13 2025 +0800
[CALCITE-7319] FILTER_INTO_JOIN rule loses correlation variable context in
HepPlanner
---
.../apache/calcite/rel/rules/FilterJoinRule.java | 5 ++++
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 29 ++++++++++++++++++++++
2 files changed, 34 insertions(+)
diff --git
a/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java
b/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java
index 8e58173c4b..e80ac4150d 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java
@@ -84,6 +84,11 @@ protected void perform(RelOptRuleCall call, @Nullable Filter
filter,
return;
}
+ if (filter != null
+ && RexUtil.containsCorrelation(filter.getCondition())) {
+ return;
+ }
+
final List<RexNode> aboveFilters =
filter != null
? getConjunctions(filter)
diff --git
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
index a4f78852fb..6189182132 100644
---
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
+++
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
@@ -11025,6 +11025,35 @@ private void checkLiteral2(String expression, String
expected) {
.ok(expected);
}
+ /** Test case of
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-7319">[CALCITE-7319]
+ * FILTER_INTO_JOIN rule loses correlation variable context in
HepPlanner</a>. */
+ @Test void testFilterIntoJoinMissingVariableCor() {
+ final String sql = "SELECT E.EMPNO\n"
+ + "FROM EMP E\n"
+ + "JOIN DEPT D ON E.DEPTNO = D.DEPTNO\n"
+ + "WHERE D.DEPTNO = (\n"
+ + " SELECT MIN(D_INNER.DEPTNO)\n"
+ + " FROM DEPT D_INNER\n"
+ + " WHERE D_INNER.DEPTNO = E.DEPTNO)";
+ final String expected = "SELECT \"EMP\".\"EMPNO\"\n"
+ + "FROM \"SCOTT\".\"EMP\"\n"
+ + "INNER JOIN \"SCOTT\".\"DEPT\" ON \"EMP\".\"DEPTNO\" =
\"DEPT\".\"DEPTNO\"\n"
+ + "WHERE \"DEPT\".\"DEPTNO\" = (((SELECT MIN(\"DEPTNO\")\n"
+ + "FROM \"SCOTT\".\"DEPT\"\n"
+ + "WHERE \"DEPTNO\" = \"EMP\".\"DEPTNO\")))";
+
+ HepProgramBuilder builder = new HepProgramBuilder();
+ builder.addRuleClass(FilterJoinRule.FilterIntoJoinRule.class);
+ HepPlanner hepPlanner = new HepPlanner(builder.build());
+ RuleSet rules = RuleSets.ofList(CoreRules.FILTER_INTO_JOIN);
+ sql(sql)
+ .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
+ .withCalcite()
+ .optimize(rules, hepPlanner)
+ .ok(expected);
+ }
+
/** Fluid interface to run tests. */
static class Sql {
private final CalciteAssert.SchemaSpec schemaSpec;