This is an automated email from the ASF dual-hosted git repository. yiguolei 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 5219d2aab0 [fix](union)the result exprs of union node should substitute by child node's smap (#11933) 5219d2aab0 is described below commit 5219d2aab062d4faf60ba5f516c2528bc488fcc4 Author: starocean999 <40539150+starocean...@users.noreply.github.com> AuthorDate: Wed Aug 24 19:43:40 2022 +0800 [fix](union)the result exprs of union node should substitute by child node's smap (#11933) union node's result exprs should be substitued by child node's smap first, then the following "computePassthrough" method would have correct information to do its job. --- .../org/apache/doris/planner/SetOperationNode.java | 12 +++++- .../data/correctness/test_union_with_subquery.out | 4 ++ .../correctness/test_union_with_subquery.groovy | 49 ++++++++++++++++++++++ 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java index 6e56f6ffd2..bd130a8957 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java @@ -144,6 +144,15 @@ public abstract class SetOperationNode extends PlanNode { @Override public void finalize(Analyzer analyzer) throws UserException { super.finalize(analyzer); + // the resultExprLists should be substituted by child's output smap + // because the result exprs are column A, B, but the child output exprs are column B, A + // after substituted, the next computePassthrough method will get correct info to do its job + List<List<Expr>> substitutedResultExprLists = Lists.newArrayList(); + for (int i = 0; i < resultExprLists.size(); ++i) { + substitutedResultExprLists.add(Expr.substituteList( + resultExprLists.get(i), children.get(i).getOutputSmap(), analyzer, true)); + } + resultExprLists = substitutedResultExprLists; // In Doris-6380, moved computePassthrough() and the materialized position of resultExprs/constExprs // from this.init() to this.finalize(), and will not call SetOperationNode::init() again at the end // of createSetOperationNodeFragment(). @@ -179,8 +188,7 @@ public abstract class SetOperationNode extends PlanNode { newExprList.add(exprList.get(j)); } } - materializedResultExprLists.add( - Expr.substituteList(newExprList, getChild(i).getOutputSmap(), analyzer, true)); + materializedResultExprLists.add(newExprList); } Preconditions.checkState( materializedResultExprLists.size() == getChildren().size()); diff --git a/regression-test/data/correctness/test_union_with_subquery.out b/regression-test/data/correctness/test_union_with_subquery.out new file mode 100644 index 0000000000..a4cca003b9 --- /dev/null +++ b/regression-test/data/correctness/test_union_with_subquery.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +1 1 + diff --git a/regression-test/suites/correctness/test_union_with_subquery.groovy b/regression-test/suites/correctness/test_union_with_subquery.groovy new file mode 100644 index 0000000000..5362231fda --- /dev/null +++ b/regression-test/suites/correctness/test_union_with_subquery.groovy @@ -0,0 +1,49 @@ +// 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("test_union_with_subquery") { + sql """ DROP TABLE IF EXISTS A_union; """ + sql """ + create table A_union ( a int not null, b varchar(10) null )ENGINE=OLAP + DISTRIBUTED BY HASH(a) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "in_memory" = "false", + "storage_format" = "V2" + ); + """ + + sql """ insert into A_union values( 1, '1' ); """ + + qt_sql """with c AS + (SELECT a, + b + FROM A_union + GROUP BY b, a ), d AS + (SELECT a, + b + FROM A_union + GROUP BY b, a ) + SELECT * + FROM d + UNION + SELECT * + FROM c; + """ + + sql """ DROP TABLE IF EXISTS A_union; """ +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org