in catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisTableOperations.java [491:582]
protected String generateAlterTableSql(
String databaseName, String tableName, TableChange... changes) {
/*
* NOTICE:
* As described in the Doris documentation, the creation of Schema Change is an asynchronous process.
* If you load the table immediately after altering it, you might get the old schema.
* You can see in: https://doris.apache.org/docs/1.2/advanced/alter-table/schema-change/#create-job
* TODO: return state of the operation to user
* */
// 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) {
// Doris only support set properties, remove property is not supported yet
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) {
throw new IllegalArgumentException("Rename column is not supported yet");
} 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) {
TableChange.UpdateColumnComment updateColumnComment =
(TableChange.UpdateColumnComment) change;
alterSql.add(updateColumnCommentFieldDefinition(updateColumnComment));
} 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 {
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("MODIFY COMMENT \"" + newComment + "\"");
}
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;
}