This is an automated email from the ASF dual-hosted git repository. adonisling pushed a commit to branch branch-1.1-lts in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-1.1-lts by this push: new 76bb9f191f [fix](planner) Output is wrong when select from an inline view with constant expressions (#17451) 76bb9f191f is described below commit 76bb9f191fe1c6866e5ef8241786c961a5bf5afb Author: Adonis Ling <adonis0...@gmail.com> AuthorDate: Tue Mar 7 14:37:07 2023 +0800 [fix](planner) Output is wrong when select from an inline view with constant expressions (#17451) Backport #16370 #16556 #16579 . Co-authored-by: AKIRA <33112463+kikyou1...@users.noreply.github.com> Co-authored-by: xueweizhang <zxw520bl...@163.com> --- .../java/org/apache/doris/analysis/SelectStmt.java | 27 +++++++++++++++ .../org/apache/doris/planner/QueryPlanTest.java | 15 +-------- .../data/query_p0/subquery/test_subquery2.out | 10 ++++++ .../suites/query_p0/subquery/test_subquery2.groovy | 38 ++++++++++++++++++++++ 4 files changed, 76 insertions(+), 14 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java index 7bf212f84d..9a83d301f2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java @@ -48,6 +48,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import com.google.common.collect.Streams; import org.apache.commons.collections.CollectionUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -60,6 +61,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.function.Predicate; import java.util.stream.Collectors; /** @@ -732,6 +734,31 @@ public class SelectStmt extends QueryStmt { lateralViewRef.materializeRequiredSlots(baseTblSmap, analyzer); } } + + // In such case, agg output must be materialized whether outer query block required or not. + if (tableRef instanceof InlineViewRef) { + InlineViewRef inlineViewRef = (InlineViewRef) tableRef; + QueryStmt queryStmt = inlineViewRef.getQueryStmt(); + boolean hasConstant = Streams.concat(resultExprs.stream(), queryStmt.resultExprs.stream()) + .anyMatch(new Predicate<Expr>() { + @Override + public boolean test(Expr expr) { + if (expr instanceof SlotRef) { + SlotDescriptor desc = ((SlotRef) expr).getDesc(); + if (desc != null) { + List<Expr> sourceExprs = desc.getSourceExprs(); + return CollectionUtils.isNotEmpty(sourceExprs) + && sourceExprs.stream().allMatch(this); + } + return false; + } + return expr.isConstant(); + } + }); + if (hasConstant) { + queryStmt.resultExprs.forEach(Expr::materializeSrcExpr); + } + } } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java index 79f8389018..e2ec0f9249 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java @@ -1793,19 +1793,6 @@ public class QueryPlanTest { Assert.assertTrue(explainString.contains("PREDICATES: `k11` > '2021-06-01 00:00:00'")); } - @Test - public void testNullColumnViewOrderBy() throws Exception { - FeConstants.runningUnitTest = true; - connectContext.setDatabase("default_cluster:test"); - String sql = "select * from tbl_null_column_view where add_column is not null;"; - String explainString1 = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString1.contains("EMPTYSET")); - - String sql2 = "select * from tbl_null_column_view where add_column is not null order by query_id;"; - String explainString2 = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql2); - Assert.assertTrue(explainString2.contains("EMPTYSET")); - } - @Test public void testCompoundPredicateWriteRule() throws Exception { connectContext.setDatabase("default_cluster:test"); @@ -2155,4 +2142,4 @@ public class QueryPlanTest { String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryBaseTableStr); Assert.assertTrue(explainString.contains("PREAGGREGATION: ON")); } -} \ No newline at end of file +} diff --git a/regression-test/data/query_p0/subquery/test_subquery2.out b/regression-test/data/query_p0/subquery/test_subquery2.out new file mode 100644 index 0000000000..ceaff8c994 --- /dev/null +++ b/regression-test/data/query_p0/subquery/test_subquery2.out @@ -0,0 +1,10 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql_1 -- +abc + +-- !sql_2 -- +bc + +-- !sql_3 -- +1 + diff --git a/regression-test/suites/query_p0/subquery/test_subquery2.groovy b/regression-test/suites/query_p0/subquery/test_subquery2.groovy new file mode 100644 index 0000000000..e572459cc7 --- /dev/null +++ b/regression-test/suites/query_p0/subquery/test_subquery2.groovy @@ -0,0 +1,38 @@ +// 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_subquery2") { + + sql """DROP TABLE IF EXISTS subquerytest2""" + + sql """ + CREATE TABLE subquerytest2 (birth int)UNIQUE KEY(birth)DISTRIBUTED BY HASH (birth) + BUCKETS 1 PROPERTIES("replication_allocation" = "tag.location.default: 1"); + """ + + sql """insert into subquerytest2 values (2)""" + + + qt_sql_1 """select i from (select 'abc' as i, sum(birth) as j from subquerytest2) as tmp""" + + qt_sql_2 """select substring(i, 2) from (select 'abc' as i, sum(birth) as j from subquerytest2) as tmp""" + + qt_sql_3 """select count(1) from (select 'abc' as i, sum(birth) as j from subquerytest2) as tmp""" + + sql """DROP TABLE subquerytest2""" + +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org