有没有一种方法可以从连接过滤器和其他过滤器中导出等效过滤器?

Is there a method to derive equivalent filters from join filters and others?

Q1:

select * from t1, t2 where t1.a = t2.b and t1.a = 2;

相当于follow query

Q2:

select * from t1, t2 where t1.a = t2.b and t1.a = 2 and t2.b = 2;

现在,我使用 Apache Calcites 生成 Q1 计划,并使用 FilterJoinRule.FILTER_ON_JOINFilterJoinRule.JOIN 对其进行优化。但是这些规则不会导出额外的过滤器 t2.b = 2.

是否有任何规则或方法可以在 Calcite 上导出等效滤波器?谢谢。

如果没有,我想支持一下。有什么建议吗?

我认为您需要 JoinPushTransitivePredicatesRule or something similar. It works by inferring a RelOptPredicateList 来自联接中的谓词并出现在输入中,将这些谓词传播到联接另一侧的列,并在可能的情况下将它们下推到输入。

例如给定

SELECT *
FROM (SELECT * FROM Emp WHERE deptno >= 10) AS e
JOIN Dept AS d
    ON e.deptno = d.deptno

规则可以拉起 Emp 上的谓词,将其移动到连接中,并将其向下推到 Dept,从而导致

SELECT *
FROM (SELECT * FROM Emp WHERE deptno >= 10) AS e
JOIN (SELECT * FROM Dept WHERE deptno >= 10) AS d
    ON e.deptno = d.deptno 

如果 ON 子句中有谓词,那么它也可以传播和传播。