diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MergeConsecutiveLimits.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MergeConsecutiveLimits.java index 6442dce0e2..f3e36b1513 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MergeConsecutiveLimits.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MergeConsecutiveLimits.java @@ -21,33 +21,34 @@ import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory; import org.apache.doris.nereids.trees.plans.Plan; +import org.apache.doris.nereids.trees.plans.algebra.Limit; import org.apache.doris.nereids.trees.plans.logical.LogicalLimit; -import java.util.List; - /** - * this rule aims to merge consecutive limits. - * LIMIT1(limit=10, offset=4) + * This rule aims to merge consecutive limits. + *
+ * input plan:
+ *   LIMIT1(limit=10, offset=0)
  *     |
  *   LIMIT2(limit=3, offset=5)
  *
- *   transformed to
- *    LIMITl(limit=3, offset=5)
- *   where
- *   LIMIT.limit = min(LIMIT1.limit, LIMIT2.limit)
- *   LIMIT.offset = LIMIT2.offset
- *   LIMIT1.offset is ignored
+ * output plan:
+ *    LIMIT(limit=3, offset=5)
+ *
+ * merged limit = min(LIMIT1.limit, LIMIT2.limit)
+ * merged offset = LIMIT2.offset
+ * 
+ * Note that the top limit should not have valid offset info. */ public class MergeConsecutiveLimits extends OneRewriteRuleFactory { @Override public Rule build() { - return logicalLimit(logicalLimit()).then(upperLimit -> { + return logicalLimit(logicalLimit()).whenNot(Limit::hasValidOffset).then(upperLimit -> { LogicalLimit bottomLimit = upperLimit.child(); - List children = bottomLimit.children(); return new LogicalLimit<>( Math.min(upperLimit.getLimit(), bottomLimit.getLimit()), bottomLimit.getOffset(), - children.get(0) + bottomLimit.child() ); }).toRule(RuleType.MERGE_CONSECUTIVE_LIMITS); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/MergeConsecutiveLimitsTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/MergeConsecutiveLimitsTest.java index 8d684964a0..7f96a954d6 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/MergeConsecutiveLimitsTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/MergeConsecutiveLimitsTest.java @@ -34,7 +34,7 @@ public class MergeConsecutiveLimitsTest { public void testMergeConsecutiveLimits() { LogicalLimit limit3 = new LogicalLimit<>(3, 5, new UnboundRelation(Lists.newArrayList("db", "t"))); LogicalLimit limit2 = new LogicalLimit<>(2, 0, limit3); - LogicalLimit limit1 = new LogicalLimit<>(10, 2, limit2); + LogicalLimit limit1 = new LogicalLimit<>(10, 0, limit2); CascadesContext context = MemoTestUtils.createCascadesContext(limit1); List rules = Lists.newArrayList(new MergeConsecutiveLimits().build());