in catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/operation/MysqlTableOperations.java [215:316]
protected String generateAlterTableSql(
String databaseName, String tableName, TableChange... changes) {
// Not all operations require the original table information, so lazy loading is used here
JdbcTable lazyLoadTable = null;
TableChange.UpdateComment updateComment = null;
List<TableChange.SetProperty> setProperties = new ArrayList<>();
List<String> alterSql = new ArrayList<>();
for (int i = 0; i < changes.length; i++) {
TableChange change = changes[i];
if (change instanceof TableChange.UpdateComment) {
updateComment = (TableChange.UpdateComment) change;
} else if (change instanceof TableChange.SetProperty) {
// The set attribute needs to be added at the end.
setProperties.add(((TableChange.SetProperty) change));
} else if (change instanceof TableChange.RemoveProperty) {
// mysql does not support deleting table attributes, it can be replaced by Set Property
throw new IllegalArgumentException("Remove property is not supported yet");
} else if (change instanceof TableChange.AddColumn) {
TableChange.AddColumn addColumn = (TableChange.AddColumn) change;
lazyLoadTable = getOrCreateTable(databaseName, tableName, lazyLoadTable);
alterSql.add(addColumnFieldDefinition(addColumn));
} else if (change instanceof TableChange.RenameColumn) {
lazyLoadTable = getOrCreateTable(databaseName, tableName, lazyLoadTable);
TableChange.RenameColumn renameColumn = (TableChange.RenameColumn) change;
alterSql.add(renameColumnFieldDefinition(renameColumn, lazyLoadTable));
} else if (change instanceof TableChange.UpdateColumnDefaultValue) {
lazyLoadTable = getOrCreateTable(databaseName, tableName, lazyLoadTable);
TableChange.UpdateColumnDefaultValue updateColumnDefaultValue =
(TableChange.UpdateColumnDefaultValue) change;
alterSql.add(
updateColumnDefaultValueFieldDefinition(updateColumnDefaultValue, lazyLoadTable));
} else if (change instanceof TableChange.UpdateColumnType) {
lazyLoadTable = getOrCreateTable(databaseName, tableName, lazyLoadTable);
TableChange.UpdateColumnType updateColumnType = (TableChange.UpdateColumnType) change;
alterSql.add(updateColumnTypeFieldDefinition(updateColumnType, lazyLoadTable));
} else if (change instanceof TableChange.UpdateColumnComment) {
lazyLoadTable = getOrCreateTable(databaseName, tableName, lazyLoadTable);
TableChange.UpdateColumnComment updateColumnComment =
(TableChange.UpdateColumnComment) change;
alterSql.add(updateColumnCommentFieldDefinition(updateColumnComment, lazyLoadTable));
} else if (change instanceof TableChange.UpdateColumnPosition) {
lazyLoadTable = getOrCreateTable(databaseName, tableName, lazyLoadTable);
TableChange.UpdateColumnPosition updateColumnPosition =
(TableChange.UpdateColumnPosition) change;
alterSql.add(updateColumnPositionFieldDefinition(updateColumnPosition, lazyLoadTable));
} else if (change instanceof TableChange.DeleteColumn) {
TableChange.DeleteColumn deleteColumn = (TableChange.DeleteColumn) change;
lazyLoadTable = getOrCreateTable(databaseName, tableName, lazyLoadTable);
String deleteColSql = deleteColumnFieldDefinition(deleteColumn, lazyLoadTable);
if (StringUtils.isNotEmpty(deleteColSql)) {
alterSql.add(deleteColSql);
}
} else if (change instanceof TableChange.UpdateColumnNullability) {
lazyLoadTable = getOrCreateTable(databaseName, tableName, lazyLoadTable);
alterSql.add(
updateColumnNullabilityDefinition(
(TableChange.UpdateColumnNullability) change, lazyLoadTable));
} else if (change instanceof TableChange.AddIndex) {
alterSql.add(addIndexDefinition((TableChange.AddIndex) change));
} else if (change instanceof TableChange.DeleteIndex) {
lazyLoadTable = getOrCreateTable(databaseName, tableName, lazyLoadTable);
alterSql.add(deleteIndexDefinition(lazyLoadTable, (TableChange.DeleteIndex) change));
} else if (change instanceof TableChange.UpdateColumnAutoIncrement) {
lazyLoadTable = getOrCreateTable(databaseName, tableName, lazyLoadTable);
alterSql.add(
updateColumnAutoIncrementDefinition(
lazyLoadTable, (TableChange.UpdateColumnAutoIncrement) change));
} else {
throw new IllegalArgumentException(
"Unsupported table change type: " + change.getClass().getName());
}
}
if (!setProperties.isEmpty()) {
alterSql.add(generateTableProperties(setProperties));
}
// Last modified comment
if (null != updateComment) {
String newComment = updateComment.getNewComment();
if (null == StringIdentifier.fromComment(newComment)) {
// Detect and add Gravitino id.
JdbcTable jdbcTable = getOrCreateTable(databaseName, tableName, lazyLoadTable);
StringIdentifier identifier = StringIdentifier.fromComment(jdbcTable.comment());
if (null != identifier) {
newComment = StringIdentifier.addToComment(identifier, newComment);
}
}
alterSql.add("COMMENT '" + newComment + "'");
}
if (!setProperties.isEmpty()) {
alterSql.add(generateTableProperties(setProperties));
}
if (CollectionUtils.isEmpty(alterSql)) {
return "";
}
// Return the generated SQL statement
String result = "ALTER TABLE `" + tableName + "`\n" + String.join(",\n", alterSql) + ";";
LOG.info("Generated alter table:{} sql: {}", databaseName + "." + tableName, result);
return result;
}