[feature-wip](mv lifecycle) separate life cycle of base table and its materialized views (#19210)

support related syntax and add:regress-test case

---------

Co-authored-by: yzy <yzy@nanfeng_yzy@163.com>
This commit is contained in:
nanfeng
2023-04-30 17:42:02 +08:00
committed by GitHub
parent 8eab20d3df
commit da4de37dec
5 changed files with 175 additions and 0 deletions

View File

@ -1528,6 +1528,10 @@ alter_table_clause ::=
{:
RESULT = new DropPartitionClause(ifExists, partitionName, isTempPartition, force ? force : isTempPartition);
:}
| KW_DROP opt_tmp:isTempPartition KW_PARTITION opt_if_exists:ifExists ident:partitionName opt_force:force KW_FROM KW_INDEX ident:indexName
{:
RESULT = new DropPartitionFromIndexClause(ifExists, partitionName, isTempPartition, force ? force : isTempPartition, indexName);
:}
| KW_MODIFY opt_tmp:isTempPartition KW_PARTITION ident:partitionName KW_SET LPAREN key_value_map:properties RPAREN
{:
ArrayList<String> partitions = new ArrayList<String>();

View File

@ -27,6 +27,7 @@ import org.apache.doris.analysis.CreateMaterializedViewStmt;
import org.apache.doris.analysis.CreateMultiTableMaterializedViewStmt;
import org.apache.doris.analysis.DropMaterializedViewStmt;
import org.apache.doris.analysis.DropPartitionClause;
import org.apache.doris.analysis.DropPartitionFromIndexClause;
import org.apache.doris.analysis.DropTableStmt;
import org.apache.doris.analysis.MVRefreshInfo.RefreshMethod;
import org.apache.doris.analysis.ModifyColumnCommentClause;
@ -257,6 +258,8 @@ public class Alter {
needProcessOutsideTableLock = true;
}
}
} else if (alterClause instanceof DropPartitionFromIndexClause) {
// do nothing
} else if (alterClause instanceof AddPartitionClause) {
needProcessOutsideTableLock = true;
} else {

View File

@ -0,0 +1,92 @@
// 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.
package org.apache.doris.analysis;
import org.apache.doris.alter.AlterOpType;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.ErrorCode;
import org.apache.doris.common.ErrorReport;
import com.google.common.base.Strings;
import java.util.Map;
// clause which is used to drop a partition from specified index
public class DropPartitionFromIndexClause extends AlterTableClause {
private boolean ifExists;
private String partitionName;
// true if this is to drop a temp partition
private boolean isTempPartition;
private boolean forceDrop;
private String indexName;
public DropPartitionFromIndexClause(boolean ifExists, String partitionName, boolean isTempPartition,
boolean forceDrop, String indexName) {
super(AlterOpType.DROP_PARTITION);
this.ifExists = ifExists;
this.partitionName = partitionName;
this.isTempPartition = isTempPartition;
this.needTableStable = false;
this.forceDrop = forceDrop;
this.indexName = indexName;
}
public boolean isSetIfExists() {
return ifExists;
}
public String getPartitionName() {
return partitionName;
}
public boolean isTempPartition() {
return isTempPartition;
}
public boolean isForceDrop() {
return forceDrop;
}
@Override
public void analyze(Analyzer analyzer) throws AnalysisException {
if (Strings.isNullOrEmpty(partitionName)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_WRONG_PARTITION_NAME, partitionName);
}
if (Strings.isNullOrEmpty(indexName)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_WRONG_NAME_FOR_INDEX, indexName);
}
}
@Override
public Map<String, String> getProperties() {
return null;
}
@Override
public String toSql() {
StringBuilder sb = new StringBuilder();
sb.append("DROP PARTITION " + partitionName);
sb.append(" FROM INDEX " + indexName);
return sb.toString();
}
@Override
public String toString() {
return toSql();
}
}

View File

@ -0,0 +1,11 @@
-- This file is automatically generated. You should know what you did if you want to edit this
-- !select --
1 2
2 4
3 6
-- !select --
1 2
2 4
3 6

View File

@ -0,0 +1,65 @@
// 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.
// this suite is for creating table with timestamp datatype in defferent
// case. For example: 'year' and 'Year' datatype should also be valid in definition
suite("sql_drop_partition_from_index") {
def testDb = "test_db"
def testTable = "test_table"
def testMv = "test_mv"
try {
sql """CREATE DATABASE IF NOT EXISTS ${testDb}"""
sql """USE ${testDb}"""
sql """
create table ${testTable} (
`k1` int not null,
`k2` int not null,
`k3` int not null
)
engine=olap
duplicate key(k1, k2, k3)
partition by list(k1) (
partition p1 values in ("1","2","3")
)
distributed by hash(k1) buckets 1
properties(
"replication_num"="1",
"light_schema_change"="true",
"compression"="zstd"
);
"""
sql"""
INSERT INTO ${testTable} PARTITION(p1) VALUES(1,1,1),(2,2,2),(3,3,3)
"""
createMV ("create materialized view ${testMv} as select k1,k2+k3 from ${testTable}")
qt_select """ SELECT k1,k2+k3 FROM ${testTable} PARTITION(p1) """
// index is empty
def errorSqlResult = """ ALTER TABLE ${testTable} DROP PARTITION p1 FROM INDEX """
assertTrue(errorSqlResult != null)
sql""" ALTER TABLE ${testTable} DROP PARTITION p1 FROM INDEX ${testTable} """
qt_select """ SELECT k1, k2+k3 FROM ${testTable} PARTITION(p1) """
} finally {
sql """ DROP MATERIALIZED VIEW ${testMv} ON ${testTable} """
sql """ DROP TABLE ${testTable} """
sql """ DROP DATABASE ${testDb} """
}
}