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]

Reply via email to