diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/TableRepository.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/TableRepository.java
index 75753f84e6c..3495e840800 100644
--- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/TableRepository.java
+++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/TableRepository.java
@@ -19,6 +19,7 @@ import static org.openmetadata.catalog.Entity.LOCATION;
import static org.openmetadata.catalog.Entity.TABLE;
import static org.openmetadata.catalog.Entity.helper;
import static org.openmetadata.catalog.jdbi3.Relationship.JOINED_WITH;
+import static org.openmetadata.catalog.util.EntityUtil.getColumnField;
import static org.openmetadata.common.utils.CommonUtil.parseDate;
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -835,6 +836,7 @@ public class TableRepository extends EntityRepository
{
}
updateColumnDescription(stored, updated);
+ updateColumnDataLength(stored, updated);
updateTags(
stored.getFullyQualifiedName(),
fieldName + "." + updated.getName() + ".tags",
@@ -848,7 +850,7 @@ public class TableRepository extends EntityRepository {
}
}
- majorVersionChange = !deletedColumns.isEmpty();
+ majorVersionChange = majorVersionChange || !deletedColumns.isEmpty();
}
private void updateColumnDescription(Column origColumn, Column updatedColumn) throws JsonProcessingException {
@@ -865,10 +867,14 @@ public class TableRepository extends EntityRepository {
recordChange(getColumnField(origColumn, "constraint"), origColumn.getConstraint(), updatedColumn.getConstraint());
}
- private String getColumnField(Column column, String columnField) {
- // Remove table FQN from column FQN to get the local name
- String localColumnName = EntityUtil.getLocalColumnName(column.getFullyQualifiedName());
- return "columns." + localColumnName + (columnField == null ? "" : "." + columnField);
+ private void updateColumnDataLength(Column origColumn, Column updatedColumn) throws JsonProcessingException {
+ if (recordChange(
+ getColumnField(origColumn, "dataLength"), origColumn.getDataLength(), updatedColumn.getDataLength())) {
+ if (updatedColumn.getDataLength() < origColumn.getDataLength()) {
+ // The data length of a column changed. Treat it as backward-incompatible change
+ majorVersionChange = true;
+ }
+ }
}
}
}
diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/util/EntityUtil.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/util/EntityUtil.java
index 470c84f99c8..991b767fa29 100644
--- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/util/EntityUtil.java
+++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/util/EntityUtil.java
@@ -438,6 +438,13 @@ public final class EntityUtil {
return localColumnName.toString();
}
+ /** Return column field name of format columnName.fieldName */
+ public static String getColumnField(Column column, String columnField) {
+ // Remove table FQN from column FQN to get the local name
+ String localColumnName = EntityUtil.getLocalColumnName(column.getFullyQualifiedName());
+ return "columns." + localColumnName + (columnField == null ? "" : "." + columnField);
+ }
+
public static Boolean toBoolean(Include include) {
if (include.equals(DELETED)) {
return Boolean.TRUE;
diff --git a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/databases/TableResourceTest.java b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/databases/TableResourceTest.java
index 3d5db25f608..39120e2981a 100644
--- a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/databases/TableResourceTest.java
+++ b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/databases/TableResourceTest.java
@@ -432,7 +432,7 @@ public class TableResourceTest extends EntityResourceTest {
assertEquals(bankTagUsageCount + 1, getTagUsageCount(USER_BANK_ACCOUNT_TAG_LABEL.getTagFQN(), userAuthHeaders()));
//
- // Add a new column using PUT
+ // Add a new column c2 using PUT
//
change = getChangeDescription(table.getVersion());
Column c2 = getColumn("c2", BINARY, null).withOrdinalPosition(2).withDataLength(10).withTags(tags);
@@ -445,6 +445,25 @@ public class TableResourceTest extends EntityResourceTest {
assertEquals(addressTagUsageCount + 2, getTagUsageCount(USER_ADDRESS_TAG_LABEL.getTagFQN(), userAuthHeaders()));
assertEquals(bankTagUsageCount + 2, getTagUsageCount(USER_BANK_ACCOUNT_TAG_LABEL.getTagFQN(), userAuthHeaders()));
+ //
+ // Change the column c2 data length from 10 to 20. Increasing the data length is considered backward compatible
+ // and only minor version changes
+ //
+ c2.setDataLength(20);
+ change = getChangeDescription(table.getVersion());
+ String fieldName = "columns.c2.dataLength";
+ change.getFieldsUpdated().add(new FieldChange().withName(fieldName).withOldValue(10).withNewValue(20));
+ table = updateAndCheckEntity(request.withColumns(updatedColumns), OK, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change);
+
+ //
+ // Change the column c2 data length from 20 to 10. Decreasing the data length is considered backward compatible
+ // and results in major version changes
+ //
+ c2.setDataLength(10);
+ change = getChangeDescription(table.getVersion());
+ change.getFieldsUpdated().add(new FieldChange().withName(fieldName).withOldValue(20).withNewValue(10));
+ table = updateAndCheckEntity(request.withColumns(updatedColumns), OK, ADMIN_AUTH_HEADERS, MAJOR_UPDATE, change);
+
//
// Remove a column c2 and make sure it is deleted by PUT
//