From 63ff58ed0f90c3b0ef4fedc241bb3160c9652f0c Mon Sep 17 00:00:00 2001 From: AestheticAkhmad Date: Fri, 3 Apr 2026 21:33:47 +0200 Subject: [PATCH] [CALCITE-7354] Add assertion that the size of the Project's variablesSet should be less than or equal to 1 --- .../calcite/sql2rel/RelFieldTrimmer.java | 4 +++ .../calcite/sql2rel/RelFieldTrimmerTest.java | 28 +++++++++++++++++++ 2 files changed, 32 insertions(+) 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 48cb1f052139..93a35baae158 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java @@ -89,6 +89,8 @@ import java.util.List; import java.util.Set; +import static com.google.common.base.Preconditions.checkArgument; + import static java.util.Objects.requireNonNull; /** @@ -533,6 +535,8 @@ public TrimResult trimFields( Project project, ImmutableBitSet fieldsUsed, Set extraFields) { + checkArgument(project.getVariablesSet().size() <= 1, + "RelFieldTrimmer allows only one correlation variable in variablesSet"); final RelDataType rowType = project.getRowType(); final int fieldCount = rowType.getFieldCount(); final RelNode input = project.getInput(); 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 86623ccb0aa8..e8732f5ecb12 100644 --- a/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java +++ b/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java @@ -25,12 +25,14 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Aggregate; import org.apache.calcite.rel.core.Calc; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Join; import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.core.Project; import org.apache.calcite.rel.hint.HintPredicates; import org.apache.calcite.rel.hint.HintStrategyTable; import org.apache.calcite.rel.hint.RelHint; +import org.apache.calcite.rel.logical.LogicalProject; import org.apache.calcite.rel.rules.CoreRules; import org.apache.calcite.rex.RexCorrelVariable; import org.apache.calcite.rex.RexNode; @@ -57,6 +59,8 @@ import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; /** Test for {@link RelFieldTrimmer}. */ @@ -826,4 +830,28 @@ public static Frameworks.ConfigBuilder config() { assertThat(trimmed, hasTree(expected)); } + /** + * Test case for + * [CALCITE-7354] + * Project's variablesSet should be less than or equal to 1.. + */ + @Test void testTrimProjectRejectsMultipleCorrelationVariables() { + final RelBuilder builder = RelBuilder.create(config().build()); + final RelNode scan = builder.scan("EMP").build(); + final RexNode empno = + scan.getCluster().getRexBuilder().makeInputRef(scan, 0); + final LogicalProject project = + LogicalProject.create( + scan, + ImmutableList.of(), + ImmutableList.of(empno), + ImmutableList.of("EMPNO"), + ImmutableSet.of(new CorrelationId(0), new CorrelationId(1))); + + final RelFieldTrimmer fieldTrimmer = new RelFieldTrimmer(null, builder); + final IllegalArgumentException ex = + assertThrows(IllegalArgumentException.class, () -> fieldTrimmer.trim(project)); + assertThat(ex.getMessage(), containsString("variablesSet")); + } + }