This is an automated email from the ASF dual-hosted git repository.
jerryshao pushed a commit to branch branch-1.3
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/branch-1.3 by this push:
new 466e56390b [Cherry-pick to branch-1.3] [#14073] fix(catalog-jdbc):
Quote reference column when updating column position (#14075) (#14136)
466e56390b is described below
commit 466e56390b4c9225b9199157f6ce922ccadb42e3
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Sun Oct 25 09:36:11 2026 +0800
[Cherry-pick to branch-1.3] [#14073] fix(catalog-jdbc): Quote reference
column when updating column position (#14075) (#14136)
**Cherry-pick Information:**
- Original commit: 2c7c308d9c56866e8df2f0ebf4566a7c917cd29b
- Target branch: `branch-1.3`
- Status: ✅ Conflicts resolved manually
---------
Co-authored-by: Yuhui <[email protected]>
---
.../doris/operation/DorisTableOperations.java | 8 ++++-
.../doris/operation/TestDorisTableOperations.java | 38 ++++++++++++++++++++
.../mysql/operation/MysqlTableOperations.java | 4 +--
.../mysql/operation/TestMysqlTableOperations.java | 41 ++++++++++++++++++++++
.../operations/StarRocksTableOperations.java | 8 ++++-
.../operation/TestStarRocksTableOperations.java | 38 ++++++++++++++++++++
6 files changed, 133 insertions(+), 4 deletions(-)
diff --git
a/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisTableOperations.java
b/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisTableOperations.java
index 8ab084285d..b3627a50b1 100644
---
a/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisTableOperations.java
+++
b/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisTableOperations.java
@@ -1139,7 +1139,13 @@ public class DorisTableOperations extends
JdbcTableOperations {
Arrays.stream(jdbcTable.columns())
.reduce((column1, column2) -> column2)
.map(Column::name)
- .ifPresent(s -> columnDefinition.append("AFTER ").append(s));
+ .ifPresent(
+ s ->
+ columnDefinition
+ .append("AFTER ")
+ .append(BACK_QUOTE)
+ .append(s)
+ .append(BACK_QUOTE));
}
return columnDefinition.toString();
}
diff --git
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperations.java
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperations.java
index 06716466e9..0ccf7d0290 100644
---
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperations.java
+++
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperations.java
@@ -42,6 +42,7 @@ import org.apache.gravitino.catalog.jdbc.JdbcTable;
import org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter;
import
org.apache.gravitino.catalog.jdbc.operation.JdbcTablePartitionOperations;
import org.apache.gravitino.integration.test.util.GravitinoITUtils;
+import org.apache.gravitino.rel.Column;
import org.apache.gravitino.rel.TableChange;
import org.apache.gravitino.rel.expressions.Expression;
import org.apache.gravitino.rel.expressions.NamedReference;
@@ -200,6 +201,43 @@ public class TestDorisTableOperations extends TestDoris {
TABLE_OPERATIONS.drop(databaseName, newName), "table should be
non-existent");
}
+ @Test
+ public void testUpdateColumnPositionAfterReservedWordColumn() {
+ String tableName =
GravitinoITUtils.genRandomName("doris_position_test_table");
+ // The wide col_2 keeps status and key out of the default key columns.
+ JdbcColumn[] columns =
+ new JdbcColumn[] {
+ JdbcColumn.builder().withName("col_1").withType(INT).build(),
+ JdbcColumn.builder().withName("col_2").withType(VARCHAR_255).build(),
+
JdbcColumn.builder().withName("status").withType(VARCHAR_255).build(),
+ JdbcColumn.builder().withName("key").withType(VARCHAR_255).build()
+ };
+ TABLE_OPERATIONS.create(
+ databaseName,
+ tableName,
+ columns,
+ "test_comment",
+ createProperties(),
+ null,
+ Distributions.hash(DEFAULT_BUCKET_SIZE, NamedReference.field("col_1")),
+ new Index[0]);
+
+ // A null position moves the column after the last column `key`, a
reserved word.
+ TABLE_OPERATIONS.alterTable(
+ databaseName, tableName, TableChange.updateColumnPosition(new String[]
{"status"}, null));
+
+ Awaitility.await()
+ .atMost(MAX_WAIT_IN_SECONDS, TimeUnit.SECONDS)
+ .pollInterval(WAIT_INTERVAL_IN_SECONDS, TimeUnit.SECONDS)
+ .untilAsserted(
+ () ->
+ Assertions.assertArrayEquals(
+ new String[] {"col_1", "col_2", "key", "status"},
+ Arrays.stream(TABLE_OPERATIONS.load(databaseName,
tableName).columns())
+ .map(Column::name)
+ .toArray(String[]::new)));
+ }
+
@Test
public void testAlterTable() {
String tableName =
GravitinoITUtils.genRandomName("doris_alter_test_table");
diff --git
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/operation/MysqlTableOperations.java
b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/operation/MysqlTableOperations.java
index 91f6102dbe..5e755cb222 100644
---
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/operation/MysqlTableOperations.java
+++
b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/operation/MysqlTableOperations.java
@@ -653,12 +653,12 @@ public class MysqlTableOperations extends
JdbcTableOperations {
columnDefinition.append("FIRST");
} else if (updateColumnPosition.getPosition() instanceof
TableChange.After) {
TableChange.After afterPosition = (TableChange.After)
updateColumnPosition.getPosition();
- columnDefinition.append(AFTER).append(afterPosition.getColumn());
+ columnDefinition.append(AFTER).append(quote(afterPosition.getColumn()));
} else {
Arrays.stream(jdbcTable.columns())
.reduce((column1, column2) -> column2)
.map(Column::name)
- .ifPresent(s -> columnDefinition.append(AFTER).append(s));
+ .ifPresent(s -> columnDefinition.append(AFTER).append(quote(s)));
}
return columnDefinition.toString();
}
diff --git
a/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysqlTableOperations.java
b/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysqlTableOperations.java
index 712bd55cde..dd32224d32 100644
---
a/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysqlTableOperations.java
+++
b/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysqlTableOperations.java
@@ -230,6 +230,47 @@ public class TestMysqlTableOperations extends TestMysql {
Assertions.assertEquals(Literals.of("new", Types.VarCharType.of(32)),
updated.defaultValue());
}
+ @Test
+ public void testUpdateColumnPositionWithSpecialReferenceColumn() {
+ String tableName = RandomStringUtils.randomAlphabetic(16) +
"_position_table";
+ JdbcColumn[] columns =
+ new JdbcColumn[] {
+
JdbcColumn.builder().withName("id").withType(INT).withNullable(false).build(),
+ JdbcColumn.builder().withName("status").withType(VARCHAR).build(),
+ JdbcColumn.builder().withName("order-id").withType(VARCHAR).build(),
+ JdbcColumn.builder().withName("key").withType(VARCHAR).build()
+ };
+ TABLE_OPERATIONS.create(
+ TEST_DB_NAME.toString(),
+ tableName,
+ columns,
+ "test_comment",
+ new HashMap<>(),
+ null,
+ Distributions.NONE,
+ new Index[0]);
+
+ TABLE_OPERATIONS.alterTable(
+ TEST_DB_NAME.toString(),
+ tableName,
+ TableChange.updateColumnPosition(
+ new String[] {"status"},
TableChange.ColumnPosition.after("order-id")));
+ JdbcTable load = TABLE_OPERATIONS.load(TEST_DB_NAME.toString(), tableName);
+ Assertions.assertArrayEquals(
+ new String[] {"id", "order-id", "status", "key"},
+
Arrays.stream(load.columns()).map(Column::name).toArray(String[]::new));
+
+ // A null position moves the column after the last column `key`, a
reserved word.
+ TABLE_OPERATIONS.alterTable(
+ TEST_DB_NAME.toString(),
+ tableName,
+ TableChange.updateColumnPosition(new String[] {"id"}, null));
+ load = TABLE_OPERATIONS.load(TEST_DB_NAME.toString(), tableName);
+ Assertions.assertArrayEquals(
+ new String[] {"order-id", "status", "key", "id"},
+
Arrays.stream(load.columns()).map(Column::name).toArray(String[]::new));
+ }
+
@Test
public void testAlterTable() {
String tableName = RandomStringUtils.randomAlphabetic(16) + "_al_table";
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 f1c628a4b1..71551d036f 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
@@ -600,7 +600,13 @@ public class StarRocksTableOperations extends
JdbcTableOperations {
Arrays.stream(jdbcTable.columns())
.reduce((column1, column2) -> column2)
.map(Column::name)
- .ifPresent(s -> columnDefinition.append("AFTER ").append(s));
+ .ifPresent(
+ s ->
+ columnDefinition
+ .append("AFTER ")
+ .append(BACK_QUOTE)
+ .append(s)
+ .append(BACK_QUOTE));
}
return columnDefinition.toString();
}
diff --git
a/catalogs/catalog-jdbc-starrocks/src/test/java/org/apache/gravitino/catalog/starrocks/operation/TestStarRocksTableOperations.java
b/catalogs/catalog-jdbc-starrocks/src/test/java/org/apache/gravitino/catalog/starrocks/operation/TestStarRocksTableOperations.java
index 60f5338f54..fb4a4c0ae4 100644
---
a/catalogs/catalog-jdbc-starrocks/src/test/java/org/apache/gravitino/catalog/starrocks/operation/TestStarRocksTableOperations.java
+++
b/catalogs/catalog-jdbc-starrocks/src/test/java/org/apache/gravitino/catalog/starrocks/operation/TestStarRocksTableOperations.java
@@ -324,6 +324,44 @@ public class TestStarRocksTableOperations extends
TestStarRocks {
});
}
+ @Test
+ public void testUpdateColumnPositionAfterReservedWordColumn() {
+ String tableName =
GravitinoITUtils.genRandomName("starrocks_position_test_table");
+ // The wide col_2 keeps status and key out of the default key columns.
+ JdbcColumn[] columns =
+ new JdbcColumn[] {
+ JdbcColumn.builder().withName("col_1").withType(INT).build(),
+ JdbcColumn.builder().withName("col_2").withType(VARCHAR_255).build(),
+
JdbcColumn.builder().withName("status").withType(VARCHAR_255).build(),
+ JdbcColumn.builder().withName("key").withType(VARCHAR_255).build()
+ };
+ TABLE_OPERATIONS.create(
+ databaseName,
+ tableName,
+ columns,
+ "test_comment",
+ createProperties(),
+ null,
+ Distributions.hash(DEFAULT_BUCKET_SIZE, NamedReference.field("col_1")),
+ new Index[0]);
+
+ // A null position moves the column after the last column `key`, a
reserved word.
+ TABLE_OPERATIONS.alterTable(
+ databaseName, tableName, TableChange.updateColumnPosition(new String[]
{"status"}, null));
+
+ // StarRocks applies schema changes asynchronously.
+ Awaitility.await()
+ .atMost(MAX_WAIT_IN_SECONDS, TimeUnit.SECONDS)
+ .pollInterval(WAIT_INTERVAL_IN_SECONDS, TimeUnit.SECONDS)
+ .untilAsserted(
+ () ->
+ Assertions.assertArrayEquals(
+ new String[] {"col_1", "col_2", "key", "status"},
+ Arrays.stream(TABLE_OPERATIONS.load(databaseName,
tableName).columns())
+ .map(Column::name)
+ .toArray(String[]::new)));
+ }
+
@Test
public void testAlterTable() {
String tableName =
GravitinoITUtils.genRandomName("starrocks_alter_test_table");