[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:
@ -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>();
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -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} """
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user