You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/01/31 15:43:00 UTC
[doris] branch master updated: [fix](planner) create view generate wrong sql when sql contains multi count distinct (#16092)
This is an automated email from the ASF dual-hosted git repository.
morningman 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 c63a960df6 [fix](planner) create view generate wrong sql when sql contains multi count distinct (#16092)
c63a960df6 is described below
commit c63a960df63c6d52305e0468ad3a7342ea26ceb2
Author: morrySnow <10...@users.noreply.github.com>
AuthorDate: Tue Jan 31 23:42:53 2023 +0800
[fix](planner) create view generate wrong sql when sql contains multi count distinct (#16092)
If sql in create view has more than one count distinct, and write column name explicitly.
We will generate sql contains function multi_count_distinct.
It cannot be analyzed and all query containing this view will fail.
---
.../org/apache/doris/analysis/BaseViewStmt.java | 1 +
.../java/org/apache/doris/analysis/SelectStmt.java | 8 ++-
.../suites/ddl_p0/test_create_view.groovy | 72 ++++++++++++++++++++++
3 files changed, 80 insertions(+), 1 deletion(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/BaseViewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/BaseViewStmt.java
index 477e440f5e..8114448f0d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BaseViewStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BaseViewStmt.java
@@ -117,6 +117,7 @@ public class BaseViewStmt extends DdlStmt {
Analyzer tmpAnalyzer = new Analyzer(analyzer);
List<String> colNames = cols.stream().map(c -> c.getColName()).collect(Collectors.toList());
+ cloneStmt.setNeedToSql(true);
cloneStmt.substituteSelectList(tmpAnalyzer, colNames);
try (ToSqlContext toSqlContext = ToSqlContext.getOrNewThreadLocalContext()) {
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 3415e4252e..55f8a8824e 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
@@ -2030,7 +2030,7 @@ public class SelectStmt extends QueryStmt {
if (i != 0) {
strBuilder.append(", ");
}
- if (needToSql) {
+ if (needToSql && CollectionUtils.isNotEmpty(originalExpr)) {
strBuilder.append(originalExpr.get(i).toSql());
} else {
strBuilder.append(resultExprs.get(i).toSql());
@@ -2204,6 +2204,9 @@ public class SelectStmt extends QueryStmt {
// Resolve and replace non-InlineViewRef table refs with a BaseTableRef or ViewRef.
TableRef tblRef = fromClause.get(i);
tblRef = analyzer.resolveTableRef(tblRef);
+ if (tblRef instanceof InlineViewRef) {
+ ((InlineViewRef) tblRef).setNeedToSql(needToSql);
+ }
Preconditions.checkNotNull(tblRef);
fromClause.set(i, tblRef);
tblRef.setLeftTblRef(leftTblRef);
@@ -2233,6 +2236,9 @@ public class SelectStmt extends QueryStmt {
resultExprs.add(item.getExpr());
}
}
+ if (needToSql) {
+ originalExpr = Expr.cloneList(resultExprs);
+ }
// substitute group by
if (groupByClause != null) {
substituteOrdinalsAliases(groupByClause.getGroupingExprs(), "GROUP BY", analyzer, false);
diff --git a/regression-test/suites/ddl_p0/test_create_view.groovy b/regression-test/suites/ddl_p0/test_create_view.groovy
new file mode 100644
index 0000000000..4c401017ee
--- /dev/null
+++ b/regression-test/suites/ddl_p0/test_create_view.groovy
@@ -0,0 +1,72 @@
+// 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_create_view") {
+
+ sql """DROP TABLE IF EXISTS count_distinct"""
+ sql """
+ CREATE TABLE IF NOT EXISTS count_distinct
+ (
+ RQ DATE NOT NULL COMMENT "日期",
+ v1 VARCHAR(100) NOT NULL COMMENT "字段1",
+ v2 VARCHAR(100) NOT NULL COMMENT "字段2",
+ v3 VARCHAR(100) REPLACE_IF_NOT_NULL COMMENT "字段3"
+ )
+ AGGREGATE KEY(RQ,v1,v2)
+ PARTITION BY RANGE(RQ)
+ (
+ PARTITION p20220908 VALUES LESS THAN ('2022-09-09')
+ )
+ DISTRIBUTED BY HASH(v1,v2) BUCKETS 3
+ PROPERTIES(
+ "replication_num" = "1",
+ "dynamic_partition.enable" = "true",
+ "dynamic_partition.time_unit" = "DAY",
+ "dynamic_partition.start" = "-3",
+ "dynamic_partition.end" = "3",
+ "dynamic_partition.prefix" = "p",
+ "dynamic_partition.buckets" = "3"
+ );
+ """
+ sql """
+ CREATE VIEW IF NOT EXISTS test_count_distinct
+ (
+ RQ comment "日期",
+ v1 comment "v1",
+ v2 comment "v2",
+ v3 comment "v3"
+ )
+ AS
+ select aa.RQ as RQ, aa.v1 as v1,aa.v2 as v2 , bb.v3 as v3 from
+ (
+ select RQ, count(distinct v1) as v1 , count(distinct v2 ) as v2
+ from count_distinct
+ group by RQ
+ ) aa
+ LEFT JOIN
+ (
+ select RQ, max(v3) as v3
+ from count_distinct
+ group by RQ
+ ) bb
+ on aa.RQ = bb.RQ;
+ """
+
+ sql """select * from test_count_distinct"""
+ sql """DROP VIEW IF EXISTS test_count_distinct"""
+ sql """DROP TABLE IF EXISTS count_distinct"""
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org