You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by kx...@apache.org on 2023/06/09 04:10:44 UTC
[doris] 08/29: [fix](MTMV) Support star expressions in select list (#20355)
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0-beta
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 1bb04b8bab6a85969a51559cbf6cea28c4c50a38
Author: zhangdong <49...@qq.com>
AuthorDate: Mon Jun 5 17:06:05 2023 +0800
[fix](MTMV) Support star expressions in select list (#20355)
---
.../CreateMultiTableMaterializedViewStmt.java | 84 ++++++++++++----------
.../catalog/MultiTableMaterializedViewTest.java | 20 ++++++
2 files changed, 67 insertions(+), 37 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMultiTableMaterializedViewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMultiTableMaterializedViewStmt.java
index e3d47dd473..541eb4ed9f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMultiTableMaterializedViewStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMultiTableMaterializedViewStmt.java
@@ -35,7 +35,9 @@ import org.apache.doris.datasource.InternalCatalog;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import org.apache.commons.lang3.StringUtils;
+import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -43,12 +45,12 @@ import java.util.stream.Collectors;
public class CreateMultiTableMaterializedViewStmt extends CreateTableStmt {
private final String mvName;
- private final MVRefreshInfo.BuildMode buildMode;
+ private final BuildMode buildMode;
private final MVRefreshInfo refreshInfo;
private final QueryStmt queryStmt;
private final Map<String, TableIf> tables = Maps.newHashMap();
- public CreateMultiTableMaterializedViewStmt(String mvName, MVRefreshInfo.BuildMode buildMode,
+ public CreateMultiTableMaterializedViewStmt(String mvName, BuildMode buildMode,
MVRefreshInfo refreshInfo, KeysDesc keyDesc, PartitionDesc partitionDesc, DistributionDesc distributionDesc,
Map<String, String> properties, QueryStmt queryStmt) {
this.mvName = mvName;
@@ -117,11 +119,44 @@ public class CreateMultiTableMaterializedViewStmt extends CreateTableStmt {
tables.put(table.getName(), table);
tables.put(tableRef.getAlias(), table);
}
- columnDefs = generateColumnDefinitions(selectStmt.getSelectList());
+ checkSelectListItems(selectStmt.getSelectList().getItems());
+ columnDefs = generateColumnDefinitions(selectStmt);
}
- private List<ColumnDef> generateColumnDefinitions(SelectList selectList) throws AnalysisException {
- List<Column> schema = generateSchema(selectList);
+ private void checkSelectListItems(List<SelectListItem> items) throws AnalysisException {
+ for (SelectListItem item : items) {
+ if (item.isStar()) {
+ continue;
+ }
+ Expr itemExpr = item.getExpr();
+ String alias = item.getAlias();
+ if (itemExpr instanceof SlotRef) {
+ continue;
+ } else if (itemExpr instanceof FunctionCallExpr && ((FunctionCallExpr) itemExpr).isAggregateFunction()) {
+ FunctionCallExpr functionCallExpr = (FunctionCallExpr) itemExpr;
+ String functionName = functionCallExpr.getFnName().getFunction();
+ MVColumnPattern mvColumnPattern = CreateMaterializedViewStmt.FN_NAME_TO_PATTERN
+ .get(functionName.toLowerCase());
+ if (mvColumnPattern == null) {
+ throw new AnalysisException(
+ "Materialized view does not support this function:" + functionCallExpr.toSqlImpl());
+ }
+ if (!mvColumnPattern.match(functionCallExpr)) {
+ throw new AnalysisException(
+ "The function " + functionName + " must match pattern:" + mvColumnPattern);
+ }
+ if (StringUtils.isEmpty(alias)) {
+ throw new AnalysisException("Function expr: " + functionName + " must have a alias name for MTMV.");
+ }
+ } else {
+ throw new AnalysisException(
+ "Materialized view does not support this expr:" + itemExpr.toSqlImpl());
+ }
+ }
+ }
+
+ private List<ColumnDef> generateColumnDefinitions(SelectStmt selectStmt) throws AnalysisException {
+ List<Column> schema = generateSchema(selectStmt);
return schema.stream()
.map(column -> new ColumnDef(
column.getName(),
@@ -134,10 +169,12 @@ public class CreateMultiTableMaterializedViewStmt extends CreateTableStmt {
).collect(Collectors.toList());
}
- private List<Column> generateSchema(SelectList selectList) throws AnalysisException {
+ private List<Column> generateSchema(SelectStmt selectStmt) throws AnalysisException {
+ ArrayList<Expr> resultExprs = selectStmt.getResultExprs();
+ ArrayList<String> colLabels = selectStmt.getColLabels();
Map<String, Column> uniqueMVColumnItems = Maps.newLinkedHashMap();
- for (SelectListItem item : selectList.getItems()) {
- Column column = generateMTMVColumn(item);
+ for (int i = 0; i < resultExprs.size(); i++) {
+ Column column = generateMTMVColumn(resultExprs.get(i), colLabels.get(i));
if (uniqueMVColumnItems.put(column.getName(), column) != null) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_DUP_FIELDNAME, column.getName());
}
@@ -146,35 +183,8 @@ public class CreateMultiTableMaterializedViewStmt extends CreateTableStmt {
return Lists.newArrayList(uniqueMVColumnItems.values());
}
- private Column generateMTMVColumn(SelectListItem item) throws AnalysisException {
- Expr itemExpr = item.getExpr();
- String alias = item.getAlias();
- Column mtmvColumn = null;
- if (itemExpr instanceof SlotRef) {
- SlotRef slotRef = (SlotRef) itemExpr;
- String name = (alias != null) ? alias.toLowerCase() : slotRef.getColumnName().toLowerCase();
- mtmvColumn = new Column(name, slotRef.getType(), true);
- } else if (itemExpr instanceof FunctionCallExpr && ((FunctionCallExpr) itemExpr).isAggregateFunction()) {
- FunctionCallExpr functionCallExpr = (FunctionCallExpr) itemExpr;
- String functionName = functionCallExpr.getFnName().getFunction();
- MVColumnPattern mvColumnPattern = CreateMaterializedViewStmt.FN_NAME_TO_PATTERN
- .get(functionName.toLowerCase());
- if (mvColumnPattern == null) {
- throw new AnalysisException(
- "Materialized view does not support this function:" + functionCallExpr.toSqlImpl());
- }
- if (!mvColumnPattern.match(functionCallExpr)) {
- throw new AnalysisException("The function " + functionName + " must match pattern:" + mvColumnPattern);
- }
- String name;
- if (alias != null) {
- name = alias.toLowerCase();
- mtmvColumn = new Column(name, functionCallExpr.getType(), true);
- } else {
- throw new AnalysisException("Function expr: " + functionName + " must have a alias name for MTMV.");
- }
- }
- return mtmvColumn;
+ private Column generateMTMVColumn(Expr expr, String colLabel) {
+ return new Column(colLabel.toLowerCase(), expr.getType(), true);
}
@Override
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/MultiTableMaterializedViewTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/MultiTableMaterializedViewTest.java
index 89eab32e29..d1c16064ed 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/MultiTableMaterializedViewTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/MultiTableMaterializedViewTest.java
@@ -534,4 +534,24 @@ public class MultiTableMaterializedViewTest extends TestWithFeService {
+ "KEY(`mpk`)\n"
+ "DISTRIBUTED BY HASH(`mpk`) BUCKETS 10"));
}
+
+ @Test
+ void testCreateWithStar() throws Exception {
+ createTable("CREATE TABLE t_user ("
+ + " event_day DATE,"
+ + " id bigint,"
+ + " username varchar(20)"
+ + ")"
+ + "DISTRIBUTED BY HASH(id) BUCKETS 10 "
+ + "PROPERTIES ('replication_num' = '1')"
+ );
+ new StmtExecutor(connectContext, "CREATE MATERIALIZED VIEW mv "
+ + "BUILD IMMEDIATE REFRESH COMPLETE "
+ + "START WITH \"2022-10-27 19:35:00\" "
+ + "NEXT 1 SECOND "
+ + "DISTRIBUTED BY HASH(username) BUCKETS 10 "
+ + "PROPERTIES ('replication_num' = '1') "
+ + "AS SELECT t1.* FROM t_user t1").execute();
+ Assertions.assertNull(connectContext.getState().getErrorCode(), connectContext.getState().getErrorMessage());
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org