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 17a1ce5ed3 [fix](nereids) add a project node above sort node to 
eliminate unused order by keys (#17913)
17a1ce5ed3 is described below

commit 17a1ce5ed3bccba3a5ffa5808e327bc6d33d0e98
Author: starocean999 <[email protected]>
AuthorDate: Wed Mar 22 11:19:32 2023 +0800

    [fix](nereids) add a project node above sort node to eliminate unused order 
by keys (#17913)
    
    if the order by keys are not simple slot in sort node, the order by exprs 
have to been added to sort node's output tuple. In that case, we need add a 
project node above sort node to eliminate the unused order by exprs. for 
example:
    
    ```sql
    WITH t0 AS
        (SELECT DATE_FORMAT(date,
             '%Y%m%d') AS date
        FROM cir_1756_t1 ), t3 AS
        (SELECT date_format(date,
             '%Y%m%d') AS `date`
        FROM `cir_1756_t2`
        GROUP BY  date_format(date, '%Y%m%d')
        **ORDER BY  date_format(date, '%Y%m%d')** )
    SELECT t0.date
    FROM t0
    LEFT JOIN t3
        ON t0.date = t3.date;
    ```
    
    before:
    ```
    
+--------------------------------------------------------------------------------------------------------------------------------------------------+
    | Explain String                                                            
                                                                       |
    
+--------------------------------------------------------------------------------------------------------------------------------------------------+
    | LogicalProject[159] ( distinct=false, projects=[date#1], excepts=[], 
canEliminate=true )                                                         |
    | +--LogicalJoin[158] ( type=LEFT_OUTER_JOIN, 
markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(date#1 = date#3)], 
otherJoinConjuncts=[] ) |
    |    |--LogicalProject[151] ( distinct=false, projects=[date_format(date#0, 
'%Y%m%d') AS `date`#1], excepts=[], canEliminate=true )                |
    |    |  +--LogicalOlapScan ( qualified=default_cluster:bugfix.cir_1756_t1, 
indexName=cir_1756_t1, selectedIndexId=412339, preAgg=ON )              |
    |    +--LogicalSort[157] ( orderKeys=[date_format(cast(date#3 as DATETIME), 
'%Y%m%d') asc null first] )                                            |
    |       +--LogicalAggregate[156] ( groupByExpr=[date#3], 
outputExpr=[date#3], hasRepeat=false )                                          
          |
    |          +--LogicalProject[155] ( distinct=false, 
projects=[date_format(date#2, '%Y%m%d') AS `date`#3], excepts=[], 
canEliminate=true )          |
    |             +--LogicalOlapScan ( 
qualified=default_cluster:bugfix.cir_1756_t2, indexName=cir_1756_t2, 
selectedIndexId=412352, preAgg=ON )        |
    
+--------------------------------------------------------------------------------------------------------------------------------------------------+
    ```
    
    after:
    ```
    
+--------------------------------------------------------------------------------------------------------------------------------------------------+
    | Explain String                                                            
                                                                       |
    
+--------------------------------------------------------------------------------------------------------------------------------------------------+
    | LogicalProject[171] ( distinct=false, projects=[date#2], excepts=[], 
canEliminate=true )                                                         |
    | +--LogicalJoin[170] ( type=LEFT_OUTER_JOIN, 
markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(date#2 = date#4)], 
otherJoinConjuncts=[] ) |
    |    |--LogicalProject[162] ( distinct=false, projects=[date_format(date#0, 
'%Y%m%d') AS `date`#2], excepts=[], canEliminate=true )                |
    |    |  +--LogicalOlapScan ( qualified=default_cluster:bugfix.cir_1756_t1, 
indexName=cir_1756_t1, selectedIndexId=1049812, preAgg=ON )             |
    |    +--LogicalProject[169] ( distinct=false, projects=[date#4], 
excepts=[], canEliminate=false )                                                
  |
    |       +--LogicalSort[168] ( orderKeys=[date_format(cast(date#4 as 
DATETIME), '%Y%m%d') asc null first] )                                         |
    |          +--LogicalAggregate[167] ( groupByExpr=[date#4], 
outputExpr=[date#4], hasRepeat=false )                                          
       |
    |             +--LogicalProject[166] ( distinct=false, 
projects=[date_format(date#3, '%Y%m%d') AS `date`#4], excepts=[], 
canEliminate=true )       |
    |                +--LogicalOlapScan ( 
qualified=default_cluster:bugfix.cir_1756_t2, indexName=cir_1756_t2, 
selectedIndexId=1049825, preAgg=ON )    |
    
+--------------------------------------------------------------------------------------------------------------------------------------------------+
    ```
---
 .../org/apache/doris/nereids/rules/RuleType.java   |  1 +
 .../expression/rewrite/ExpressionRewrite.java      |  2 +-
 .../rules/rewrite/logical/ColumnPruning.java       |  1 +
 .../ExtractAndNormalizeWindowExpression.java       | 10 +--
 .../rules/rewrite/logical/MergeProjects.java       |  6 +-
 .../{MergeProjects.java => PruneSortColumns.java}  | 38 ++++------
 ...CorrelatedFilterUnderApplyAggregateProject.java |  2 +-
 .../rewrite/logical/PullUpProjectUnderApply.java   |  2 +-
 .../rewrite/logical/PushdownAliasThroughJoin.java  |  6 +-
 .../logical/PushdownFilterThroughProject.java      |  4 +-
 .../logical/PushdownProjectThroughLimit.java       |  2 +-
 .../logical/UnCorrelatedApplyProjectFilter.java    |  2 +-
 .../trees/plans/logical/LogicalProject.java        |  5 ++
 .../nereids/trees/plans/logical/LogicalSort.java   | 30 ++++++--
 .../subquery/test_inlineview_with_project.out      |  4 ++
 .../subquery/test_inlineview_with_project.groovy   | 82 ++++++++++++++++++++++
 16 files changed, 151 insertions(+), 46 deletions(-)

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 9b696f8235..1053393f0c 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
@@ -133,6 +133,7 @@ public enum RuleType {
     COLUMN_PRUNE_FILTER_CHILD(RuleTypeClass.REWRITE),
     PRUNE_ONE_ROW_RELATION_COLUMN(RuleTypeClass.REWRITE),
     COLUMN_PRUNE_SORT_CHILD(RuleTypeClass.REWRITE),
+    COLUMN_PRUNE_SORT(RuleTypeClass.REWRITE),
     COLUMN_PRUNE_JOIN_CHILD(RuleTypeClass.REWRITE),
     COLUMN_PRUNE_REPEAT_CHILD(RuleTypeClass.REWRITE),
     // expression of plan rewrite
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRewrite.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRewrite.java
index a8d1a831cb..114e244c3a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRewrite.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRewrite.java
@@ -130,7 +130,7 @@ public class ExpressionRewrite implements 
RewriteRuleFactory {
                 if (projects.equals(newProjects)) {
                     return project;
                 }
-                return new LogicalProject<>(newProjects, project.child());
+                return project.withProjectsAndChild(newProjects, 
project.child());
             }).toRule(RuleType.REWRITE_PROJECT_EXPRESSION);
         }
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ColumnPruning.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ColumnPruning.java
index fabcb00b36..96a4d8cbc2 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ColumnPruning.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ColumnPruning.java
@@ -35,6 +35,7 @@ public class ColumnPruning implements PlanRuleFactory {
                 new PruneFilterChildColumns().build(),
                 new PruneAggChildColumns().build(),
                 new PruneJoinChildrenColumns().build(),
+                new PruneSortColumns().build(),
                 new PruneSortChildColumns().build(),
                 new MergeProjects().build(),
                 new PruneRepeatChildColumns().build()
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ExtractAndNormalizeWindowExpression.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ExtractAndNormalizeWindowExpression.java
index 75dba0467a..718d6acc6e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ExtractAndNormalizeWindowExpression.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ExtractAndNormalizeWindowExpression.java
@@ -28,7 +28,6 @@ import 
org.apache.doris.nereids.trees.expressions.WindowExpression;
 import 
org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunction;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
-import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 import org.apache.doris.nereids.trees.plans.logical.LogicalWindow;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
@@ -65,10 +64,11 @@ public class ExtractAndNormalizeWindowExpression extends 
OneRewriteRuleFactory i
                 boolean needAggregate = bottomProjects.stream().anyMatch(expr 
->
                         expr.anyMatch(AggregateFunction.class::isInstance));
                 if (needAggregate) {
-                    normalizedChild = new LogicalAggregate<>(
-                            ImmutableList.of(), 
ImmutableList.copyOf(bottomProjects), project.child());
+                    normalizedChild = new 
LogicalAggregate<>(ImmutableList.of(),
+                            ImmutableList.copyOf(bottomProjects), 
project.child());
                 } else {
-                    normalizedChild = new 
LogicalProject<>(ImmutableList.copyOf(bottomProjects), project.child());
+                    normalizedChild = project.withProjectsAndChild(
+                            ImmutableList.copyOf(bottomProjects), 
project.child());
                 }
             }
 
@@ -89,7 +89,7 @@ public class ExtractAndNormalizeWindowExpression extends 
OneRewriteRuleFactory i
 
             // 3. handle top projects
             List<NamedExpression> topProjects = 
ctxForWindows.normalizeToUseSlotRef(normalizedOutputs1);
-            return new LogicalProject<>(topProjects, normalizedLogicalWindow);
+            return project.withProjectsAndChild(topProjects, 
normalizedLogicalWindow);
         }).toRule(RuleType.EXTRACT_AND_NORMALIZE_WINDOW_EXPRESSIONS);
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MergeProjects.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MergeProjects.java
index 4afbbba883..427a86be63 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MergeProjects.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MergeProjects.java
@@ -21,7 +21,6 @@ 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.expressions.NamedExpression;
-import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 
 import java.util.List;
@@ -47,9 +46,10 @@ public class MergeProjects extends OneRewriteRuleFactory {
     @Override
     public Rule build() {
         return logicalProject(logicalProject()).then(project -> {
-            LogicalProject<Plan> childProject = project.child();
+            LogicalProject childProject = project.child();
             List<NamedExpression> projectExpressions = 
project.mergeProjections(childProject);
-            return new LogicalProject<>(projectExpressions, 
childProject.child(0));
+            LogicalProject newProject = childProject.canEliminate() ? project 
: childProject;
+            return newProject.withProjectsAndChild(projectExpressions, 
childProject.child(0));
         }).toRule(RuleType.MERGE_PROJECTS);
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MergeProjects.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneSortColumns.java
similarity index 55%
copy from 
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MergeProjects.java
copy to 
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneSortColumns.java
index 4afbbba883..f77a16b662 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MergeProjects.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneSortColumns.java
@@ -20,36 +20,26 @@ package org.apache.doris.nereids.rules.rewrite.logical;
 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.expressions.NamedExpression;
-import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 
-import java.util.List;
+import com.google.common.collect.ImmutableList;
+
+import java.util.stream.Collectors;
 
 /**
- * this rule aims to merge consecutive filters.
- * For example:
- * logical plan tree:
- *                project(a)
- *                  |
- *                project(a,b)
- *                  |
- *                project(a, b, c)
- *                  |
- *                scan
- * transformed to:
- *                project(a)
- *                   |
- *                 scan
+ the sort node will create new slots for order by keys if the order by keys is 
not in the output
+ so need create a project above sort node to prune the unnecessary order by 
keys
  */
-public class MergeProjects extends OneRewriteRuleFactory {
-
+public class PruneSortColumns extends OneRewriteRuleFactory {
     @Override
     public Rule build() {
-        return logicalProject(logicalProject()).then(project -> {
-            LogicalProject<Plan> childProject = project.child();
-            List<NamedExpression> projectExpressions = 
project.mergeProjections(childProject);
-            return new LogicalProject<>(projectExpressions, 
childProject.child(0));
-        }).toRule(RuleType.MERGE_PROJECTS);
+        return logicalSort()
+                .when(sort -> !sort.isOrderKeysPruned() && !sort.getOutputSet()
+                        .containsAll(sort.getOrderKeys().stream()
+                                .map(orderKey -> 
orderKey.getExpr()).collect(Collectors.toSet())))
+                .then(sort -> {
+                    return new LogicalProject(sort.getOutput(), 
ImmutableList.of(), false,
+                            sort.withOrderKeysPruned(true));
+                }).toRule(RuleType.COLUMN_PRUNE_SORT);
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpCorrelatedFilterUnderApplyAggregateProject.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpCorrelatedFilterUnderApplyAggregateProject.java
index e1cf58c789..9c2b22aa3e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpCorrelatedFilterUnderApplyAggregateProject.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpCorrelatedFilterUnderApplyAggregateProject.java
@@ -75,7 +75,7 @@ public class PullUpCorrelatedFilterUnderApplyAggregateProject 
extends OneRewrite
                         }
                     });
 
-                    LogicalProject newProject = new 
LogicalProject<>(newProjects, filter.child());
+                    LogicalProject newProject = 
project.withProjectsAndChild(newProjects, filter.child());
                     LogicalFilter newFilter = new 
LogicalFilter<>(filter.getConjuncts(), newProject);
                     LogicalAggregate newAgg = 
agg.withChildren(ImmutableList.of(newFilter));
                     return new LogicalApply<>(apply.getCorrelationSlot(), 
apply.getSubqueryExpr(),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpProjectUnderApply.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpProjectUnderApply.java
index a6bb7ce924..bca11e2351 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpProjectUnderApply.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpProjectUnderApply.java
@@ -64,7 +64,7 @@ public class PullUpProjectUnderApply extends 
OneRewriteRuleFactory {
                     if (apply.getSubqueryExpr() instanceof ScalarSubquery) {
                         newProjects.add(project.getProjects().get(0));
                     }
-                    return new LogicalProject(newProjects, newCorrelate);
+                    return project.withProjectsAndChild(newProjects, 
newCorrelate);
                 }).toRule(RuleType.PULL_UP_PROJECT_UNDER_APPLY);
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownAliasThroughJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownAliasThroughJoin.java
index b5c027df44..e35493797e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownAliasThroughJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownAliasThroughJoin.java
@@ -90,12 +90,12 @@ public class PushdownAliasThroughJoin extends 
OneRewriteRuleFactory {
                 if (leftOutput.equals(leftProjects)) {
                     left = join.left();
                 } else {
-                    left = new LogicalProject<>(leftProjects, join.left());
+                    left = project.withProjectsAndChild(leftProjects, 
join.left());
                 }
                 if (rightOutput.equals(rightProjects)) {
                     right = join.right();
                 } else {
-                    right = new LogicalProject<>(rightProjects, join.right());
+                    right = project.withProjectsAndChild(rightProjects, 
join.right());
                 }
 
                 // If condition use alias slot, we should replace condition
@@ -109,7 +109,7 @@ public class PushdownAliasThroughJoin extends 
OneRewriteRuleFactory {
                 List<Expression> newOther = 
replaceJoinConjuncts(join.getOtherJoinConjuncts(), replaceMap);
 
                 Plan newJoin = join.withConjunctsChildren(newHash, newOther, 
left, right);
-                return new LogicalProject<>(newProjects, newJoin);
+                return project.withProjectsAndChild(newProjects, newJoin);
             }).toRule(RuleType.PUSHDOWN_ALIAS_THROUGH_JOIN);
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownFilterThroughProject.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownFilterThroughProject.java
index 8712340f7f..12cae4772a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownFilterThroughProject.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownFilterThroughProject.java
@@ -44,7 +44,7 @@ public class PushdownFilterThroughProject implements 
RewriteRuleFactory {
             RuleType.PUSHDOWN_FILTER_THROUGH_PROJECT.build(
                     logicalFilter(logicalProject()).then(filter -> {
                         LogicalProject<Plan> project = filter.child();
-                        return new LogicalProject<>(
+                        return project.withProjectsAndChild(
                                 project.getProjects(),
                                 new LogicalFilter<>(
                                         
ExpressionUtils.replace(filter.getConjuncts(), project.getAliasToProducer()),
@@ -60,7 +60,7 @@ public class PushdownFilterThroughProject implements 
RewriteRuleFactory {
                         LogicalLimit<LogicalProject<Plan>> limit = 
filter.child();
                         LogicalProject<Plan> project = limit.child();
 
-                        return new LogicalProject<>(
+                        return project.withProjectsAndChild(
                                 project.getProjects(),
                                 new LogicalFilter<>(
                                         
ExpressionUtils.replace(filter.getConjuncts(), project.getAliasToProducer()),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownProjectThroughLimit.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownProjectThroughLimit.java
index c1705250a5..c8818310ab 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownProjectThroughLimit.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownProjectThroughLimit.java
@@ -52,7 +52,7 @@ public class PushdownProjectThroughLimit extends 
OneRewriteRuleFactory {
             LogicalProject<LogicalLimit<Plan>> logicalProject = ctx.root;
             LogicalLimit<Plan> logicalLimit = logicalProject.child();
             return new LogicalLimit<>(logicalLimit.getLimit(), 
logicalLimit.getOffset(),
-                    logicalLimit.getPhase(), new 
LogicalProject<>(logicalProject.getProjects(),
+                    logicalLimit.getPhase(), 
logicalProject.withProjectsAndChild(logicalProject.getProjects(),
                     logicalLimit.child()));
         }).toRule(RuleType.PUSHDOWN_PROJECT_THROUGH_LIMIT);
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/UnCorrelatedApplyProjectFilter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/UnCorrelatedApplyProjectFilter.java
index 0028c53bc7..c4cff23293 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/UnCorrelatedApplyProjectFilter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/UnCorrelatedApplyProjectFilter.java
@@ -87,7 +87,7 @@ public class UnCorrelatedApplyProjectFilter extends 
OneRewriteRuleFactory {
                             .filter(e -> !projects.contains(e))
                             .map(NamedExpression.class::cast)
                             .forEach(projects::add);
-                    LogicalProject newProject = new LogicalProject(projects, 
child);
+                    LogicalProject newProject = 
project.withProjectsAndChild(projects, child);
                     return new LogicalApply<>(apply.getCorrelationSlot(), 
apply.getSubqueryExpr(),
                             ExpressionUtils.optionalAnd(correlatedPredicate), 
apply.getMarkJoinSlotReference(),
                             apply.getSubCorrespondingConject(),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java
index ab18b72c1c..8961f3211a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java
@@ -175,6 +175,11 @@ public class LogicalProject<CHILD_TYPE extends Plan> 
extends LogicalUnary<CHILD_
         return new LogicalProject<>(projects, excepts, canEliminate, 
children.get(0), isDistinct);
     }
 
+    public LogicalProject<Plan> withProjectsAndChild(List<NamedExpression> 
projects, Plan child) {
+        return new LogicalProject<>(projects, excepts, canEliminate,
+                Optional.empty(), Optional.empty(), child, isDistinct);
+    }
+
     @Override
     public LogicalProject<Plan> withGroupExpression(Optional<GroupExpression> 
groupExpression) {
         return new LogicalProject<>(projects, excepts, canEliminate,
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSort.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSort.java
index 50986e30fb..1fb19b722c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSort.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSort.java
@@ -46,17 +46,29 @@ public class LogicalSort<CHILD_TYPE extends Plan> extends 
LogicalUnary<CHILD_TYP
 
     private final List<OrderKey> orderKeys;
 
+    private final boolean orderKeysPruned;
+
     public LogicalSort(List<OrderKey> orderKeys, CHILD_TYPE child) {
         this(orderKeys, Optional.empty(), Optional.empty(), child);
     }
 
+    public LogicalSort(List<OrderKey> orderKeys, CHILD_TYPE child, boolean 
orderKeysPruned) {
+        this(orderKeys, Optional.empty(), Optional.empty(), child, 
orderKeysPruned);
+    }
+
     /**
      * Constructor for LogicalSort.
      */
     public LogicalSort(List<OrderKey> orderKeys, Optional<GroupExpression> 
groupExpression,
             Optional<LogicalProperties> logicalProperties, CHILD_TYPE child) {
+        this(orderKeys, groupExpression, logicalProperties, child, false);
+    }
+
+    public LogicalSort(List<OrderKey> orderKeys, Optional<GroupExpression> 
groupExpression,
+            Optional<LogicalProperties> logicalProperties, CHILD_TYPE child, 
boolean orderKeysPruned) {
         super(PlanType.LOGICAL_SORT, groupExpression, logicalProperties, 
child);
         this.orderKeys = 
ImmutableList.copyOf(Objects.requireNonNull(orderKeys, "orderKeys can not be 
null"));
+        this.orderKeysPruned = orderKeysPruned;
     }
 
     @Override
@@ -68,6 +80,10 @@ public class LogicalSort<CHILD_TYPE extends Plan> extends 
LogicalUnary<CHILD_TYP
         return orderKeys;
     }
 
+    public boolean isOrderKeysPruned() {
+        return orderKeysPruned;
+    }
+
     @Override
     public String toString() {
         return Utils.toSqlString("LogicalSort[" + id.asInt() + "]",
@@ -106,21 +122,27 @@ public class LogicalSort<CHILD_TYPE extends Plan> extends 
LogicalUnary<CHILD_TYP
     @Override
     public LogicalSort<Plan> withChildren(List<Plan> children) {
         Preconditions.checkArgument(children.size() == 1);
-        return new LogicalSort<>(orderKeys, children.get(0));
+        return new LogicalSort<>(orderKeys, children.get(0), orderKeysPruned);
     }
 
     @Override
     public LogicalSort<Plan> withGroupExpression(Optional<GroupExpression> 
groupExpression) {
-        return new LogicalSort<>(orderKeys, groupExpression, 
Optional.of(getLogicalProperties()), child());
+        return new LogicalSort<>(orderKeys, groupExpression, 
Optional.of(getLogicalProperties()), child(),
+                orderKeysPruned);
     }
 
     @Override
     public LogicalSort<Plan> withLogicalProperties(Optional<LogicalProperties> 
logicalProperties) {
-        return new LogicalSort<>(orderKeys, Optional.empty(), 
logicalProperties, child());
+        return new LogicalSort<>(orderKeys, Optional.empty(), 
logicalProperties, child(), false);
     }
 
     public LogicalSort<Plan> withOrderKeys(List<OrderKey> orderKeys) {
         return new LogicalSort<>(orderKeys, Optional.empty(),
-                Optional.of(getLogicalProperties()), child());
+                Optional.of(getLogicalProperties()), child(), false);
+    }
+
+    public LogicalSort<Plan> withOrderKeysPruned(boolean orderKeysPruned) {
+        return new LogicalSort<>(orderKeys, groupExpression, 
Optional.of(getLogicalProperties()), child(),
+                orderKeysPruned);
     }
 }
diff --git 
a/regression-test/data/nereids_p0/subquery/test_inlineview_with_project.out 
b/regression-test/data/nereids_p0/subquery/test_inlineview_with_project.out
new file mode 100644
index 0000000000..f6fa08907e
--- /dev/null
+++ b/regression-test/data/nereids_p0/subquery/test_inlineview_with_project.out
@@ -0,0 +1,4 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !select --
+20200202
+
diff --git 
a/regression-test/suites/nereids_p0/subquery/test_inlineview_with_project.groovy
 
b/regression-test/suites/nereids_p0/subquery/test_inlineview_with_project.groovy
new file mode 100644
index 0000000000..b58c86807c
--- /dev/null
+++ 
b/regression-test/suites/nereids_p0/subquery/test_inlineview_with_project.groovy
@@ -0,0 +1,82 @@
+// 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("inlineview_with_project") {
+    sql "SET enable_nereids_planner=true"
+    sql "SET enable_fallback_to_original_planner=false"
+    sql """
+        drop table if exists cir_1756_t1;
+    """
+
+    sql """
+        drop table if exists cir_1756_t2;
+    """
+    
+    sql """
+        create table cir_1756_t1 (`date` date not null)
+        ENGINE=OLAP
+        DISTRIBUTED BY HASH(`date`) BUCKETS 5
+        PROPERTIES (
+        "replication_allocation" = "tag.location.default: 1",
+        "in_memory" = "false",
+        "storage_format" = "V2"
+        );
+    """
+
+    sql """
+        create table cir_1756_t2 ( `date` date not null )
+        ENGINE=OLAP
+        DISTRIBUTED BY HASH(`date`) BUCKETS 5
+        PROPERTIES (
+        "replication_allocation" = "tag.location.default: 1",
+        "in_memory" = "false",
+        "storage_format" = "V2"
+        );
+    """
+
+    sql """
+        insert into cir_1756_t1 values("2020-02-02");
+    """
+
+    sql """
+        insert into cir_1756_t2 values("2020-02-02");
+    """
+
+    qt_select """
+        WITH t0 AS 
+            (SELECT DATE_FORMAT(date,
+                '%Y%m%d') AS date
+            FROM cir_1756_t1 ), t3 AS 
+            (SELECT date_format(date,
+                '%Y%m%d') AS `date`
+            FROM `cir_1756_t2`
+            GROUP BY  date_format(date, '%Y%m%d')
+            ORDER BY  date_format(date, '%Y%m%d') )
+        SELECT t0.date
+        FROM t0
+        LEFT JOIN t3
+            ON t0.date = t3.date;
+    """
+
+    sql """
+        drop table if exists cir_1756_t1;
+    """
+
+    sql """
+        drop table if exists cir_1756_t2;
+    """
+}


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

Reply via email to