nooneuse commented on code in PR #66307:
URL: https://github.com/apache/doris/pull/66307#discussion_r3827779167
##########
fe/fe-core/src/main/java/org/apache/doris/catalog/constraint/ConstraintManager.java:
##########
@@ -361,40 +617,53 @@ private void dropConstraintsByPrefix(String prefix) {
*/
public void renameTable(TableNameInfo oldTableInfo,
TableNameInfo newTableInfo) {
- String oldKey = toKey(oldTableInfo);
- String newKey = toKey(newTableInfo);
writeLock();
try {
- // Move this table's own constraints
- Map<String, Constraint> tableConstraints
- = constraintsMap.remove(oldKey);
- if (tableConstraints != null) {
- constraintsMap.put(newKey, tableConstraints);
+ renameTableWithoutLock(oldTableInfo, newTableInfo);
+ } finally {
+ writeUnlock();
+ }
+ }
+
+ /** Move every qualified table key when a database is renamed. */
+ public void renameDatabase(String catalogName, String oldDbName, String
newDbName) {
+ String oldPrefix = catalogName + "." + oldDbName + ".";
+ writeLock();
+ try {
+ List<TableNameInfo> oldTableInfos =
constraintsMap.keySet().stream()
+ .filter(key -> key.startsWith(oldPrefix))
+ .map(TableNameInfo::new)
+ .collect(Collectors.toList());
+ for (TableNameInfo oldTableInfo : oldTableInfos) {
Review Comment:
ok, fixed
##########
fe/fe-core/src/main/java/org/apache/doris/catalog/constraint/ConstraintManager.java:
##########
@@ -893,6 +1172,116 @@ private void validateTableAndColumns(TableNameInfo
tableNameInfo,
fk.getReferencedColumnNames(),
toKey(refTableInfo));
}
+ } else if (constraint instanceof DistributionMappingConstraint) {
+ validateDistributionMappingConstraint(
+ tableNameInfo, table, (DistributionMappingConstraint)
constraint);
+ }
+ return table;
+ }
+
+ private void validateResolvedConstraint(TableNameInfo tableNameInfo,
TableIf table,
+ TableIf referencedTable, Constraint constraint) {
+ if (constraint instanceof PrimaryKeyConstraint) {
+ validateColumnsExist(table,
+ ((PrimaryKeyConstraint) constraint).getPrimaryKeyNames(),
+ toKey(tableNameInfo));
+ } else if (constraint instanceof UniqueConstraint) {
+ validateColumnsExist(table,
+ ((UniqueConstraint) constraint).getUniqueColumnNames(),
+ toKey(tableNameInfo));
+ } else if (constraint instanceof ForeignKeyConstraint) {
+ if (referencedTable == null) {
+ throw new AnalysisException("Referenced table changed while
adding constraint on "
+ + tableNameInfo);
+ }
+ ForeignKeyConstraint foreignKey = (ForeignKeyConstraint)
constraint;
+ validateColumnsExist(table, foreignKey.getForeignKeyNames(),
toKey(tableNameInfo));
+ validateColumnsExist(referencedTable,
foreignKey.getReferencedColumnNames(),
+ toKey(foreignKey.getReferencedTableName()));
+ } else if (constraint instanceof DistributionMappingConstraint) {
+ validateDistributionMappingConstraint(
+ tableNameInfo, table, (DistributionMappingConstraint)
constraint);
+ }
+ }
+
+ private TableIf resolveTableIfPresent(TableNameInfo tableNameInfo) {
+ try {
+ return resolveTableForValidation(tableNameInfo);
+ } catch (AnalysisException e) {
+ LOG.debug("Table {} is unavailable while synchronizing table-local
constraints",
+ tableNameInfo, e);
+ return null;
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ private void putTableLocalConstraint(TableIf table, String constraintName,
Constraint constraint) {
+ if (table instanceof Table) {
+ ((Table)
table).getTableAttributes().getConstraintsMap().put(constraintName, constraint);
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ private void removeTableLocalConstraint(TableIf table, String
constraintName) {
+ if (table instanceof Table) {
+ ((Table)
table).getTableAttributes().getConstraintsMap().remove(constraintName);
+ }
+ }
+
+ private void validateDistributionMappingConstraint(TableNameInfo
tableNameInfo, TableIf table,
+ DistributionMappingConstraint constraint) {
+ if (!(table instanceof OlapTable)) {
+ throw new AnalysisException("Distribution mapping constraint only
supports OLAP tables");
+ }
+ validateColumnsExist(table, constraint.getDeterminantColumnNames(),
toKey(tableNameInfo));
+ validateColumnsExist(table, constraint.getDistributionColumnNames(),
toKey(tableNameInfo));
+ TreeSet<String> determinantColumns = new
TreeSet<>(String.CASE_INSENSITIVE_ORDER);
+ determinantColumns.addAll(constraint.getDeterminantColumnNames());
+ if (determinantColumns.size() !=
constraint.getDeterminantColumnNames().size()) {
+ throw new AnalysisException("Determinant columns in distribution
mapping constraint must be unique");
+ }
+ TreeSet<String> distributionColumns = new
TreeSet<>(String.CASE_INSENSITIVE_ORDER);
+ distributionColumns.addAll(constraint.getDistributionColumnNames());
+ if (distributionColumns.size() !=
constraint.getDistributionColumnNames().size()) {
+ throw new AnalysisException("Distribution columns in distribution
mapping constraint must be unique");
+ }
+
+ OlapTable olapTable = (OlapTable) table;
+ if (!(olapTable.getDefaultDistributionInfo() instanceof
HashDistributionInfo)) {
+ throw new AnalysisException("Distribution mapping constraint
requires hash distribution");
+ }
+ List<String> tableDistributionColumns = ((HashDistributionInfo)
olapTable.getDefaultDistributionInfo())
+ .getDistributionColumns().stream()
+ .map(column -> column.getName().toLowerCase(Locale.ROOT))
+ .collect(Collectors.toList());
+ List<String> constraintDistributionColumns =
constraint.getDistributionColumnNames().stream()
+ .map(column -> column.toLowerCase(Locale.ROOT))
+ .collect(Collectors.toList());
+ int previousIndex = -1;
+ for (String column : constraintDistributionColumns) {
+ int index = tableDistributionColumns.indexOf(column);
+ if (index <= previousIndex) {
+ throw new AnalysisException("Distribution columns in
distribution mapping constraint"
+ + " must be an ordered subset of table distribution
columns");
+ }
+ previousIndex = index;
+ }
+ }
+
+ private void validateFrontendVersionsForDistributionMappingConstraint() {
+ String currentVersion = Version.DORIS_BUILD_VERSION + "-" +
Version.DORIS_BUILD_SHORT_HASH;
+ List<String> incompatibleFrontends = new ArrayList<>();
+ for (Frontend frontend : Env.getCurrentEnv().getFrontends(null)) {
Review Comment:
fixed
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]