This is an automated email from the ASF dual-hosted git repository.

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 0d117a8c6e2 [fix](Nereids): merge Offset in Limit Translator #29100 
#29142 (#29224)
0d117a8c6e2 is described below

commit 0d117a8c6e2e176748b0a960d3d9aaf4def8125c
Author: jakevin <[email protected]>
AuthorDate: Thu Dec 28 21:26:04 2023 +0800

    [fix](Nereids): merge Offset in Limit Translator #29100 #29142 (#29224)
---
 .../glue/translator/PhysicalPlanTranslator.java        |  5 +++--
 .../doris/nereids/rules/rewrite/MergeLimits.java       | 18 ++++++++++++++----
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index 0f5b5dd597d..a554df0ac15 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -66,6 +66,7 @@ import 
org.apache.doris.nereids.properties.DistributionSpecStorageGather;
 import org.apache.doris.nereids.properties.OrderKey;
 import org.apache.doris.nereids.properties.PhysicalProperties;
 import 
org.apache.doris.nereids.rules.implementation.LogicalWindowToPhysicalWindow.WindowFrameGroup;
+import org.apache.doris.nereids.rules.rewrite.MergeLimits;
 import org.apache.doris.nereids.stats.StatsErrorEstimator;
 import org.apache.doris.nereids.trees.UnaryNode;
 import org.apache.doris.nereids.trees.expressions.AggregateExpression;
@@ -1548,8 +1549,8 @@ public class PhysicalPlanTranslator extends 
DefaultPlanVisitor<PlanFragment, Pla
     public PlanFragment visitPhysicalLimit(PhysicalLimit<? extends Plan> 
physicalLimit, PlanTranslatorContext context) {
         PlanFragment inputFragment = physicalLimit.child(0).accept(this, 
context);
         PlanNode child = inputFragment.getPlanRoot();
-        child.setOffset(physicalLimit.getOffset());
-        child.setLimit(physicalLimit.getLimit());
+        child.setLimit(MergeLimits.mergeLimit(physicalLimit.getLimit(), 
physicalLimit.getOffset(), child.getLimit()));
+        child.setOffset(MergeLimits.mergeOffset(physicalLimit.getOffset(), 
child.getOffset()));
         updateLegacyPlanIdToPhysicalPlan(child, physicalLimit);
         return inputFragment;
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MergeLimits.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MergeLimits.java
index 0621e70b707..e544eed07ce 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MergeLimits.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MergeLimits.java
@@ -47,11 +47,21 @@ public class MergeLimits extends OneRewriteRuleFactory {
                 .then(upperLimit -> {
                     LogicalLimit<? extends Plan> bottomLimit = 
upperLimit.child();
                     return new LogicalLimit<>(
-                            Math.min(upperLimit.getLimit(),
-                                    Math.max(bottomLimit.getLimit() - 
upperLimit.getOffset(), 0)),
-                            bottomLimit.getOffset() + upperLimit.getOffset(),
-                            upperLimit.getPhase(), bottomLimit.child()
+                            mergeLimit(upperLimit.getLimit(), 
upperLimit.getOffset(), bottomLimit.getLimit()),
+                            mergeOffset(upperLimit.getOffset(), 
bottomLimit.getOffset()),
+                            upperLimit.child().getPhase(), bottomLimit.child()
                     );
                 }).toRule(RuleType.MERGE_LIMITS);
     }
+
+    public static long mergeOffset(long upperOffset, long bottomOffset) {
+        return upperOffset + bottomOffset;
+    }
+
+    public static long mergeLimit(long upperLimit, long upperOffset, long 
bottomLimit) {
+        if (bottomLimit < 0) {
+            return upperLimit;
+        }
+        return Math.min(upperLimit, Math.max(bottomLimit - upperOffset, 0));
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to