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