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));
+    }
+  }
 }

Reply via email to