in catalogs/catalog-jdbc-postgresql/src/main/java/org/apache/gravitino/catalog/postgresql/operation/PostgreSqlTableOperations.java [309:384]
protected String generateAlterTableSql(
String schemaName, String tableName, TableChange... changes) {
// Not all operations require the original table information, so lazy loading is used here
JdbcTable lazyLoadTable = null;
List<String> alterSql = new ArrayList<>();
for (TableChange change : changes) {
if (change instanceof TableChange.UpdateComment) {
lazyLoadTable = getOrCreateTable(schemaName, tableName, lazyLoadTable);
alterSql.add(updateCommentDefinition((TableChange.UpdateComment) change, lazyLoadTable));
} else if (change instanceof TableChange.SetProperty) {
throw new IllegalArgumentException("Set property is not supported yet");
} else if (change instanceof TableChange.RemoveProperty) {
// PostgreSQL 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(schemaName, tableName, lazyLoadTable);
alterSql.addAll(addColumnFieldDefinition(addColumn, lazyLoadTable));
} else if (change instanceof TableChange.RenameColumn) {
TableChange.RenameColumn renameColumn = (TableChange.RenameColumn) change;
alterSql.add(renameColumnFieldDefinition(renameColumn, tableName));
} else if (change instanceof TableChange.UpdateColumnDefaultValue) {
lazyLoadTable = getOrCreateTable(schemaName, tableName, lazyLoadTable);
TableChange.UpdateColumnDefaultValue updateColumnDefaultValue =
(TableChange.UpdateColumnDefaultValue) change;
alterSql.add(
updateColumnDefaultValueFieldDefinition(updateColumnDefaultValue, lazyLoadTable));
} else if (change instanceof TableChange.UpdateColumnType) {
lazyLoadTable = getOrCreateTable(schemaName, tableName, lazyLoadTable);
TableChange.UpdateColumnType updateColumnType = (TableChange.UpdateColumnType) change;
alterSql.add(updateColumnTypeFieldDefinition(updateColumnType, lazyLoadTable));
} else if (change instanceof TableChange.UpdateColumnComment) {
alterSql.add(
updateColumnCommentFieldDefinition(
(TableChange.UpdateColumnComment) change, tableName));
} else if (change instanceof TableChange.UpdateColumnPosition) {
throw new IllegalArgumentException("PostgreSQL does not support column position.");
} else if (change instanceof TableChange.DeleteColumn) {
lazyLoadTable = getOrCreateTable(schemaName, tableName, lazyLoadTable);
TableChange.DeleteColumn deleteColumn = (TableChange.DeleteColumn) change;
String deleteColSql = deleteColumnFieldDefinition(deleteColumn, lazyLoadTable);
if (StringUtils.isNotEmpty(deleteColSql)) {
alterSql.add(deleteColSql);
}
} else if (change instanceof TableChange.UpdateColumnNullability) {
TableChange.UpdateColumnNullability updateColumnNullability =
(TableChange.UpdateColumnNullability) change;
lazyLoadTable = getOrCreateTable(schemaName, tableName, lazyLoadTable);
validateUpdateColumnNullable(updateColumnNullability, lazyLoadTable);
alterSql.add(updateColumnNullabilityDefinition(updateColumnNullability, tableName));
} else if (change instanceof TableChange.AddIndex) {
alterSql.add(addIndexDefinition(tableName, (TableChange.AddIndex) change));
} else if (change instanceof TableChange.DeleteIndex) {
alterSql.add(deleteIndexDefinition(tableName, (TableChange.DeleteIndex) change));
} else if (change instanceof TableChange.UpdateColumnAutoIncrement) {
alterSql.add(
updateColumnAutoIncrementDefinition(
(TableChange.UpdateColumnAutoIncrement) change, tableName));
} else {
throw new IllegalArgumentException(
"Unsupported table change type: " + change.getClass().getName());
}
}
// If there is no change, return directly
if (alterSql.isEmpty()) {
return "";
}
// Return the generated SQL statement
String result = String.join("\n", alterSql);
LOG.info("Generated alter table:{}.{} sql: {}", schemaName, tableName, result);
return result;
}