diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java index c33463fd79d0..31fe0b4cc1c2 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java @@ -190,7 +190,11 @@ protected void onMatch() { return; } - if (subset.set.equivalentSet != null) { + if ((subset.set.equivalentSet != null) + // When rename RelNode via VolcanoPlanner#rename(RelNode rel), + // we may remove rel from its subset: "subset.set.rels.remove(rel)". + // Skip rule match when the rel has been removed from set. + || (subset != rel && !subset.getRelList().contains(rel))) { LOGGER.debug( "Rule [{}] not fired because operand #{} ({}) belongs to obsolete set", getRule(), i, rel);