[enhance](auto-partition) Constrain dynamic & auto partition use same interval unit if both enable (#30426)

This commit is contained in:
zclllyybb
2024-01-29 14:59:41 +08:00
committed by yiguolei
parent 3354ac48f7
commit b91a338bce
5 changed files with 197 additions and 1 deletions

View File

@ -248,6 +248,14 @@ public class PartitionDesc {
return type;
}
public ArrayList<Expr> getPartitionExprs() {
return partitionExprs;
}
public boolean isAutoCreatePartitions() {
return isAutoCreatePartitions;
}
public String toSql() {
throw new NotImplementedException("toSql not implemented");
}

View File

@ -41,6 +41,7 @@ import org.apache.doris.analysis.Expr;
import org.apache.doris.analysis.FunctionCallExpr;
import org.apache.doris.analysis.HashDistributionDesc;
import org.apache.doris.analysis.KeysDesc;
import org.apache.doris.analysis.LiteralExpr;
import org.apache.doris.analysis.PartitionDesc;
import org.apache.doris.analysis.PartitionKeyDesc;
import org.apache.doris.analysis.QueryStmt;
@ -64,6 +65,7 @@ import org.apache.doris.catalog.DatabaseIf;
import org.apache.doris.catalog.DatabaseProperty;
import org.apache.doris.catalog.DistributionInfo;
import org.apache.doris.catalog.DistributionInfo.DistributionInfoType;
import org.apache.doris.catalog.DynamicPartitionProperty;
import org.apache.doris.catalog.Env;
import org.apache.doris.catalog.EsTable;
import org.apache.doris.catalog.HashDistributionInfo;
@ -2548,7 +2550,27 @@ public class InternalCatalog implements CatalogIf<Database> {
"Only support dynamic partition properties on range partition table");
}
}
// check the interval same between dynamic & auto range partition
DynamicPartitionProperty dynamicProperty = olapTable.getTableProperty()
.getDynamicPartitionProperty();
if (dynamicProperty.isExist() && dynamicProperty.getEnable()
&& partitionDesc.isAutoCreatePartitions()) {
String dynamicUnit = dynamicProperty.getTimeUnit();
ArrayList<Expr> autoExprs = partitionDesc.getPartitionExprs();
for (Expr autoExpr : autoExprs) {
Expr func = (FunctionCallExpr) autoExpr;
for (Expr child : func.getChildren()) {
if (child instanceof LiteralExpr) {
String autoUnit = ((LiteralExpr) child).getStringValue();
if (!dynamicUnit.equalsIgnoreCase(autoUnit)) {
throw new AnalysisException(
"If support auto partition and dynamic partition at same time, "
+ "they must have the same interval unit.");
}
}
}
}
}
} catch (AnalysisException e) {
throw new DdlException(e.getMessage());
}