This is an automated email from the ASF dual-hosted git repository.

diqiu50 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new c3843d68ee [#13999] fix(starrocks): Apply nullability and default 
value when adding columns (#14004)
c3843d68ee is described below

commit c3843d68eedca922e35f02df3e6a9b3b4c37d22b
Author: Yuhui <[email protected]>
AuthorDate: Wed Oct 21 09:23:24 2026 +0800

    [#13999] fix(starrocks): Apply nullability and default value when adding 
columns (#14004)
    
    ### What changes were proposed in this pull request?
    
    Build the StarRocks `ADD COLUMN` clause with `appendColumnDefinition`,
    the same logic used by
    create table, so nullability and default value are applied. Reject
    auto-increment columns
    explicitly since StarRocks does not support adding them.
    
    ### Why are the changes needed?
    
    StarRocks add column silently dropped nullability, default value and
    auto-increment.
    
    Fix: #13999
    
    ### Does this PR introduce _any_ user-facing change?
    
    Yes. Added StarRocks columns now honor nullability and default value.
    Adding an auto-increment
    column now fails with a clear error.
    
    ### How was this patch tested?
    
    - Added unit tests in `TestStarRocksTableOperationsSqlGeneration`.
    - Extended `CatalogStarRocksIT#testColumnDefaultValue`.
---
 .../operations/StarRocksTableOperations.java       | 35 ++++++-----
 .../integration/test/CatalogStarRocksIT.java       | 28 +++++++++
 .../TestStarRocksTableOperationsSqlGeneration.java | 67 ++++++++++++++++++++++
 3 files changed, 112 insertions(+), 18 deletions(-)

diff --git 
a/catalogs/catalog-jdbc-starrocks/src/main/java/org/apache/gravitino/catalog/starrocks/operations/StarRocksTableOperations.java
 
b/catalogs/catalog-jdbc-starrocks/src/main/java/org/apache/gravitino/catalog/starrocks/operations/StarRocksTableOperations.java
index 439deee4dd..c1a9e06bf2 100644
--- 
a/catalogs/catalog-jdbc-starrocks/src/main/java/org/apache/gravitino/catalog/starrocks/operations/StarRocksTableOperations.java
+++ 
b/catalogs/catalog-jdbc-starrocks/src/main/java/org/apache/gravitino/catalog/starrocks/operations/StarRocksTableOperations.java
@@ -474,29 +474,28 @@ public class StarRocksTableOperations extends 
JdbcTableOperations {
   }
 
   private String addColumnFieldDefinition(TableChange.AddColumn addColumn) {
-    String dataType = typeConverter.fromGravitino(addColumn.getDataType());
     if (addColumn.fieldName().length > 1) {
       throw new UnsupportedOperationException("StarRocks does not support 
nested column names.");
     }
     String col = addColumn.fieldName()[0];
+    // StarRocks only allows AUTO_INCREMENT columns to be defined at table 
creation time
+    Preconditions.checkArgument(
+        !addColumn.isAutoIncrement(),
+        "StarRocks does not support adding an auto-increment column: %s",
+        col);
 
-    StringBuilder columnDefinition = new StringBuilder();
-    columnDefinition
-        .append("ADD COLUMN ")
-        .append(BACK_QUOTE)
-        .append(col)
-        .append(BACK_QUOTE)
-        .append(SPACE)
-        .append(dataType)
-        .append(SPACE);
-
-    // Append comment if available
-    if (StringUtils.isNotEmpty(addColumn.getComment())) {
-      columnDefinition
-          .append("COMMENT '")
-          .append(escapeSqlLiteral(addColumn.getComment(), '\''))
-          .append("' ");
-    }
+    JdbcColumn column =
+        JdbcColumn.builder()
+            .withName(col)
+            .withType(addColumn.getDataType())
+            .withComment(addColumn.getComment())
+            .withNullable(addColumn.isNullable())
+            .withDefaultValue(addColumn.getDefaultValue())
+            .withAutoIncrement(false)
+            .build();
+    StringBuilder columnDefinition =
+        new StringBuilder("ADD COLUMN 
").append(BACK_QUOTE).append(col).append(BACK_QUOTE);
+    appendColumnDefinition(column, columnDefinition);
 
     // Append position if available
     if (addColumn.getPosition() instanceof TableChange.First) {
diff --git 
a/catalogs/catalog-jdbc-starrocks/src/test/java/org/apache/gravitino/catalog/starrocks/integration/test/CatalogStarRocksIT.java
 
b/catalogs/catalog-jdbc-starrocks/src/test/java/org/apache/gravitino/catalog/starrocks/integration/test/CatalogStarRocksIT.java
index 28369a00c8..81c0c8dffb 100644
--- 
a/catalogs/catalog-jdbc-starrocks/src/test/java/org/apache/gravitino/catalog/starrocks/integration/test/CatalogStarRocksIT.java
+++ 
b/catalogs/catalog-jdbc-starrocks/src/test/java/org/apache/gravitino/catalog/starrocks/integration/test/CatalogStarRocksIT.java
@@ -1004,5 +1004,33 @@ public class CatalogStarRocksIT extends BaseIT {
         Literals.timestampLiteral(LocalDateTime.of(2024, 1, 1, 1, 1, 1)),
         colDefaultValues[1].defaultValue());
     Assertions.assertEquals(DEFAULT_VALUE_OF_CURRENT_TIMESTAMP, 
colDefaultValues[2].defaultValue());
+
+    // add a column with nullability and default value
+    tableCatalog.alterTable(
+        tableIdentifier,
+        TableChange.addColumn(
+            new String[] {"col_add_default_value"},
+            Types.TimestampType.withoutTimeZone(),
+            "col_add_default_value",
+            TableChange.ColumnPosition.defaultPos(),
+            false,
+            false,
+            Literals.timestampLiteral("2024-01-01T01:01:01")));
+
+    Awaitility.await()
+        .atMost(MAX_WAIT_IN_SECONDS, TimeUnit.SECONDS)
+        .pollInterval(WAIT_INTERVAL_IN_SECONDS, TimeUnit.SECONDS)
+        .untilAsserted(
+            () -> {
+              Column addedColumn =
+                  
Arrays.stream(tableCatalog.loadTable(tableIdentifier).columns())
+                      .filter(c -> c.name().equals("col_add_default_value"))
+                      .findFirst()
+                      .orElseThrow(() -> new AssertionError("Column is not 
added"));
+              Assertions.assertFalse(addedColumn.nullable());
+              Assertions.assertEquals(
+                  Literals.timestampLiteral(LocalDateTime.of(2024, 1, 1, 1, 1, 
1)),
+                  addedColumn.defaultValue());
+            });
   }
 }
diff --git 
a/catalogs/catalog-jdbc-starrocks/src/test/java/org/apache/gravitino/catalog/starrocks/operation/TestStarRocksTableOperationsSqlGeneration.java
 
b/catalogs/catalog-jdbc-starrocks/src/test/java/org/apache/gravitino/catalog/starrocks/operation/TestStarRocksTableOperationsSqlGeneration.java
index fa2d6c40f8..cebe5e2fa3 100644
--- 
a/catalogs/catalog-jdbc-starrocks/src/test/java/org/apache/gravitino/catalog/starrocks/operation/TestStarRocksTableOperationsSqlGeneration.java
+++ 
b/catalogs/catalog-jdbc-starrocks/src/test/java/org/apache/gravitino/catalog/starrocks/operation/TestStarRocksTableOperationsSqlGeneration.java
@@ -29,6 +29,7 @@ import 
org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
 import org.apache.gravitino.catalog.jdbc.utils.ConnectionCountingDataSource;
 import org.apache.gravitino.catalog.starrocks.converter.StarRocksTypeConverter;
 import 
org.apache.gravitino.catalog.starrocks.operations.StarRocksTableOperations;
+import org.apache.gravitino.rel.Column;
 import org.apache.gravitino.rel.TableChange;
 import org.apache.gravitino.rel.expressions.NamedReference;
 import org.apache.gravitino.rel.expressions.distributions.Distribution;
@@ -293,4 +294,70 @@ public class TestStarRocksTableOperationsSqlGeneration {
     Assertions.assertTrue(alterSql.contains("ADD COLUMN `col2`"), alterSql);
     Assertions.assertTrue(alterSql.contains("COMMENT 'owner\\\\''s 
\"comment\"; --'"), alterSql);
   }
+
+  @Test
+  public void testAddColumnWithNotNullAndDefaultValue() {
+    TestableStarRocksTableOperations ops = new 
TestableStarRocksTableOperations();
+
+    String alterSql =
+        ops.alterTableSql(
+            "test_table",
+            TableChange.addColumn(
+                new String[] {"created_at"},
+                Types.TimestampType.withoutTimeZone(),
+                "create time",
+                TableChange.ColumnPosition.after("id"),
+                false,
+                false,
+                Column.DEFAULT_VALUE_OF_CURRENT_TIMESTAMP));
+
+    Assertions.assertTrue(
+        alterSql.contains(
+            "ADD COLUMN `created_at` datetime NOT NULL DEFAULT 
CURRENT_TIMESTAMP "
+                + "COMMENT 'create time' AFTER `id`"),
+        alterSql);
+  }
+
+  @Test
+  public void testAddNullableColumnWithStringDefaultValue() {
+    TestableStarRocksTableOperations ops = new 
TestableStarRocksTableOperations();
+
+    String alterSql =
+        ops.alterTableSql(
+            "test_table",
+            TableChange.addColumn(
+                new String[] {"col2"},
+                Types.VarCharType.of(10),
+                null,
+                TableChange.ColumnPosition.after("col1"),
+                true,
+                false,
+                Literals.of("abc", Types.VarCharType.of(10))));
+
+    Assertions.assertTrue(
+        alterSql.contains("ADD COLUMN `col2` varchar(10) NULL DEFAULT 'abc' 
AFTER `col1`"),
+        alterSql);
+  }
+
+  @Test
+  public void testAddAutoIncrementColumnIsRejected() {
+    TestableStarRocksTableOperations ops = new 
TestableStarRocksTableOperations();
+
+    IllegalArgumentException exception =
+        Assertions.assertThrows(
+            IllegalArgumentException.class,
+            () ->
+                ops.alterTableSql(
+                    "test_table",
+                    TableChange.addColumn(
+                        new String[] {"col2"},
+                        Types.LongType.get(),
+                        null,
+                        TableChange.ColumnPosition.defaultPos(),
+                        false,
+                        true)));
+
+    Assertions.assertEquals(
+        "StarRocks does not support adding an auto-increment column: col2", 
exception.getMessage());
+  }
 }

Reply via email to