You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by li...@apache.org on 2023/01/20 03:27:08 UTC
[calcite] branch main updated: [CALCITE-5466] The constant condition can't be inferred from correlate node
This is an automated email from the ASF dual-hosted git repository.
libenchao 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 fb340ece8c [CALCITE-5466] The constant condition can't be inferred from correlate node
fb340ece8c is described below
commit fb340ece8c5e60ecfd6371950f8dcb665c85a712
Author: Aitozi <yu...@alibaba-inc.com>
AuthorDate: Thu Jan 19 15:06:42 2023 +0800
[CALCITE-5466] The constant condition can't be inferred from correlate node
Close #3035
---
.../calcite/rel/metadata/RelMdPredicates.java | 8 +++++
.../org/apache/calcite/test/RelOptRulesTest.java | 26 +++++++++++++++
.../GeneratedMetadata_PredicatesHandler.java | 2 ++
.../org/apache/calcite/test/RelOptRulesTest.xml | 37 ++++++++++++++++++++++
4 files changed, 73 insertions(+)
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java
index da71912046..969e8a5e5d 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java
@@ -25,6 +25,7 @@ import org.apache.calcite.plan.Strong;
import org.apache.calcite.plan.volcano.RelSubset;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.Aggregate;
+import org.apache.calcite.rel.core.Correlate;
import org.apache.calcite.rel.core.Exchange;
import org.apache.calcite.rel.core.Filter;
import org.apache.calcite.rel.core.Intersect;
@@ -275,6 +276,13 @@ public class RelMdPredicates
return rexBuilder.makeLiteral(true);
}
+ /**
+ * Infers predicates for a correlate node.
+ */
+ public RelOptPredicateList getPredicates(Correlate correlate, RelMetadataQuery mq) {
+ return mq.getPulledUpPredicates(correlate.getLeft());
+ }
+
/**
* Add the Filter condition to the pulledPredicates list from the input.
*/
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 c588197333..7f5dca60b4 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -3002,6 +3002,32 @@ class RelOptRulesTest extends RelOptTestBase {
.withProgram(program).check();
}
+ @Test void testReducingConstantsInferredFromCorrelate() {
+ HepProgram program = new HepProgramBuilder()
+ .addRuleInstance(CoreRules.PROJECT_REDUCE_EXPRESSIONS)
+ .build();
+
+ final String sql = "SELECT ename,\n"
+ + " empno,\n"
+ + " T.empno_r,\n"
+ + " CASE\n"
+ + " WHEN __source__type__ = 'bounded'\n"
+ + " THEN 1\n"
+ + " ELSE 2\n"
+ + " END AS type\n"
+ + "FROM (\n"
+ + " SELECT ename,\n"
+ + " empno,\n"
+ + " 'bounded' AS __source__type__\n"
+ + " FROM emp\n"
+ + " ) a,\n"
+ + " lateral TABLE (ramp(empno)) AS T(empno_r)";
+ sql(sql)
+ .withRelBuilderConfig(c -> c.withSimplifyValues(false))
+ .withProgram(program).check();
+ }
+
+
@Test void testRemoveSemiJoin() {
final String sql = "select e.ename from emp e, dept d\n"
+ "where e.deptno = d.deptno";
diff --git a/core/src/test/resources/org/apache/calcite/rel/metadata/janino/GeneratedMetadata_PredicatesHandler.java b/core/src/test/resources/org/apache/calcite/rel/metadata/janino/GeneratedMetadata_PredicatesHandler.java
index 14149082a5..9ecec20edf 100644
--- a/core/src/test/resources/org/apache/calcite/rel/metadata/janino/GeneratedMetadata_PredicatesHandler.java
+++ b/core/src/test/resources/org/apache/calcite/rel/metadata/janino/GeneratedMetadata_PredicatesHandler.java
@@ -64,6 +64,8 @@ public final class GeneratedMetadata_PredicatesHandler
return provider0.getPredicates((org.apache.calcite.plan.volcano.RelSubset) r, mq);
} else if (r instanceof org.apache.calcite.rel.core.Aggregate) {
return provider0.getPredicates((org.apache.calcite.rel.core.Aggregate) r, mq);
+ } else if (r instanceof org.apache.calcite.rel.core.Correlate) {
+ return provider0.getPredicates((org.apache.calcite.rel.core.Correlate) r, mq);
} else if (r instanceof org.apache.calcite.rel.core.Exchange) {
return provider0.getPredicates((org.apache.calcite.rel.core.Exchange) r, mq);
} else if (r instanceof org.apache.calcite.rel.core.Filter) {
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 321eebfb36..21dcf77334 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -11751,6 +11751,43 @@ LogicalProject(EXPR$0=[$0], EXPR$1=[CAST(/($1, $2)):INTEGER])
LogicalAggregate(group=[{}], EXPR$0=[AVG($0)], agg#1=[$SUM0($0) WITHIN DISTINCT ($1)], agg#2=[COUNT() WITHIN DISTINCT ($1)])
LogicalProject(SAL=[$5], DEPTNO=[$7])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testReducingConstantsInferredFromCorrelate">
+ <Resource name="sql">
+ <![CDATA[SELECT ename,
+ empno,
+ T.empno_r,
+ CASE
+ WHEN __source__type__ = 'bounded'
+ THEN 1
+ ELSE 2
+ END AS type
+FROM (
+ SELECT ename,
+ empno,
+ 'bounded' AS __source__type__
+ FROM emp
+ ) a,
+ lateral TABLE (ramp(empno)) AS T(empno_r)]]>
+ </Resource>
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalProject(ENAME=[$0], EMPNO=[$1], EMPNO_R=[$3], TYPE=[CASE(=($2, 'bounded'), 1, 2)])
+ LogicalCorrelate(correlation=[$cor0], joinType=[inner], requiredColumns=[{1}])
+ LogicalProject(ENAME=[$1], EMPNO=[$0], __SOURCE__TYPE__=['bounded'])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+ LogicalTableFunctionScan(invocation=[RAMP($cor0.EMPNO)], rowType=[RecordType(INTEGER I)])
+]]>
+ </Resource>
+ <Resource name="planAfter">
+ <![CDATA[
+LogicalProject(ENAME=[$0], EMPNO=[$1], EMPNO_R=[$3], TYPE=[1])
+ LogicalCorrelate(correlation=[$cor0], joinType=[inner], requiredColumns=[{1}])
+ LogicalProject(ENAME=[$1], EMPNO=[$0], __SOURCE__TYPE__=['bounded'])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+ LogicalTableFunctionScan(invocation=[RAMP($cor0.EMPNO)], rowType=[RecordType(INTEGER I)])
]]>
</Resource>
</TestCase>