This is an automated email from the ASF dual-hosted git repository. liyafan pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/calcite.git
commit 4663f3317d44d02544389dd36647d961f11ee963 Author: rubenada <[email protected]> AuthorDate: Mon Jan 31 13:22:32 2022 +0000 [CALCITE-4995] AssertionError caused by RelFieldTrimmer on SEMI/ANTI join --- .../apache/calcite/sql2rel/RelFieldTrimmer.java | 2 +- .../calcite/sql2rel/RelFieldTrimmerTest.java | 32 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java index 151ff57..fff44d9 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java @@ -854,7 +854,7 @@ public class RelFieldTrimmer implements ReflectiveVisitor { if (changeCount == 0 && mapping.isIdentity()) { - return result(join, Mappings.createIdentity(fieldCount)); + return result(join, Mappings.createIdentity(join.getRowType().getFieldCount())); } // Build new join. diff --git a/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java b/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java index 621af1b..81d3620 100644 --- a/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java +++ b/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java @@ -484,4 +484,36 @@ class RelFieldTrimmerTest { + " LogicalTableScan(table=[[scott, EMP]])\n"; assertThat(trimmed, hasTree(expected)); } + + /** Test case for + * <a href="https://issues.apache.org/jira/browse/CALCITE-4995">[CALCITE-4995] + * AssertionError caused by RelFieldTrimmer on SEMI/ANTI join</a>. */ + @Test void testSemiJoinAntiJoinFieldTrimmer() { + for (final JoinRelType joinType : new JoinRelType[]{JoinRelType.ANTI, JoinRelType.SEMI}) { + final RelBuilder builder = RelBuilder.create(config().build()); + final RelNode root = builder + .values(new String[]{"id"}, 1, 2).as("a") + .values(new String[]{"id"}, 2, 3).as("b") + .join(joinType, + builder.equals( + builder.field(2, "a", "id"), + builder.field(2, "b", "id"))) + .values(new String[]{"id"}, 0, 2).as("c") + .join(joinType, + builder.equals( + builder.field(2, "a", "id"), + builder.field(2, "c", "id"))) + .build(); + + final RelFieldTrimmer fieldTrimmer = new RelFieldTrimmer(null, builder); + final RelNode trimmed = fieldTrimmer.trim(root); + final String expected = "" + + "LogicalJoin(condition=[=($0, $1)], joinType=[" + joinType.lowerName + "])\n" + + " LogicalJoin(condition=[=($0, $1)], joinType=[" + joinType.lowerName + "])\n" + + " LogicalValues(tuples=[[{ 1 }, { 2 }]])\n" + + " LogicalValues(tuples=[[{ 2 }, { 3 }]])\n" + + " LogicalValues(tuples=[[{ 0 }, { 2 }]])\n"; + assertThat(trimmed, hasTree(expected)); + } + } }
