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

morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 6b1a74af61 [Enhancement](planner&Nereids) support sql_select_limit for 
master (#21138)
6b1a74af61 is described below

commit 6b1a74af615c66b0b4ec8952311290c1cc07b6f9
Author: mch_ucchi <41606806+sohardforan...@users.noreply.github.com>
AuthorDate: Fri Jul 7 17:18:38 2023 +0800

    [Enhancement](planner&Nereids) support sql_select_limit for master (#21138)
    
    support sql_select_limit for original planner and Nereids.
    if enable the variable
    In original planner, add limit to the top planNode
    In Nereids, add limit node to the top in preprocess phase.
---
 .../doris/nereids/jobs/executor/Rewriter.java      |   2 +
 .../org/apache/doris/nereids/rules/RuleType.java   |   1 +
 .../nereids/rules/analysis/AddDefaultLimit.java    |  96 ++++++++
 .../apache/doris/planner/SingleNodePlanner.java    |  51 +++--
 .../session_variable/test_default_limit.groovy     | 253 +++++++++++++++++++++
 .../session_variable/test_default_limit.groovy     | 251 ++++++++++++++++++++
 6 files changed, 636 insertions(+), 18 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
index 97af7cc14d..d1d33d2514 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
@@ -22,6 +22,7 @@ import org.apache.doris.nereids.jobs.rewrite.RewriteJob;
 import org.apache.doris.nereids.processor.pre.EliminateLogicalSelectHint;
 import org.apache.doris.nereids.rules.RuleSet;
 import org.apache.doris.nereids.rules.RuleType;
+import org.apache.doris.nereids.rules.analysis.AddDefaultLimit;
 import 
org.apache.doris.nereids.rules.analysis.AdjustAggregateNullableForEmptySet;
 import org.apache.doris.nereids.rules.analysis.AvgDistinctToSumDivCount;
 import org.apache.doris.nereids.rules.analysis.CheckAfterRewrite;
@@ -103,6 +104,7 @@ public class Rewriter extends AbstractBatchJobExecutor {
 
     public static final List<RewriteJob> REWRITE_JOBS = jobs(
             bottomUp(new InlineCTE()),
+            custom(RuleType.ADD_DEFAULT_LIMIT, AddDefaultLimit::new),
             topic("Plan Normalization",
                     topDown(
                             new EliminateOrderByConstant(),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
index 9427296d34..8c371457a1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
@@ -77,6 +77,7 @@ public enum RuleType {
     ADJUST_NULLABLE_FOR_AGGREGATE_SLOT(RuleTypeClass.REWRITE),
     ADJUST_NULLABLE_FOR_HAVING_SLOT(RuleTypeClass.REWRITE),
     ADJUST_NULLABLE_FOR_REPEAT_SLOT(RuleTypeClass.REWRITE),
+    ADD_DEFAULT_LIMIT(RuleTypeClass.REWRITE),
 
     CHECK_ROW_POLICY(RuleTypeClass.REWRITE),
     CHECK_TYPE_TO_INSERT_TARGET_COLUMN(RuleTypeClass.REWRITE),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AddDefaultLimit.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AddDefaultLimit.java
new file mode 100644
index 0000000000..47cb8469dd
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AddDefaultLimit.java
@@ -0,0 +1,96 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.rules.analysis;
+
+import org.apache.doris.nereids.StatementContext;
+import org.apache.doris.nereids.analyzer.UnboundOlapTableSink;
+import org.apache.doris.nereids.jobs.JobContext;
+import org.apache.doris.nereids.trees.plans.LimitPhase;
+import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalCTE;
+import org.apache.doris.nereids.trees.plans.logical.LogicalLimit;
+import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalSort;
+import org.apache.doris.nereids.trees.plans.visitor.CustomRewriter;
+import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanRewriter;
+import org.apache.doris.qe.ConnectContext;
+
+/**
+ * add limit node to the top of the plan tree if sql_select_limit or 
default_order_by_limit is set.
+ */
+public class AddDefaultLimit extends DefaultPlanRewriter<StatementContext> 
implements CustomRewriter {
+
+    @Override
+    public Plan rewriteRoot(Plan plan, JobContext jobContext) {
+        return plan.accept(this, 
jobContext.getCascadesContext().getStatementContext());
+    }
+
+    @Override
+    public Plan visit(Plan plan, StatementContext context) {
+        // check if children contain logical sort and add limit.
+        ConnectContext ctx = context.getConnectContext();
+        if (ctx != null) {
+            long defaultLimit = ctx.getSessionVariable().sqlSelectLimit;
+            if (defaultLimit >= 0 && defaultLimit < Long.MAX_VALUE) {
+                return new LogicalLimit<>(defaultLimit, 0, LimitPhase.ORIGIN, 
plan);
+            }
+        }
+        return plan;
+    }
+
+    @Override
+    public LogicalPlan visitLogicalLimit(LogicalLimit<? extends Plan> limit, 
StatementContext context) {
+        return limit;
+    }
+
+    @Override
+    public LogicalPlan visitLogicalCTE(LogicalCTE<? extends Plan> cte, 
StatementContext context) {
+        Plan child = cte.child().accept(this, context);
+        return ((LogicalPlan) cte.withChildren(child));
+    }
+
+    // we should keep that sink node is the top node of the plan tree.
+    // currently, it's one of the olap table sink and file sink.
+    @Override
+    public LogicalPlan visitUnboundOlapTableSink(UnboundOlapTableSink<? 
extends Plan> sink, StatementContext context) {
+        Plan child = sink.child().accept(this, context);
+        return ((LogicalPlan) sink.withChildren(child));
+    }
+
+    @Override
+    public LogicalPlan visitLogicalSort(LogicalSort<? extends Plan> sort, 
StatementContext context) {
+        ConnectContext ctx = context.getConnectContext();
+        if (ctx != null) {
+            long defaultLimit = ctx.getSessionVariable().defaultOrderByLimit;
+            long sqlLimit = ctx.getSessionVariable().sqlSelectLimit;
+            if (defaultLimit >= 0 || sqlLimit >= 0) {
+                if (defaultLimit < 0) {
+                    defaultLimit = Long.MAX_VALUE;
+                }
+                if (sqlLimit < 0) {
+                    sqlLimit = Long.MAX_VALUE;
+                }
+                defaultLimit = Math.min(sqlLimit, defaultLimit);
+                if (defaultLimit < Long.MAX_VALUE) {
+                    return new LogicalLimit<>(defaultLimit, 0, 
LimitPhase.ORIGIN, sort);
+                }
+            }
+        }
+        return sort;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
index 4bb5ae4309..82495ce243 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
@@ -180,8 +180,12 @@ public class SingleNodePlanner {
         if (LOG.isTraceEnabled()) {
             LOG.trace("desctbl: " + analyzer.getDescTbl().debugString());
         }
+        long sqlSelectLimit = -1;
+        if (ConnectContext.get() != null && 
ConnectContext.get().getSessionVariable() != null) {
+            sqlSelectLimit = 
ConnectContext.get().getSessionVariable().sqlSelectLimit;
+        }
         PlanNode singleNodePlan = createQueryPlan(queryStmt, analyzer,
-                ctx.getQueryOptions().getDefaultOrderByLimit());
+                ctx.getQueryOptions().getDefaultOrderByLimit(), 
sqlSelectLimit);
         Preconditions.checkNotNull(singleNodePlan);
         analyzer.getDescTbl().materializeIntermediateSlots();
         return singleNodePlan;
@@ -241,7 +245,7 @@ public class SingleNodePlanner {
      * Create plan tree for single-node execution. Generates PlanNodes for the
      * Select/Project/Join/Union [All]/Group by/Having/Order by clauses of the 
query stmt.
      */
-    private PlanNode createQueryPlan(QueryStmt stmt, Analyzer analyzer, long 
defaultOrderByLimit)
+    private PlanNode createQueryPlan(QueryStmt stmt, Analyzer analyzer, long 
defaultOrderByLimit, long sqlSelectLimit)
             throws UserException {
         long newDefaultOrderByLimit = defaultOrderByLimit;
         long defaultLimit = 
analyzer.getContext().getSessionVariable().defaultOrderByLimit;
@@ -275,7 +279,7 @@ public class SingleNodePlanner {
             }
         } else {
             Preconditions.checkState(stmt instanceof SetOperationStmt);
-            root = createSetOperationPlan((SetOperationStmt) stmt, analyzer, 
newDefaultOrderByLimit);
+            root = createSetOperationPlan((SetOperationStmt) stmt, analyzer, 
newDefaultOrderByLimit, sqlSelectLimit);
         }
         if (ConnectContext.get().getExecutor() != null) {
             
ConnectContext.get().getExecutor().getSummaryProfile().setQueryJoinReorderFinishTime();
@@ -304,9 +308,16 @@ public class SingleNodePlanner {
             root = new SortNode(ctx.getNextNodeId(), root, stmt.getSortInfo(),
                     useTopN);
             ((SortNode) root).setDefaultLimit(limit == -1);
-            ((SortNode) root).setOffset(stmt.getOffset());
+            root.setOffset(stmt.getOffset());
             if (useTopN) {
-                root.setLimit(limit != -1 ? limit : newDefaultOrderByLimit);
+                if (sqlSelectLimit >= 0 && sqlSelectLimit < Long.MAX_VALUE) {
+                    newDefaultOrderByLimit = Math.min(newDefaultOrderByLimit, 
sqlSelectLimit);
+                }
+                if (newDefaultOrderByLimit == Long.MAX_VALUE) {
+                    root.setLimit(limit);
+                } else {
+                    root.setLimit(limit != -1 ? limit : 
newDefaultOrderByLimit);
+                }
             } else {
                 root.setLimit(limit);
             }
@@ -316,7 +327,11 @@ public class SingleNodePlanner {
             // from SelectStmt outside
             root = addUnassignedConjuncts(analyzer, root);
         } else {
-            root.setLimitAndOffset(stmt.getLimit(), stmt.getOffset());
+            if (!stmt.hasLimit() && sqlSelectLimit >= 0 && sqlSelectLimit < 
Long.MAX_VALUE) {
+                root.setLimitAndOffset(sqlSelectLimit, stmt.getOffset());
+            } else {
+                root.setLimitAndOffset(stmt.getLimit(), stmt.getOffset());
+            }
             root.computeStats(analyzer);
         }
 
@@ -325,7 +340,7 @@ public class SingleNodePlanner {
             root = createAssertRowCountNode(root, 
stmt.getAssertNumRowsElement(), analyzer);
         }
 
-        if (analyzer.hasEmptyResultSet()) {
+        if (analyzer.hasEmptyResultSet() || root.getLimit() == 0) {
             // Must clear the scanNodes, otherwise we will get NPE in 
Coordinator::computeScanRangeAssignment
             Set<TupleId> scanTupleIds = new 
HashSet<>(root.getAllScanTupleIds());
             scanNodes.removeIf(scanNode -> 
scanTupleIds.contains(scanNode.getTupleIds().get(0)));
@@ -1657,7 +1672,7 @@ public class SingleNodePlanner {
             }
         }
 
-        PlanNode rootNode = createQueryPlan(inlineViewRef.getViewStmt(), 
inlineViewRef.getAnalyzer(), -1);
+        PlanNode rootNode = createQueryPlan(inlineViewRef.getViewStmt(), 
inlineViewRef.getAnalyzer(), -1, -1);
         // TODO: we should compute the "physical layout" of the view's 
descriptor, so that
         // the avg row size is available during optimization; however, that 
means we need to
         // select references to its resultExprs from the enclosing scope(s)
@@ -2238,7 +2253,7 @@ public class SingleNodePlanner {
      */
     private SetOperationNode createSetOperationPlan(
             Analyzer analyzer, SetOperationStmt setOperationStmt, 
List<SetOperationStmt.SetOperand> setOperands,
-            PlanNode result, long defaultOrderByLimit)
+            PlanNode result, long defaultOrderByLimit, long sqlSelectLimit)
             throws UserException, AnalysisException {
         SetOperationNode setOpNode;
         SetOperationStmt.Operation operation = null;
@@ -2297,7 +2312,7 @@ public class SingleNodePlanner {
                     continue;
                 }
             }
-            PlanNode opPlan = createQueryPlan(queryStmt, op.getAnalyzer(), 
defaultOrderByLimit);
+            PlanNode opPlan = createQueryPlan(queryStmt, op.getAnalyzer(), 
defaultOrderByLimit, sqlSelectLimit);
             // There may still be unassigned conjuncts if the operand has an 
order by + limit.
             // Place them into a SelectNode on top of the operand's plan.
             opPlan = addUnassignedConjuncts(analyzer, opPlan.getTupleIds(), 
opPlan);
@@ -2327,7 +2342,7 @@ public class SingleNodePlanner {
      * use a union node (this is tricky because a union materializes a new 
tuple).
      */
     private PlanNode createSetOperationPlan(
-            SetOperationStmt setOperationStmt, Analyzer analyzer, long 
defaultOrderByLimit)
+            SetOperationStmt setOperationStmt, Analyzer analyzer, long 
defaultOrderByLimit, long sqlSelectLimit)
             throws UserException, AnalysisException {
         // TODO(zc): get unassigned conjuncts
         // List<Expr> conjuncts =
@@ -2397,10 +2412,10 @@ public class SingleNodePlanner {
                     if (operation == SetOperationStmt.Operation.INTERSECT
                             || operation == SetOperationStmt.Operation.EXCEPT) 
{
                         result = createSetOperationPlan(analyzer, 
setOperationStmt, partialOperands, result,
-                                defaultOrderByLimit);
+                                defaultOrderByLimit, sqlSelectLimit);
                     } else {
                         result = createUnionPartialSetOperationPlan(analyzer, 
setOperationStmt, partialOperands, result,
-                                defaultOrderByLimit);
+                                defaultOrderByLimit, sqlSelectLimit);
                     }
                     partialOperands.clear();
                 }
@@ -2414,10 +2429,10 @@ public class SingleNodePlanner {
             if (operation == SetOperationStmt.Operation.INTERSECT
                     || operation == SetOperationStmt.Operation.EXCEPT) {
                 result = createSetOperationPlan(analyzer, setOperationStmt, 
partialOperands, result,
-                        defaultOrderByLimit);
+                        defaultOrderByLimit, sqlSelectLimit);
             } else {
                 result = createUnionPartialSetOperationPlan(analyzer, 
setOperationStmt, partialOperands, result,
-                        defaultOrderByLimit);
+                        defaultOrderByLimit, sqlSelectLimit);
             }
         }
 
@@ -2435,7 +2450,7 @@ public class SingleNodePlanner {
     // while the left-hand child(a)'s operation is null
     private PlanNode createUnionPartialSetOperationPlan(Analyzer analyzer, 
SetOperationStmt setOperationStmt,
                                                         
List<SetOperationStmt.SetOperand> setOperands,
-                                                        PlanNode result, long 
defaultOrderByLimit)
+                                                        PlanNode result, long 
defaultOrderByLimit, long sqlSelectLimit)
             throws UserException {
         boolean hasDistinctOps = false;
         boolean hasAllOps = false;
@@ -2454,7 +2469,7 @@ public class SingleNodePlanner {
         // create DISTINCT tree
         if (hasDistinctOps) {
             result = createSetOperationPlan(
-                    analyzer, setOperationStmt, distinctOps, result, 
defaultOrderByLimit);
+                    analyzer, setOperationStmt, distinctOps, result, 
defaultOrderByLimit, sqlSelectLimit);
             result = new AggregationNode(ctx.getNextNodeId(), result,
                     setOperationStmt.getDistinctAggInfo());
             result.init(analyzer);
@@ -2462,7 +2477,7 @@ public class SingleNodePlanner {
         // create ALL tree
         if (hasAllOps) {
             result = createSetOperationPlan(analyzer, setOperationStmt, allOps,
-                    result, defaultOrderByLimit);
+                    result, defaultOrderByLimit, sqlSelectLimit);
         }
         return result;
     }
diff --git 
a/regression-test/suites/nereids_p0/session_variable/test_default_limit.groovy 
b/regression-test/suites/nereids_p0/session_variable/test_default_limit.groovy
new file mode 100644
index 0000000000..c2995fee41
--- /dev/null
+++ 
b/regression-test/suites/nereids_p0/session_variable/test_default_limit.groovy
@@ -0,0 +1,253 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite('test_default_limit') {
+    sql 'use nereids_test_query_db'
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+
+    for (int i = 0; i < 2; ++i) {
+        if (i == 0) {
+            sql 'set enable_pipeline_engine=false'
+        } else if (i == 1) {
+            sql 'set enable_pipeline_engine=true'
+        }
+
+        sql 'set default_order_by_limit = -1'
+        sql 'set sql_select_limit = -1'
+
+        def res = sql 'select * from baseall'
+        assertEquals(res.size(), 16)
+
+        sql 'set default_order_by_limit = 10'
+        sql 'set sql_select_limit = 5'
+
+        res = sql 'select * from baseall'
+        assertEquals(res.size(), 5)
+        res = sql 'select * from baseall order by k1'
+        assertEquals(res.size(), 5)
+        res = sql 'select * from baseall limit 7'
+        assertEquals(res.size(), 7)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set default_order_by_limit = 5'
+        sql 'set sql_select_limit = 10'
+
+        res = sql 'select * from baseall'
+        assertEquals(res.size(), 10)
+        res = sql 'select * from baseall order by k1'
+        assertEquals(res.size(), 5)
+        res = sql 'select * from baseall limit 7'
+        assertEquals(res.size(), 7)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 10)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set sql_select_limit = -1'
+
+        res = sql 'select * from baseall'
+        assertEquals(res.size(), 16)
+        res = sql 'select * from baseall limit 7'
+        assertEquals(res.size(), 7)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 15)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set sql_select_limit = -10'
+
+        res = sql 'select * from baseall'
+        assertEquals(res.size(), 16)
+        res = sql 'select * from baseall limit 7'
+        assertEquals(res.size(), 7)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 15)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set sql_select_limit = 0'
+
+        res = sql 'select * from baseall'
+        assertEquals(res.size(), 0)
+        res = sql 'select * from baseall limit 7'
+        assertEquals(res.size(), 7)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 0)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set sql_select_limit = 5'
+        sql 'set default_order_by_limit = -1'
+
+        res = sql 'select * from baseall order by k1'
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set default_order_by_limit = -10'
+
+        res = sql 'select * from baseall order by k1'
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set default_order_by_limit = 0'
+
+        res = sql 'select * from baseall order by k1'
+        assertEquals(res.size(), 0)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2
+        '''
+        assertEquals(res.size(), 0)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+    }
+}
\ No newline at end of file
diff --git 
a/regression-test/suites/query_p0/session_variable/test_default_limit.groovy 
b/regression-test/suites/query_p0/session_variable/test_default_limit.groovy
new file mode 100644
index 0000000000..139c46bcd8
--- /dev/null
+++ b/regression-test/suites/query_p0/session_variable/test_default_limit.groovy
@@ -0,0 +1,251 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite('test_default_limit') {
+    sql 'use test_query_db'
+
+    for (int i = 0; i < 2; ++i) {
+        if (i == 0) {
+            sql 'set enable_pipeline_engine=false'
+        } else if (i == 1) {
+            sql 'set enable_pipeline_engine=true'
+        }
+
+        sql 'set default_order_by_limit = -1'
+        sql 'set sql_select_limit = -1'
+
+        def res = sql 'select * from baseall'
+        assertEquals(res.size(), 16)
+
+        sql 'set default_order_by_limit = 10'
+        sql 'set sql_select_limit = 5'
+
+        res = sql 'select * from baseall'
+        assertEquals(res.size(), 5)
+        res = sql 'select * from baseall order by k1'
+        assertEquals(res.size(), 5)
+        res = sql 'select * from baseall limit 7'
+        assertEquals(res.size(), 7)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set default_order_by_limit = 5'
+        sql 'set sql_select_limit = 10'
+
+        res = sql 'select * from baseall'
+        assertEquals(res.size(), 10)
+        res = sql 'select * from baseall order by k1'
+        assertEquals(res.size(), 5)
+        res = sql 'select * from baseall limit 7'
+        assertEquals(res.size(), 7)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 10)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set sql_select_limit = -1'
+
+        res = sql 'select * from baseall'
+        assertEquals(res.size(), 16)
+        res = sql 'select * from baseall limit 7'
+        assertEquals(res.size(), 7)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 15)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set sql_select_limit = -10'
+
+        res = sql 'select * from baseall'
+        assertEquals(res.size(), 16)
+        res = sql 'select * from baseall limit 7'
+        assertEquals(res.size(), 7)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 15)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set sql_select_limit = 0'
+
+        res = sql 'select * from baseall'
+        assertEquals(res.size(), 0)
+        res = sql 'select * from baseall limit 7'
+        assertEquals(res.size(), 7)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 0)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set sql_select_limit = 5'
+        sql 'set default_order_by_limit = -1'
+
+        res = sql 'select * from baseall order by k1'
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set default_order_by_limit = -10'
+
+        res = sql 'select * from baseall order by k1'
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+
+        sql 'set default_order_by_limit = 0'
+
+        res = sql 'select * from baseall order by k1'
+        assertEquals(res.size(), 0)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+        '''
+        assertEquals(res.size(), 5)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2
+        '''
+        assertEquals(res.size(), 0)
+        res = sql '''
+            with cte as (
+                select baseall.* from baseall, bigtable where baseall.k1 = 
bigtable.k1
+            )
+            select * from baseall, (select k1 from cte) c where c.k1 = 
baseall.k1
+            order by c.k1, baseall.k2 limit 8
+        '''
+        assertEquals(res.size(), 8)
+    }
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org


Reply via email to