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 2022/03/04 13:24:32 UTC

[calcite] 28/41: [CALCITE-4995] AssertionError caused by RelFieldTrimmer on SEMI/ANTI join

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 <ru...@gmail.com>
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));
+    }
+  }
 }