From 01b5cc4f1f4bf1dca7bf5d52e4f2a8702a1ad31d Mon Sep 17 00:00:00 2001 From: seawinde Date: Mon, 21 Apr 2025 10:41:07 +0800 Subject: [PATCH] [opt](mtmv) Doesn't throw npe when not set distribution info which should be random (#49402) ### What problem does this PR solve? pr: https://github.com/apache/doris/pull/39427 commitId: 9ffb060a Issue Number: close #xxx Related PR: #xxx Problem Summary: ### Release note None ### Check List (For Author) - Test - [ ] Regression test - [ ] Unit Test - [ ] Manual test (add detailed scripts or steps below) - [ ] No need to test or manual test. Explain why: - [ ] This is a refactor/code format and no logic has been changed. - [ ] Previous test can cover this change. - [ ] No code files have been changed. - [ ] Other reason - Behavior changed: - [ ] No. - [ ] Yes. - Does this need documentation? - [ ] No. - [ ] Yes. ### Check List (For Reviewer who merge this PR) - [ ] Confirm the release note - [ ] Confirm test cases - [ ] Confirm document - [ ] Add branch pick label --- .../nereids/parser/LogicalPlanBuilder.java | 9 +- .../create_without_distribute.out | 11 ++ .../create_without_distribute.groovy | 148 ++++++++++++++++++ 3 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 regression-test/data/mtmv_p0/test_create_without_distribute/create_without_distribute.out create mode 100644 regression-test/suites/mtmv_p0/test_create_without_distribute/create_without_distribute.groovy diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java index 92595356e5..b41a8850ad 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java @@ -655,7 +655,12 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor { } @Override - public CreateMTMVCommand visitCreateMTMV(CreateMTMVContext ctx) { + public Command visitCreateMTMV(CreateMTMVContext ctx) { + if (ctx.buildMode() == null && ctx.refreshMethod() == null && ctx.refreshTrigger() == null + && ctx.cols == null && ctx.keys == null + && ctx.HASH() == null && ctx.RANDOM() == null && ctx.BUCKETS() == null) { + return new UnsupportedCommand(); + } List nameParts = visitMultipartIdentifier(ctx.mvName); BuildMode buildMode = visitBuildMode(ctx.buildMode()); @@ -672,7 +677,7 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor { if (ctx.HASH() != null) { desc = new DistributionDescriptor(true, ctx.AUTO() != null, bucketNum, visitIdentifierList(ctx.hashKeys)); - } else if (ctx.RANDOM() != null) { + } else { desc = new DistributionDescriptor(false, ctx.AUTO() != null, bucketNum, null); } diff --git a/regression-test/data/mtmv_p0/test_create_without_distribute/create_without_distribute.out b/regression-test/data/mtmv_p0/test_create_without_distribute/create_without_distribute.out new file mode 100644 index 0000000000..87ec9ad9ca --- /dev/null +++ b/regression-test/data/mtmv_p0/test_create_without_distribute/create_without_distribute.out @@ -0,0 +1,11 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !query_1_after -- +k 2023-12-08 1 +k 2023-12-08 1 +k 2023-12-09 1 +k 2023-12-10 1 +k 2023-12-10 1 +k 2023-12-11 2 +o 2023-12-12 2 +o 2023-12-12 2 + diff --git a/regression-test/suites/mtmv_p0/test_create_without_distribute/create_without_distribute.groovy b/regression-test/suites/mtmv_p0/test_create_without_distribute/create_without_distribute.groovy new file mode 100644 index 0000000000..e25be9c566 --- /dev/null +++ b/regression-test/suites/mtmv_p0/test_create_without_distribute/create_without_distribute.groovy @@ -0,0 +1,148 @@ +package test_create_without_distribute +// 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("create_without_distribute") { + String db = context.config.getDbNameByFile(context.file) + sql "use ${db}" + sql "set runtime_filter_mode=OFF"; + sql "SET ignore_shape_nodes='PhysicalDistribute,PhysicalProject'" + + sql """ + drop table if exists orders + """ + + sql """ + CREATE TABLE IF NOT EXISTS orders ( + o_orderkey INTEGER NOT NULL, + o_custkey INTEGER NOT NULL, + o_orderstatus CHAR(1) NOT NULL, + o_totalprice DECIMALV3(15,2) NOT NULL, + o_orderdate DATE NOT NULL, + o_orderpriority CHAR(15) NOT NULL, + o_clerk CHAR(15) NOT NULL, + o_shippriority INTEGER NOT NULL, + o_comment VARCHAR(79) NOT NULL, + public_col INT NULL + ) + DUPLICATE KEY(o_orderkey, o_custkey) + DISTRIBUTED BY HASH(o_orderkey) BUCKETS 3 + PROPERTIES ( + "replication_num" = "1" + ); + """ + sql """ + drop table if exists lineitem + """ + sql""" + CREATE TABLE IF NOT EXISTS lineitem ( + l_orderkey INTEGER NOT NULL, + l_partkey INTEGER NOT NULL, + l_suppkey INTEGER NOT NULL, + l_linenumber INTEGER NOT NULL, + l_quantity DECIMALV3(15,2) NOT NULL, + l_extendedprice DECIMALV3(15,2) NOT NULL, + l_discount DECIMALV3(15,2) NOT NULL, + l_tax DECIMALV3(15,2) NOT NULL, + l_returnflag CHAR(1) NOT NULL, + l_linestatus CHAR(1) NOT NULL, + l_shipdate DATE NOT NULL, + l_commitdate DATE NOT NULL, + l_receiptdate DATE NOT NULL, + l_shipinstruct CHAR(25) NOT NULL, + l_shipmode CHAR(10) NOT NULL, + l_comment VARCHAR(44) NOT NULL, + public_col INT NULL + ) + DUPLICATE KEY(l_orderkey, l_partkey, l_suppkey, l_linenumber) + DISTRIBUTED BY HASH(l_orderkey) BUCKETS 3 + PROPERTIES ( + "replication_num" = "1" + ) + """ + sql """ + drop table if exists partsupp + """ + sql """ + CREATE TABLE IF NOT EXISTS partsupp ( + ps_partkey INTEGER NOT NULL, + ps_suppkey INTEGER NOT NULL, + ps_availqty INTEGER NOT NULL, + ps_supplycost DECIMALV3(15,2) NOT NULL, + ps_comment VARCHAR(199) NOT NULL, + public_col INT NULL + ) + DUPLICATE KEY(ps_partkey, ps_suppkey) + DISTRIBUTED BY HASH(ps_partkey) BUCKETS 3 + PROPERTIES ( + "replication_num" = "1" + ) + """ + + sql """ + insert into lineitem values + (1, 2, 3, 4, 5.5, 6.5, 7.5, 8.5, 'o', 'k', '2023-12-08', '2023-12-09', '2023-12-10', 'a', 'b', 'yyyyyyyyy', 1), + (2, 4, 3, 4, 5.5, 6.5, 7.5, 8.5, 'o', 'k', '2023-12-09', '2023-12-09', '2023-12-10', 'a', 'b', 'yyyyyyyyy', null), + (3, 2, 4, 4, 5.5, 6.5, 7.5, 8.5, 'o', 'k', '2023-12-10', '2023-12-09', '2023-12-10', 'a', 'b', 'yyyyyyyyy', 2), + (4, 3, 3, 4, 5.5, 6.5, 7.5, 8.5, 'o', 'k', '2023-12-11', '2023-12-09', '2023-12-10', 'a', 'b', 'yyyyyyyyy', null), + (5, 2, 3, 6, 7.5, 8.5, 9.5, 10.5, 'k', 'o', '2023-12-12', '2023-12-12', '2023-12-13', 'c', 'd', 'xxxxxxxxx', 3); + """ + + sql """ + insert into orders values + (1, 1, 'o', 9.5, '2023-12-08', 'a', 'b', 1, 'yy', 1), + (1, 1, 'o', 10.5, '2023-12-08', 'a', 'b', 1, 'yy', null), + (2, 1, 'o', 11.5, '2023-12-09', 'a', 'b', 1, 'yy', 2), + (3, 1, 'o', 12.5, '2023-12-10', 'a', 'b', 1, 'yy', null), + (3, 1, 'o', 33.5, '2023-12-10', 'a', 'b', 1, 'yy', 3), + (4, 2, 'o', 43.2, '2023-12-11', 'c','d',2, 'mm', null), + (5, 2, 'o', 56.2, '2023-12-12', 'c','d',2, 'mi', 4), + (5, 2, 'o', 1.2, '2023-12-12', 'c','d',2, 'mi', null); + """ + + sql """ + insert into partsupp values + (2, 3, 9, 10.01, 'supply1', 1), + (2, 3, 10, 11.01, 'supply2', null); + """ + + sql """alter table lineitem modify column l_comment set stats ('row_count'='5');""" + sql """alter table orders modify column o_comment set stats ('row_count'='8');""" + sql """alter table partsupp modify column ps_comment set stats ('row_count'='2');""" + + // test create without distribute + sql """DROP MATERIALIZED VIEW IF EXISTS mv_1_1;""" + sql """ + CREATE MATERIALIZED VIEW mv_1_1 + BUILD IMMEDIATE + REFRESH COMPLETE + ON MANUAL + PROPERTIES ('replication_num' = '1') + AS + SELECT + l_linestatus, + to_date(o_orderdate) as date_alias, + o_shippriority + FROM + orders + LEFT JOIN lineitem ON l_orderkey = o_orderkey; + """ + + waitingMTMVTaskFinishedByMvName("mv_1_1", db) + + order_qt_query_1_after "select * from mv_1_1;" +}