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