This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-1.2-lts by this push:
new 281a84587b [fix](planner) conjuncts of the outer query block didn't
work when it's on the results expr of inline view (#17203)
281a84587b is described below
commit 281a84587beea4423e7bc0f73cdc0b62dbd5ecb7
Author: AKIRA <[email protected]>
AuthorDate: Mon Feb 27 22:51:43 2023 +0900
[fix](planner) conjuncts of the outer query block didn't work when it's on
the results expr of inline view (#17203)
cherry-pick #17036
---
.../java/org/apache/doris/analysis/Analyzer.java | 20 +++++++++++---
.../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/PlanNode.java | 8 ++++++
.../java/org/apache/doris/planner/SelectNode.java | 6 -----
.../apache/doris/planner/SingleNodePlanner.java | 13 ++++++---
.../apache/doris/rewrite/FoldConstantsRule.java | 2 +-
.../data/query_p0/literal_view/lietral_test.out | 2 ++
regression-test/data/query_p0/union/test_union.out | 3 +++
.../query_p0/literal_view/lietral_test.groovy | 31 ++++++++++++++++++++++
.../suites/query_p0/union/test_union.groovy | 7 +++++
19 files changed, 119 insertions(+), 31 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 50a9fd7ce0..3165f5ba12 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
@@ -396,6 +396,8 @@ public class Analyzer {
private final Set<TupleId> markTupleIdsNotProcessed =
Sets.newHashSet();
+ private final Map<InlineViewRef, Set<Expr>> migrateFailedConjuncts =
Maps.newHashMap();
+
public GlobalState(Env env, ConnectContext context) {
this.env = env;
this.context = context;
@@ -1184,6 +1186,16 @@ public class Analyzer {
}
}
+ 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);
+ }
+
+ public Set<Expr> findMigrateFailedConjuncts(InlineViewRef inlineViewRef) {
+ return globalState.migrateFailedConjuncts.get(inlineViewRef);
+ }
+
/**
* register expr id
* @param expr
@@ -1340,7 +1352,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);
}
}
@@ -1817,7 +1830,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) {
@@ -2390,7 +2404,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 fed13dad19..2b01f17319 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
@@ -647,8 +647,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 c20cc74908..486e14ac72 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
@@ -398,8 +398,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 f1e41ad0b4..8c3247479d 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
@@ -235,8 +235,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 b7915d207e..37759a5b49 100755
--- 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
@@ -1906,10 +1906,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);
}
@@ -1921,8 +1921,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 62373e619a..ee1fd3d869 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
@@ -1401,7 +1401,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(((StringLiteral)
child1Result).getStringValue())) {
this.type = ScalarType.getDefaultDateType(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 b49423b002..ebe38983f9 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 bfd9ab9ccb..c2ca4a6b6a 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
@@ -501,4 +501,26 @@ public class SlotRef extends Expr {
}
return builder.toString();
}
+
+ @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/PlanNode.java
b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
index fd861842ce..2e58a19ed3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
@@ -1120,4 +1120,12 @@ public abstract class PlanNode extends
TreeNode<PlanNode> implements PlanStats {
public List<Expr> getProjectList() {
return projectList;
}
+
+ public List<SlotId> getOutputSlotIds() {
+ return outputSlotIds;
+ }
+
+ public void setVConjunct(Set<Expr> exprs) {
+ vconjunct = convertConjunctsToAndCompoundPredicate(new
ArrayList<>(exprs));
+ }
}
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 d46b0310d5..2baa6e6f13 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,12 +40,6 @@ import java.util.List;
public class SelectNode extends PlanNode {
private static final Logger LOG = LogManager.getLogger(SelectNode.class);
- protected SelectNode(PlanNodeId id, PlanNode child) {
- super(id, child.getTupleIds(), "SELECT", StatisticalType.SELECT_NODE);
- addChild(child);
- this.nullableTupleIds = child.nullableTupleIds;
- }
-
protected SelectNode(PlanNodeId id, PlanNode child, List<Expr> conjuncts) {
super(id, child.getTupleIds(), "SELECT", StatisticalType.SELECT_NODE);
addChild(child);
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 d21b44c7e5..95bf5ae804 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
@@ -1802,8 +1802,9 @@ public class SingleNodePlanner {
newConjuncts = cloneExprs(newConjuncts);
}
} else {
- Preconditions.checkArgument(select.getTableRefs().size() == 1);
- viewAnalyzer.registerConjuncts(newConjuncts,
select.getTableRefs().get(0).getId());
+ for (Expr e : conjuncts) {
+ viewAnalyzer.registerMigrateFailedConjuncts(inlineViewRef,
e);
+ }
}
} else {
Preconditions.checkArgument(stmt instanceof SetOperationStmt);
@@ -2139,7 +2140,13 @@ public class SingleNodePlanner {
scanNode = createScanNode(analyzer, tblRef, selectStmt);
}
if (tblRef instanceof InlineViewRef) {
- scanNode = createInlineViewPlan(analyzer, (InlineViewRef) tblRef);
+ InlineViewRef inlineViewRef = (InlineViewRef) tblRef;
+ scanNode = createInlineViewPlan(analyzer, inlineViewRef);
+ Analyzer viewAnalyzer = inlineViewRef.getAnalyzer();
+ Set<Expr> exprs =
viewAnalyzer.findMigrateFailedConjuncts(inlineViewRef);
+ if (CollectionUtils.isNotEmpty(exprs)) {
+ scanNode.setVConjunct(exprs);
+ }
}
if (scanNode == null) {
throw new UserException("unknown TableRef node");
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 d812146a35..cff0754b4e 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/data/query_p0/union/test_union.out
b/regression-test/data/query_p0/union/test_union.out
index fe0f9c1810..4d398f2f2a 100644
--- a/regression-test/data/query_p0/union/test_union.out
+++ b/regression-test/data/query_p0/union/test_union.out
@@ -364,3 +364,6 @@ hell0
2016-07-01
2016-07-02
+-- !union36 --
+1 2
+
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';
+ """
}
diff --git a/regression-test/suites/query_p0/union/test_union.groovy
b/regression-test/suites/query_p0/union/test_union.groovy
index ff856245f0..676d18653a 100644
--- a/regression-test/suites/query_p0/union/test_union.groovy
+++ b/regression-test/suites/query_p0/union/test_union.groovy
@@ -273,4 +273,11 @@ suite("test_union") {
qt_union40 """(select k1 from ${new_union_table}) union (select
k${idx} from ${tbName1}) order by k1"""
}
sql"""drop table ${new_union_table}"""
+
+
+ sql 'set enable_fallback_to_original_planner=false'
+ sql 'set enable_nereids_planner=true'
+ qt_union35 """select cast("2016-07-01" as date) union (select
cast("2016-07-02 1:10:0" as date)) order by 1"""
+
+ qt_union36 """SELECT a,2 as a FROM (SELECT '1' as a) b where a=1;"""
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]