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 cf5bc9594b [fix](planner) conjuncts of the outer query block didn't 
work when it's on the results expr of inline view  (#17036)
cf5bc9594b is described below

commit cf5bc9594b86cb5e669c7948d33072dd64ce5308
Author: AKIRA <33112463+kikyou1...@users.noreply.github.com>
AuthorDate: Fri Feb 24 16:27:34 2023 +0900

    [fix](planner) conjuncts of the outer query block didn't work when it's on 
the results expr of inline view  (#17036)
    
    Here is a cases:
    
    select id, name
    from (select '123' as id, '1234' as name, age from test_insert ) a
    where name != '1234';
---
 .../java/org/apache/doris/analysis/Analyzer.java   | 11 +++++---
 .../org/apache/doris/analysis/BinaryPredicate.java |  4 +--
 .../java/org/apache/doris/analysis/CastExpr.java   |  4 +--
 .../apache/doris/analysis/CompoundPredicate.java   |  4 +--
 .../main/java/org/apache/doris/analysis/Expr.java  |  8 +++---
 .../apache/doris/analysis/FunctionCallExpr.java    |  2 +-
 .../org/apache/doris/analysis/InPredicate.java     |  4 +--
 .../org/apache/doris/analysis/IsNullPredicate.java |  4 +--
 .../java/org/apache/doris/analysis/SetVar.java     |  2 +-
 .../java/org/apache/doris/analysis/SlotRef.java    | 22 +++++++++++++++
 .../org/apache/doris/analysis/SysVariableDesc.java |  4 +--
 .../java/org/apache/doris/planner/SelectNode.java  |  3 +++
 .../apache/doris/rewrite/FoldConstantsRule.java    |  2 +-
 .../data/query_p0/literal_view/lietral_test.out    |  2 ++
 .../query_p0/literal_view/lietral_test.groovy      | 31 ++++++++++++++++++++++
 15 files changed, 84 insertions(+), 23 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
index 76aa3bb4dd..dc85d48f57 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
@@ -1206,7 +1206,8 @@ public class Analyzer {
         }
     }
 
-    public void registerMigrateFailedConjuncts(InlineViewRef ref, Expr e) {
+    public void registerMigrateFailedConjuncts(InlineViewRef ref, Expr e) 
throws AnalysisException {
+        markConstantConjunct(e, false);
         Set<Expr> exprSet = 
globalState.migrateFailedConjuncts.computeIfAbsent(ref, (k) -> new HashSet<>());
         exprSet.add(e);
     }
@@ -1371,7 +1372,8 @@ public class Analyzer {
                     && !e.isAuxExpr()
                     && !globalState.assignedConjuncts.contains(e.getId())
                     && ((inclOjConjuncts && !e.isConstant())
-                    || 
!globalState.ojClauseByConjunct.containsKey(e.getId()))) {
+                    || (!globalState.ojClauseByConjunct.containsKey(e.getId())
+                    && 
!globalState.sjClauseByConjunct.containsKey(e.getId())))) {
                 result.add(e);
             }
         }
@@ -1848,7 +1850,8 @@ public class Analyzer {
                     // aliases and having it analyzed is needed for the 
following EvalPredicate() call
                     conjunct.analyze(this);
                 }
-                final Expr newConjunct = conjunct.getResultValue();
+                Expr newConjunct = conjunct.getResultValue(true);
+                newConjunct = FoldConstantsRule.INSTANCE.apply(newConjunct, 
this, null);
                 if (newConjunct instanceof BoolLiteral || newConjunct 
instanceof NullLiteral) {
                     boolean evalResult = true;
                     if (newConjunct instanceof BoolLiteral) {
@@ -2414,7 +2417,7 @@ public class Analyzer {
 
         if (tids.size() > 1 || 
globalState.ojClauseByConjunct.containsKey(e.getId())
                 || globalState.outerJoinedTupleIds.containsKey(e.getId()) && 
whereClauseConjuncts.contains(e.getId())
-                ||  globalState.conjunctsByOjClause.containsKey(e.getId())) {
+                || globalState.conjunctsByOjClause.containsKey(e.getId())) {
             return true;
         }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
index 389af0b1e8..ad0f9e6a23 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
@@ -675,8 +675,8 @@ public class BinaryPredicate extends Predicate implements 
Writable {
     }
 
     @Override
-    public Expr getResultValue() throws AnalysisException {
-        recursiveResetChildrenResult();
+    public Expr getResultValue(boolean inView) throws AnalysisException {
+        recursiveResetChildrenResult(inView);
         final Expr leftChildValue = getChild(0);
         final Expr rightChildValue = getChild(1);
         if (!(leftChildValue instanceof LiteralExpr)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
index 22252d1d5d..c6a6073c35 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
@@ -412,8 +412,8 @@ public class CastExpr extends Expr {
     }
 
     @Override
-    public Expr getResultValue() throws AnalysisException {
-        recursiveResetChildrenResult();
+    public Expr getResultValue(boolean inView) throws AnalysisException {
+        recursiveResetChildrenResult(inView);
         final Expr value = children.get(0);
         if (!(value instanceof LiteralExpr)) {
             return this;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java
index 5d321a89d3..eca6aa564b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java
@@ -230,8 +230,8 @@ public class CompoundPredicate extends Predicate {
     }
 
     @Override
-    public Expr getResultValue() throws AnalysisException {
-        recursiveResetChildrenResult();
+    public Expr getResultValue(boolean inView) throws AnalysisException {
+        recursiveResetChildrenResult(inView);
         boolean compoundResult = false;
         if (op == Operator.NOT) {
             final Expr childValue = getChild(0);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
index bf163a817d..0e019871e5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
@@ -1945,10 +1945,10 @@ public abstract class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
     }
 
 
-    protected void recursiveResetChildrenResult() throws AnalysisException {
+    protected void recursiveResetChildrenResult(boolean inView) throws 
AnalysisException {
         for (int i = 0; i < children.size(); i++) {
             final Expr child = children.get(i);
-            final Expr newChild = child.getResultValue();
+            final Expr newChild = child.getResultValue(inView);
             if (newChild != child) {
                 setChild(i, newChild);
             }
@@ -1960,8 +1960,8 @@ public abstract class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
      * @return value returned can't be null, if this and it's children are't 
constant expr, return this.
      * @throws AnalysisException
      */
-    public Expr getResultValue() throws AnalysisException {
-        recursiveResetChildrenResult();
+    public Expr getResultValue(boolean forPushDownPredicatesToView) throws 
AnalysisException {
+        recursiveResetChildrenResult(forPushDownPredicatesToView);
         final Expr newExpr = ExpressionFunctions.INSTANCE.evalExpr(this);
         return newExpr != null ? newExpr : this;
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
index 93b1350c72..75dc5579d4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
@@ -1409,7 +1409,7 @@ public class FunctionCallExpr extends Expr {
          * Return type is DATETIME
          */
         if (fn.getFunctionName().getFunction().equals("str_to_date")) {
-            Expr child1Result = getChild(1).getResultValue();
+            Expr child1Result = getChild(1).getResultValue(false);
             if (child1Result instanceof StringLiteral) {
                 if (DateLiteral.hasTimePart(child1Result.getStringValue())) {
                     this.type = Type.DATETIME;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
index 34b8945a4c..e041549ab7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
@@ -291,8 +291,8 @@ public class InPredicate extends Predicate {
     }
 
     @Override
-    public Expr getResultValue() throws AnalysisException {
-        recursiveResetChildrenResult();
+    public Expr getResultValue(boolean inView) throws AnalysisException {
+        recursiveResetChildrenResult(inView);
         final Expr leftChildValue = getChild(0);
         if (!(leftChildValue instanceof LiteralExpr) || !isLiteralChildren()) {
             return this;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/IsNullPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/IsNullPredicate.java
index 00f01cc299..572c778262 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/IsNullPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/IsNullPredicate.java
@@ -154,8 +154,8 @@ public class IsNullPredicate extends Predicate {
      * fix issue 6390
      */
     @Override
-    public Expr getResultValue() throws AnalysisException {
-        recursiveResetChildrenResult();
+    public Expr getResultValue(boolean inView) throws AnalysisException {
+        recursiveResetChildrenResult(inView);
         final Expr childValue = getChild(0);
         if (!(childValue instanceof LiteralExpr)) {
             return this;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SetVar.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/SetVar.java
index d1115905c9..49d7311845 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SetVar.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SetVar.java
@@ -109,7 +109,7 @@ public class SetVar {
             throw new AnalysisException("Set statement does't support 
non-constant expr.");
         }
 
-        final Expr literalExpr = value.getResultValue();
+        final Expr literalExpr = value.getResultValue(false);
         if (!(literalExpr instanceof LiteralExpr)) {
             throw new AnalysisException("Set statement does't support 
computing expr:" + literalExpr.toSql());
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
index 5d5b700454..aa10992ee8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
@@ -576,4 +576,26 @@ public class SlotRef extends Expr {
         }
         return !CreateMaterializedViewStmt.isMVColumn(name) && exprs.isEmpty();
     }
+
+    @Override
+    public Expr getResultValue(boolean foldSlot) throws AnalysisException {
+        if (!foldSlot) {
+            return this;
+        }
+        if (!isConstant() || desc == null) {
+            return this;
+        }
+        List<Expr> exprs = desc.getSourceExprs();
+        if (CollectionUtils.isEmpty(exprs)) {
+            return this;
+        }
+        Expr expr = exprs.get(0);
+        if (expr instanceof SlotRef) {
+            return expr.getResultValue(foldSlot);
+        }
+        if (expr.isConstant()) {
+            return expr;
+        }
+        return this;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/SysVariableDesc.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/SysVariableDesc.java
index 29e6a3c18d..023be528e6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SysVariableDesc.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SysVariableDesc.java
@@ -116,7 +116,7 @@ public class SysVariableDesc extends Expr {
     }
 
     @Override
-    public Expr getResultValue() throws AnalysisException {
+    public Expr getResultValue(boolean inView) throws AnalysisException {
         if (!Strings.isNullOrEmpty(name) && 
VariableVarConverters.hasConverter(name)) {
             // Return the string type here so that it can correctly match the 
subsequent function signature.
             // And we also set `beConverted` to session variable name in 
StringLiteral, so that it can be cast back
@@ -129,7 +129,7 @@ public class SysVariableDesc extends Expr {
                 throw new AnalysisException(e.getMessage());
             }
         }
-        return super.getResultValue();
+        return super.getResultValue(false);
     }
 
     @Override
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java
index 13b5ed5dd5..c9d2a2daf5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java
@@ -40,6 +40,9 @@ import java.util.List;
 public class SelectNode extends PlanNode {
     private static final Logger LOG = LogManager.getLogger(SelectNode.class);
 
+    /**
+     * Used by nereids only.
+     */
     public SelectNode(PlanNodeId id, PlanNode child) {
         super(id, child.getTupleIds(), "SELECT", StatisticalType.SELECT_NODE);
         addChild(child);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/rewrite/FoldConstantsRule.java 
b/fe/fe-core/src/main/java/org/apache/doris/rewrite/FoldConstantsRule.java
index 7cb21bd943..d989e31b55 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/rewrite/FoldConstantsRule.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/rewrite/FoldConstantsRule.java
@@ -122,7 +122,7 @@ public class FoldConstantsRule implements ExprRewriteRule {
                 return expr;
             }
         }
-        return expr.getResultValue();
+        return expr.getResultValue(false);
     }
 
     /**
diff --git a/regression-test/data/query_p0/literal_view/lietral_test.out 
b/regression-test/data/query_p0/literal_view/lietral_test.out
index 9c9c4c6c8a..daa91d59cd 100644
--- a/regression-test/data/query_p0/literal_view/lietral_test.out
+++ b/regression-test/data/query_p0/literal_view/lietral_test.out
@@ -1,3 +1,5 @@
 -- This file is automatically generated. You should know what you did if you 
want to edit this
 -- !sql --
 
+-- !sql1 --
+
diff --git a/regression-test/suites/query_p0/literal_view/lietral_test.groovy 
b/regression-test/suites/query_p0/literal_view/lietral_test.groovy
index 1db3f6d720..0307b0fce8 100644
--- a/regression-test/suites/query_p0/literal_view/lietral_test.groovy
+++ b/regression-test/suites/query_p0/literal_view/lietral_test.groovy
@@ -85,4 +85,35 @@ suite("literal_view_test") {
     FROM test_v
     WHERE substring('2022-12',6,2)='01';
     """
+
+    sql """DROP TABLE IF EXISTS `test_insert`"""
+
+    sql """
+        CREATE TABLE `test_insert` (
+            `id` varchar(11) NULL COMMENT '唯一标识',
+            `name` varchar(10) NULL COMMENT '采集时间',
+            `age` int(11) NULL
+        ) ENGINE=OLAP
+        UNIQUE KEY(`id`)
+        COMMENT 'test'
+        DISTRIBUTED BY HASH(`id`) BUCKETS 10
+        PROPERTIES (
+        "replication_allocation" = "tag.location.default: 1"
+        );
+    """
+
+    sql """
+        insert into test_insert values 
(1,'doris',10),(2,'spark',2),(3,'flink',20);
+    """
+
+    qt_sql1 """
+        select id, name
+        from (
+        select '123' as id,
+        '1234' as name,
+        age
+        from test_insert
+        ) a
+        where name != '1234';
+    """
 }


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

Reply via email to