diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/plan/TableScanNode.java b/core/trino-main/src/main/java/io/trino/sql/planner/plan/TableScanNode.java index 61aa6f0fc62b..03461f80a592 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/plan/TableScanNode.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/plan/TableScanNode.java @@ -19,6 +19,7 @@ import com.google.common.collect.ImmutableMap; import io.trino.metadata.TableHandle; import io.trino.spi.connector.ColumnHandle; +import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.TupleDomain; import io.trino.sql.planner.Symbol; @@ -26,10 +27,14 @@ import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Set; import static com.google.common.base.MoreObjects.toStringHelper; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; +import static com.google.common.collect.ImmutableSet.toImmutableSet; +import static java.lang.String.format; import static java.util.Objects.requireNonNull; @Immutable @@ -93,6 +98,26 @@ public TableScanNode( checkArgument(assignments.keySet().containsAll(outputs), "assignments does not cover all of outputs"); this.enforcedConstraint = requireNonNull(enforcedConstraint, "enforcedConstraint is null"); this.forDelete = forDelete; + + if (!enforcedConstraint.isAll() && !enforcedConstraint.isNone()) { + Map domains = enforcedConstraint.getDomains().orElseThrow(); + + Set visibleColumns = outputs.stream() + .map(assignments::get) + .map(Objects::requireNonNull) + .collect(toImmutableSet()); + + domains.keySet().stream() + .filter(column -> !visibleColumns.contains(column)) + .findAny() + .ifPresent(column -> { + throw new IllegalArgumentException(format( + "enforcedConstraint references a column that is not part of the plan. " + + "enforcedConstraint keys: %s, visibleColumns: %s", + domains.keySet(), + visibleColumns)); + }); + } } @JsonProperty("table") diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestApplyTableScanRedirection.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestApplyTableScanRedirection.java index 7e443ba027b6..2dabd94ae89d 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestApplyTableScanRedirection.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestApplyTableScanRedirection.java @@ -235,7 +235,7 @@ public void testApplyTableScanRedirectionWithFilter() createTableHandle(new MockConnectorTableHandle(SOURCE_TABLE, constraint, Optional.empty())), ImmutableList.of(column), ImmutableMap.of(column, SOURCE_COLUMN_HANDLE_B), // predicate on non-projected column - constraint); + TupleDomain.all()); }) .withSession(MOCK_SESSION) .matches(