From 707d03cbde356191e4365507966eb930c9bff02e Mon Sep 17 00:00:00 2001 From: yangzhg <780531911@qq.com> Date: Thu, 2 Jul 2020 13:56:53 +0800 Subject: [PATCH] [SQL] Remove order by for subquery in set opertion clause (#3806) implemnets #3803 Support disable some unmeaningful order by clause. The default limit of 65535 will not be disabled because of it is added at plannode, after we support spill to disk we can move this limit to analyze. --- .../org/apache/doris/analysis/QueryStmt.java | 39 +++++++++---------- .../doris/planner/SingleNodePlanner.java | 4 +- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/fe/src/main/java/org/apache/doris/analysis/QueryStmt.java b/fe/src/main/java/org/apache/doris/analysis/QueryStmt.java index 4da74e12d5..32cce45247 100644 --- a/fe/src/main/java/org/apache/doris/analysis/QueryStmt.java +++ b/fe/src/main/java/org/apache/doris/analysis/QueryStmt.java @@ -285,27 +285,26 @@ public abstract class QueryStmt extends StatementBase { } sortInfo = new SortInfo(orderingExprs, isAscOrder, nullsFirstParams); - // order by w/o limit and offset in inline views, union operands and insert statements + // order by w/o limit and offset in inline views, set operands and insert statements // are ignored. - // TODO chenhao, open this when we don't limit rows subquery returns by SortNode. - /*if (!hasLimit() && !hasOffset() && !analyzer.isRootAnalyzer()) { - * evaluateOrderBy = false; - * // Return a warning that the order by was ignored. - * StringBuilder strBuilder = new StringBuilder(); - * strBuilder.append("Ignoring ORDER BY clause without LIMIT or OFFSET: "); - * strBuilder.append("ORDER BY "); - * strBuilder.append(orderByElements.get(0).toSql()); - * for (int i = 1; i < orderByElements.size(); ++i) { - * strBuilder.append(", ").append(orderByElements.get(i).toSql()); - * } - * strBuilder.append(".\nAn ORDER BY appearing in a view, subquery, union operand, "); - * strBuilder.append("or an insert/ctas statement has no effect on the query result "); - * strBuilder.append("unless a LIMIT and/or OFFSET is used in conjunction "); - * strBuilder.append("with the ORDER BY."); - * } else { - */ - evaluateOrderBy = true; - //} + if (!hasLimit() && !hasOffset() && !analyzer.isRootAnalyzer()) { + evaluateOrderBy = false; + // Return a warning that the order by was ignored. + StringBuilder strBuilder = new StringBuilder(); + strBuilder.append("Ignoring ORDER BY clause without LIMIT or OFFSET: "); + strBuilder.append("ORDER BY "); + strBuilder.append(orderByElements.get(0).toSql()); + for (int i = 1; i < orderByElements.size(); ++i) { + strBuilder.append(", ").append(orderByElements.get(i).toSql()); + } + strBuilder.append(".\nAn ORDER BY appearing in a view, subquery, union operand, "); + strBuilder.append("or an insert/ctas statement has no effect on the query result "); + strBuilder.append("unless a LIMIT and/or OFFSET is used in conjunction "); + strBuilder.append("with the ORDER BY."); + LOG.info(strBuilder.toString()); + } else { + evaluateOrderBy = true; + } } /** diff --git a/fe/src/main/java/org/apache/doris/planner/SingleNodePlanner.java b/fe/src/main/java/org/apache/doris/planner/SingleNodePlanner.java index 59f3a20777..f4b502be02 100644 --- a/fe/src/main/java/org/apache/doris/planner/SingleNodePlanner.java +++ b/fe/src/main/java/org/apache/doris/planner/SingleNodePlanner.java @@ -2105,7 +2105,9 @@ public class SingleNodePlanner { private List getBoundPredicates(Analyzer analyzer, TupleDescriptor tupleDesc) { final List tupleIds = Lists.newArrayList(); - tupleIds.add(tupleDesc.getId()); + if (tupleDesc != null) { + tupleIds.add(tupleDesc.getId()); + } return analyzer.getUnassignedConjuncts(tupleIds); } }