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 0a1d9f4cbc1 [feature](mtmv)add more test case1 (#28910)
0a1d9f4cbc1 is described below
commit 0a1d9f4cbc15fa6aa0691b00698d7b9f445ce5ed
Author: zhangdong <[email protected]>
AuthorDate: Sat Dec 23 14:39:44 2023 +0800
[feature](mtmv)add more test case1 (#28910)
---
.../java/org/apache/doris/mtmv/MTMVPlanUtil.java | 9 +-
.../trees/plans/commands/info/CreateMTMVInfo.java | 29 +-
.../trees/plans/logical/LogicalSubQueryAlias.java | 4 +
regression-test/data/mtmv_p0/test_build_mtmv.out | 7 +-
.../suites/mtmv_p0/test_build_mtmv.groovy | 293 +++++++++++++++++++--
5 files changed, 313 insertions(+), 29 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVPlanUtil.java
b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVPlanUtil.java
index a8bc43a159e..ab87e834409 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVPlanUtil.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVPlanUtil.java
@@ -38,6 +38,8 @@ import
org.apache.doris.nereids.trees.plans.visitor.TableCollector;
import
org.apache.doris.nereids.trees.plans.visitor.TableCollector.TableCollectorContext;
import org.apache.doris.qe.ConnectContext;
+import com.google.common.collect.Sets;
+
import java.util.List;
import java.util.Set;
@@ -77,12 +79,7 @@ public class MTMVPlanUtil {
}
private static Set<BaseTableInfo> getBaseViews(Plan plan) {
- TableCollectorContext collectorContext =
- new TableCollector.TableCollectorContext(
-
com.google.common.collect.Sets.newHashSet(TableType.VIEW));
- plan.accept(TableCollector.INSTANCE, collectorContext);
- List<TableIf> collectedTables = collectorContext.getCollectedTables();
- return transferTableIfToInfo(collectedTables);
+ return Sets.newHashSet();
}
private static Set<BaseTableInfo> transferTableIfToInfo(List<TableIf>
tables) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateMTMVInfo.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateMTMVInfo.java
index 6d81191c8be..0ed1bfba7be 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateMTMVInfo.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateMTMVInfo.java
@@ -30,6 +30,7 @@ import org.apache.doris.catalog.OlapTable;
import org.apache.doris.catalog.PartitionType;
import org.apache.doris.catalog.TableIf;
import org.apache.doris.catalog.TableIf.TableType;
+import org.apache.doris.catalog.View;
import org.apache.doris.common.DdlException;
import org.apache.doris.common.ErrorCode;
import org.apache.doris.common.FeNameFormat;
@@ -56,6 +57,7 @@ import
org.apache.doris.nereids.trees.plans.algebra.OneRowRelation;
import
org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel;
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
import org.apache.doris.nereids.trees.plans.logical.LogicalSink;
+import org.apache.doris.nereids.trees.plans.logical.LogicalSubQueryAlias;
import
org.apache.doris.nereids.trees.plans.visitor.NondeterministicFunctionCollector;
import org.apache.doris.nereids.trees.plans.visitor.TableCollector;
import
org.apache.doris.nereids.trees.plans.visitor.TableCollector.TableCollectorContext;
@@ -66,6 +68,8 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import java.util.ArrayList;
import java.util.List;
@@ -80,6 +84,8 @@ import java.util.stream.Collectors;
* MTMV info in creating MTMV.
*/
public class CreateMTMVInfo {
+ public static final Logger LOG =
LogManager.getLogger(CreateMTMVInfo.class);
+
private final boolean ifNotExists;
private final TableNameInfo mvName;
private List<String> keys;
@@ -208,7 +214,7 @@ public class CreateMTMVInfo {
throw new AnalysisException("at least contain one table");
}
// can not contain VIEW or MTMV
- analyzeBaseTables(plan);
+ analyzeBaseTables(planner.getAnalyzedPlan());
// can not contain Random function
analyzeExpressions(planner.getAnalyzedPlan());
// can not contain partition or tablets
@@ -282,11 +288,28 @@ public class CreateMTMVInfo {
private void analyzeBaseTables(Plan plan) {
TableCollectorContext collectorContext =
- new
TableCollector.TableCollectorContext(Sets.newHashSet(TableType.MATERIALIZED_VIEW,
TableType.VIEW));
+ new
TableCollector.TableCollectorContext(Sets.newHashSet(TableType.MATERIALIZED_VIEW));
plan.accept(TableCollector.INSTANCE, collectorContext);
List<TableIf> collectedTables = collectorContext.getCollectedTables();
if (!CollectionUtils.isEmpty(collectedTables)) {
- throw new AnalysisException("can not contain MATERIALIZED_VIEW or
VIEW");
+ throw new AnalysisException("can not contain MATERIALIZED_VIEW");
+ }
+
+ List<Object> subQuerys = plan.collectToList(node -> node instanceof
LogicalSubQueryAlias);
+ for (Object subquery : subQuerys) {
+ List<String> qualifier = ((LogicalSubQueryAlias)
subquery).getQualifier();
+ if (!CollectionUtils.isEmpty(qualifier) && qualifier.size() == 3) {
+ try {
+ TableIf table = Env.getCurrentEnv().getCatalogMgr()
+ .getCatalogOrAnalysisException(qualifier.get(0))
+
.getDbOrAnalysisException(qualifier.get(1)).getTableOrAnalysisException(qualifier.get(2));
+ if (table instanceof View) {
+ throw new AnalysisException("can not contain VIEW");
+ }
+ } catch (org.apache.doris.common.AnalysisException e) {
+ LOG.warn("can not get table, ", e);
+ }
+ }
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSubQueryAlias.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSubQueryAlias.java
index c1bbfdaf930..73ae70e62bc 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSubQueryAlias.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSubQueryAlias.java
@@ -183,6 +183,10 @@ public class LogicalSubQueryAlias<CHILD_TYPE extends Plan>
extends LogicalUnary<
return relationId;
}
+ public List<String> getQualifier() {
+ return qualifier;
+ }
+
@Override
public Set<RelationId> getInputRelations() {
Set<RelationId> relationIdSet = Sets.newHashSet();
diff --git a/regression-test/data/mtmv_p0/test_build_mtmv.out
b/regression-test/data/mtmv_p0/test_build_mtmv.out
index bc43296bd48..ad0100fe274 100644
--- a/regression-test/data/mtmv_p0/test_build_mtmv.out
+++ b/regression-test/data/mtmv_p0/test_build_mtmv.out
@@ -45,9 +45,7 @@ lisi 300
zhangsang 200
-- !select --
-clz 200
-lisi 300
-zhangsang 200
+{grace_period=3333}
-- !select --
clz 200
@@ -59,3 +57,6 @@ clz 200
lisi 300
zhangsang 200
+-- !select_union --
+11 111
+
diff --git a/regression-test/suites/mtmv_p0/test_build_mtmv.groovy
b/regression-test/suites/mtmv_p0/test_build_mtmv.groovy
index e7b8e89ce5a..882a7eff22e 100644
--- a/regression-test/suites/mtmv_p0/test_build_mtmv.groovy
+++ b/regression-test/suites/mtmv_p0/test_build_mtmv.groovy
@@ -19,15 +19,18 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.Instant;
import java.time.ZoneId;
+import org.junit.Assert;
suite("test_build_mtmv") {
def tableName = "t_test_create_mtmv_user"
def tableNamePv = "t_test_create_mtmv_user_pv"
def mvName = "multi_mv_test_create_mtmv"
+ def viewName = "multi_mv_test_create_view"
def mvNameRenamed = "multi_mv_test_create_mtmv_renamed"
sql """drop table if exists `${tableName}`"""
sql """drop table if exists `${tableNamePv}`"""
+ sql """drop view if exists `${viewName}`"""
sql """
CREATE TABLE IF NOT EXISTS `${tableName}` (
@@ -59,6 +62,10 @@ suite("test_build_mtmv") {
INSERT INTO ${tableNamePv}
VALUES("2022-10-26",1,200),("2022-10-28",2,200),("2022-10-28",3,300);
"""
+ sql """
+ create view if not exists ${viewName} as select * from
${tableName};
+ """
+
sql """drop materialized view if exists ${mvName};"""
sql """drop materialized view if exists ${mvNameRenamed};"""
@@ -69,7 +76,10 @@ suite("test_build_mtmv") {
BUILD DEFERRED REFRESH COMPLETE ON MANUAL
COMMENT "comment1"
DISTRIBUTED BY RANDOM BUCKETS 2
- PROPERTIES ('replication_num' = '1')
+ PROPERTIES (
+ 'replication_num' = '1',
+ "grace_period"="333"
+ )
AS
SELECT id, username FROM ${tableName};
"""
@@ -77,23 +87,67 @@ suite("test_build_mtmv") {
def showCreateTableResult = sql """show create table ${mvName}"""
logger.info("showCreateTableResult: " + showCreateTableResult.toString())
assertTrue(showCreateTableResult.toString().contains("CREATE MATERIALIZED
VIEW `multi_mv_test_create_mtmv` (\n `aa` BIGINT NULL COMMENT 'aaa',\n `bb`
VARCHAR(20) NULL\n) ENGINE=MATERIALIZED_VIEW\nCOMMENT 'comment1'\nDISTRIBUTED
BY RANDOM BUCKETS 2\nPROPERTIES"))
- sql """
- DROP MATERIALIZED VIEW ${mvName}
- """
- // IMMEDIATE MANUAL
- sql """
- CREATE MATERIALIZED VIEW ${mvName}
- BUILD IMMEDIATE REFRESH COMPLETE ON MANUAL
- DISTRIBUTED BY RANDOM BUCKETS 2
- PROPERTIES ('replication_num' = '1')
- AS
- SELECT ${tableName}.username, ${tableNamePv}.pv FROM ${tableName},
${tableNamePv} WHERE ${tableName}.id=${tableNamePv}.id;
- """
- def jobName = getJobName("regression_test_mtmv_p0", mvName);
- println jobName
- waitingMTMVTaskFinished(jobName)
- order_qt_select "SELECT * FROM ${mvName}"
+ // if not exist
+ try {
+ sql """
+ CREATE MATERIALIZED VIEW IF NOT EXISTS ${mvName}
+ BUILD DEFERRED REFRESH COMPLETE ON MANUAL
+ DISTRIBUTED BY RANDOM BUCKETS 2
+ PROPERTIES ('replication_num' = '1')
+ AS
+ SELECT * from ${tableName};
+ """
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ Assert.fail();
+ }
+
+ // not use `if not exist`
+ try {
+ sql """
+ CREATE MATERIALIZED VIEW ${mvName}
+ BUILD DEFERRED REFRESH COMPLETE ON MANUAL
+ DISTRIBUTED BY RANDOM BUCKETS 2
+ PROPERTIES ('replication_num' = '1')
+ AS
+ SELECT * from ${mvName};
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
+ // not allow create mv use other mv
+ try {
+ sql """
+ CREATE MATERIALIZED VIEW ${mvNameRenamed}
+ BUILD DEFERRED REFRESH COMPLETE ON MANUAL
+ DISTRIBUTED BY RANDOM BUCKETS 2
+ PROPERTIES ('replication_num' = '1')
+ AS
+ SELECT * from ${mvName};
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
+ // not allow create mv use view
+ try {
+ sql """
+ CREATE MATERIALIZED VIEW ${mvNameRenamed}
+ BUILD DEFERRED REFRESH COMPLETE ON MANUAL
+ DISTRIBUTED BY RANDOM BUCKETS 2
+ PROPERTIES ('replication_num' = '1')
+ AS
+ SELECT * from ${viewName};
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
sql """
DROP MATERIALIZED VIEW ${mvName}
"""
@@ -205,6 +259,111 @@ suite("test_build_mtmv") {
log.info(e.getMessage())
}
+ // now
+ try {
+ sql """
+ CREATE MATERIALIZED VIEW ${mvName}
+ BUILD IMMEDIATE REFRESH COMPLETE ON SCHEDULE EVERY 10 SECOND
STARTS "2023-12-13 21:07:09"
+ DISTRIBUTED BY RANDOM BUCKETS 2
+ PROPERTIES ('replication_num' = '1')
+ AS
+ SELECT now() as dd, ${tableName}.username, ${tableNamePv}.pv FROM
${tableName}, ${tableNamePv} WHERE ${tableName}.id=${tableNamePv}.id;
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
+ // uuid
+ try {
+ sql """
+ CREATE MATERIALIZED VIEW ${mvName}
+ BUILD IMMEDIATE REFRESH COMPLETE ON SCHEDULE EVERY 10 SECOND
STARTS "2023-12-13 21:07:09"
+ DISTRIBUTED BY RANDOM BUCKETS 2
+ PROPERTIES ('replication_num' = '1')
+ AS
+ SELECT uuid() as dd, ${tableName}.username, ${tableNamePv}.pv FROM
${tableName}, ${tableNamePv} WHERE ${tableName}.id=${tableNamePv}.id;
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
+ // unix_timestamp
+ try {
+ sql """
+ CREATE MATERIALIZED VIEW ${mvName}
+ BUILD IMMEDIATE REFRESH COMPLETE ON SCHEDULE EVERY 10 SECOND
STARTS "2023-12-13 21:07:09"
+ DISTRIBUTED BY RANDOM BUCKETS 2
+ PROPERTIES ('replication_num' = '1')
+ AS
+ SELECT unix_timestamp() as dd, ${tableName}.username,
${tableNamePv}.pv FROM ${tableName}, ${tableNamePv} WHERE
${tableName}.id=${tableNamePv}.id;
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
+ // utc_timestamp
+ try {
+ sql """
+ CREATE MATERIALIZED VIEW ${mvName}
+ BUILD IMMEDIATE REFRESH COMPLETE ON SCHEDULE EVERY 10 SECOND
STARTS "2023-12-13 21:07:09"
+ DISTRIBUTED BY RANDOM BUCKETS 2
+ PROPERTIES ('replication_num' = '1')
+ AS
+ SELECT utc_timestamp() as dd, ${tableName}.username,
${tableNamePv}.pv FROM ${tableName}, ${tableNamePv} WHERE
${tableName}.id=${tableNamePv}.id;
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
+ // CURDATE
+ try {
+ sql """
+ CREATE MATERIALIZED VIEW ${mvName}
+ BUILD IMMEDIATE REFRESH COMPLETE ON SCHEDULE EVERY 10 SECOND
STARTS "2023-12-13 21:07:09"
+ DISTRIBUTED BY RANDOM BUCKETS 2
+ PROPERTIES ('replication_num' = '1')
+ AS
+ SELECT CURDATE() as dd, ${tableName}.username, ${tableNamePv}.pv
FROM ${tableName}, ${tableNamePv} WHERE ${tableName}.id=${tableNamePv}.id;
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
+ // uuid_numeric
+ try {
+ sql """
+ CREATE MATERIALIZED VIEW ${mvName}
+ BUILD IMMEDIATE REFRESH COMPLETE ON SCHEDULE EVERY 10 SECOND
STARTS "2023-12-13 21:07:09"
+ DISTRIBUTED BY RANDOM BUCKETS 2
+ PROPERTIES ('replication_num' = '1')
+ AS
+ SELECT uuid_numeric() as dd, ${tableName}.username,
${tableNamePv}.pv FROM ${tableName}, ${tableNamePv} WHERE
${tableName}.id=${tableNamePv}.id;
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
+ // current_time
+ try {
+ sql """
+ CREATE MATERIALIZED VIEW ${mvName}
+ BUILD IMMEDIATE REFRESH COMPLETE ON SCHEDULE EVERY 10 SECOND
STARTS "2023-12-13 21:07:09"
+ DISTRIBUTED BY RANDOM BUCKETS 2
+ PROPERTIES ('replication_num' = '1')
+ AS
+ SELECT current_time() as dd, ${tableName}.username,
${tableNamePv}.pv FROM ${tableName}, ${tableNamePv} WHERE
${tableName}.id=${tableNamePv}.id;
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
// repeat cols
try {
sql """
@@ -257,6 +416,74 @@ suite("test_build_mtmv") {
waitingMTMVTaskFinished(jobName)
order_qt_select "SELECT * FROM ${mvName}"
+ // alter mv property
+ sql """
+ alter Materialized View ${mvName} set("grace_period"="3333");
+ """
+ order_qt_select "select MvProperties from
mv_infos('database'='regression_test_mtmv_p0') where Name = '${mvName}'"
+
+ // use alter table
+ // not allow rename
+ try {
+ sql """
+ alter table ${mvName} rename ${mvNameRenamed}
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
+
+ // not allow modify `grace_period`
+ try {
+ sql """
+ alter table ${mvName} set("grace_period"="3333");
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
+ // allow modify comment
+ try {
+ sql """
+ alter table ${mvName} MODIFY COMMENT "new table comment";
+ """
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ Assert.fail();
+ }
+
+ // not allow modify column
+ try {
+ sql """
+ alter table ${mvName} DROP COLUMN pv;
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
+ // not allow replace
+ try {
+ sql """
+ alter table ${mvName} REPLACE WITH TABLE ${tableName};
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
+ // not allow use mv modify property of table
+ try {
+ sql """
+ alter Materialized View ${mvName} set("replication_num" = "1");
+ """
+ Assert.fail();
+ } catch (Exception e) {
+ log.info(e.getMessage())
+ }
+
// alter rename
sql """
alter Materialized View ${mvName} rename ${mvNameRenamed};
@@ -304,4 +531,36 @@ suite("test_build_mtmv") {
println tasks
assertEquals(tasks.get(0).get(0), 0);
+ // test bitmap
+ sql """drop table if exists `${tableName}`"""
+ sql """
+ CREATE TABLE IF NOT EXISTS `${tableName}` (
+ id BIGINT,
+ user_id bitmap
+ )
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 2
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+ """
+ sql """
+ insert into ${tableName} values(11,to_bitmap(111))
+ """
+
+ sql """
+ CREATE MATERIALIZED VIEW ${mvName}
+ BUILD IMMEDIATE REFRESH COMPLETE ON MANUAL
+ DISTRIBUTED BY RANDOM BUCKETS 2
+ PROPERTIES ('replication_num' = '1')
+ AS
+ select id,BITMAP_UNION(user_id) as bb from ${tableName} group by
id;
+ """
+ jobName = getJobName("regression_test_mtmv_p0", mvName);
+ waitingMTMVTaskFinished(jobName)
+ order_qt_select_union "SELECT id,bitmap_to_string(bb) FROM ${mvName}"
+
+ sql """
+ DROP MATERIALIZED VIEW ${mvName}
+ """
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]