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

fanng 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 a8de2458d [#4412]  feat(api): add validate check for default position 
when updating column position (#4451)
a8de2458d is described below

commit a8de2458d0ec5e1c89e3e5ce7729ee09001ba3fb
Author: Qiang-Liu <[email protected]>
AuthorDate: Tue Aug 13 22:08:56 2024 +0800

    [#4412]  feat(api): add validate check for default position when updating 
column position (#4451)
    
    ### What changes were proposed in this pull request?
    
    add validate check for ColumnPosition when updating column positions,
    If the position is default, will throw exception.
    
    ### Why are the changes needed?
    
    Fix: #4412
    
    ### Does this PR introduce _any_ user-facing change?
    No
    
    ### How was this patch tested?
    the UT has been added.
---
 .../java/org/apache/gravitino/rel/TableChange.java |  3 ++
 .../java/org/apache/gravitino/TestTableChange.java | 12 +++++++
 .../iceberg/ops/IcebergTableOpsHelper.java         | 31 +++---------------
 .../integration/test/CatalogIcebergBaseIT.java     | 37 ----------------------
 4 files changed, 19 insertions(+), 64 deletions(-)

diff --git a/api/src/main/java/org/apache/gravitino/rel/TableChange.java 
b/api/src/main/java/org/apache/gravitino/rel/TableChange.java
index a24f45ada..ea5849eb6 100644
--- a/api/src/main/java/org/apache/gravitino/rel/TableChange.java
+++ b/api/src/main/java/org/apache/gravitino/rel/TableChange.java
@@ -20,6 +20,7 @@
 
 package org.apache.gravitino.rel;
 
+import com.google.common.base.Preconditions;
 import java.util.Arrays;
 import java.util.Objects;
 import org.apache.gravitino.annotation.Evolving;
@@ -1353,6 +1354,8 @@ public interface TableChange {
     private final ColumnPosition position;
 
     private UpdateColumnPosition(String[] fieldName, ColumnPosition position) {
+      Preconditions.checkArgument(
+          position != ColumnPosition.defaultPos(), "Position cannot be 
DEFAULT");
       this.fieldName = fieldName;
       this.position = position;
     }
diff --git a/api/src/test/java/org/apache/gravitino/TestTableChange.java 
b/api/src/test/java/org/apache/gravitino/TestTableChange.java
index 2238fc01a..8f32c238f 100644
--- a/api/src/test/java/org/apache/gravitino/TestTableChange.java
+++ b/api/src/test/java/org/apache/gravitino/TestTableChange.java
@@ -43,6 +43,7 @@ import org.apache.gravitino.rel.expressions.Expression;
 import org.apache.gravitino.rel.expressions.literals.Literals;
 import org.apache.gravitino.rel.types.Type;
 import org.apache.gravitino.rel.types.Types;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 public class TestTableChange {
@@ -168,6 +169,17 @@ public class TestTableChange {
     assertEquals(newPosition, updateColumnPosition.getPosition());
   }
 
+  @Test
+  public void testDoesNotAllowDefaultInColumnPosition() {
+    String[] fieldName = {"Name", "Last Name"};
+    ColumnPosition newPosition = TableChange.ColumnPosition.defaultPos();
+    Exception exception =
+        Assertions.assertThrowsExactly(
+            IllegalArgumentException.class,
+            () -> TableChange.updateColumnPosition(fieldName, newPosition));
+    assertEquals("Position cannot be DEFAULT", exception.getMessage());
+  }
+
   @Test
   public void testUpdateColumnComment() {
     String[] fieldName = {"First Name"};
diff --git 
a/catalogs/catalog-lakehouse-iceberg/src/main/java/org/apache/gravitino/catalog/lakehouse/iceberg/ops/IcebergTableOpsHelper.java
 
b/catalogs/catalog-lakehouse-iceberg/src/main/java/org/apache/gravitino/catalog/lakehouse/iceberg/ops/IcebergTableOpsHelper.java
index 86da0eaea..679deb439 100644
--- 
a/catalogs/catalog-lakehouse-iceberg/src/main/java/org/apache/gravitino/catalog/lakehouse/iceberg/ops/IcebergTableOpsHelper.java
+++ 
b/catalogs/catalog-lakehouse-iceberg/src/main/java/org/apache/gravitino/catalog/lakehouse/iceberg/ops/IcebergTableOpsHelper.java
@@ -54,7 +54,6 @@ import org.apache.iceberg.catalog.Namespace;
 import org.apache.iceberg.catalog.TableIdentifier;
 import org.apache.iceberg.types.Type.PrimitiveType;
 import org.apache.iceberg.types.Types.NestedField;
-import org.apache.iceberg.types.Types.StructType;
 
 public class IcebergTableOpsHelper {
   @VisibleForTesting public static final Joiner DOT = Joiner.on(".");
@@ -133,13 +132,9 @@ public class IcebergTableOpsHelper {
   }
 
   private void doUpdateColumnPosition(
-      UpdateSchema icebergUpdateSchema,
-      UpdateColumnPosition updateColumnPosition,
-      Schema icebergTableSchema) {
-    StructType tableSchema = icebergTableSchema.asStruct();
-    ColumnPosition columnPosition =
-        getColumnPositionForIceberg(tableSchema, 
updateColumnPosition.getPosition());
-    doMoveColumn(icebergUpdateSchema, updateColumnPosition.fieldName(), 
columnPosition);
+      UpdateSchema icebergUpdateSchema, UpdateColumnPosition 
updateColumnPosition) {
+    doMoveColumn(
+        icebergUpdateSchema, updateColumnPosition.fieldName(), 
updateColumnPosition.getPosition());
   }
 
   private void doUpdateColumnType(
@@ -160,23 +155,6 @@ public class IcebergTableOpsHelper {
     icebergUpdateSchema.updateColumn(fieldName, (PrimitiveType) type);
   }
 
-  // Iceberg doesn't support LAST position, transform to FIRST or AFTER.
-  private ColumnPosition getColumnPositionForIceberg(
-      StructType parent, ColumnPosition columnPosition) {
-    if (!(columnPosition instanceof TableChange.Default)) {
-      return columnPosition;
-    }
-
-    List<NestedField> fields = parent.fields();
-    // no column, add to first
-    if (fields.isEmpty()) {
-      return ColumnPosition.first();
-    }
-
-    NestedField last = fields.get(fields.size() - 1);
-    return ColumnPosition.after(last.name());
-  }
-
   private void doAddColumn(UpdateSchema icebergUpdateSchema, AddColumn 
addColumn) {
     if (addColumn.isAutoIncrement()) {
       throw new IllegalArgumentException("Iceberg doesn't support auto 
increment column");
@@ -230,8 +208,7 @@ public class IcebergTableOpsHelper {
       } else if (change instanceof DeleteColumn) {
         doDeleteColumn(icebergUpdateSchema, (DeleteColumn) change, 
icebergTableSchema);
       } else if (change instanceof UpdateColumnPosition) {
-        doUpdateColumnPosition(
-            icebergUpdateSchema, (UpdateColumnPosition) change, 
icebergTableSchema);
+        doUpdateColumnPosition(icebergUpdateSchema, (UpdateColumnPosition) 
change);
       } else if (change instanceof RenameColumn) {
         doRenameColumn(icebergUpdateSchema, (RenameColumn) change);
       } else if (change instanceof UpdateColumnType) {
diff --git 
a/catalogs/catalog-lakehouse-iceberg/src/test/java/org/apache/gravitino/catalog/lakehouse/iceberg/integration/test/CatalogIcebergBaseIT.java
 
b/catalogs/catalog-lakehouse-iceberg/src/test/java/org/apache/gravitino/catalog/lakehouse/iceberg/integration/test/CatalogIcebergBaseIT.java
index fa7577984..415c86d3c 100644
--- 
a/catalogs/catalog-lakehouse-iceberg/src/test/java/org/apache/gravitino/catalog/lakehouse/iceberg/integration/test/CatalogIcebergBaseIT.java
+++ 
b/catalogs/catalog-lakehouse-iceberg/src/test/java/org/apache/gravitino/catalog/lakehouse/iceberg/integration/test/CatalogIcebergBaseIT.java
@@ -589,43 +589,6 @@ public abstract class CatalogIcebergBaseIT extends 
AbstractIT {
     Assertions.assertEquals(0, tableIdentifiers.size());
   }
 
-  @Test
-  public void testUpdateIcebergColumnDefaultPosition() {
-    Column col1 = Column.of("name", Types.StringType.get(), "comment");
-    Column col2 = Column.of("address", Types.StringType.get(), "comment");
-    Column col3 = Column.of("date_of_birth", Types.StringType.get(), 
"comment");
-    Column[] newColumns = new Column[] {col1, col2, col3};
-    NameIdentifier tableIdentifier =
-        NameIdentifier.of(schemaName, 
GravitinoITUtils.genRandomName("CatalogIcebergIT_table"));
-    catalog
-        .asTableCatalog()
-        .createTable(
-            tableIdentifier,
-            newColumns,
-            table_comment,
-            ImmutableMap.of(),
-            Transforms.EMPTY_TRANSFORM,
-            Distributions.NONE,
-            new SortOrder[0]);
-
-    catalog
-        .asTableCatalog()
-        .alterTable(
-            tableIdentifier,
-            TableChange.updateColumnPosition(
-                new String[] {col1.name()}, 
TableChange.ColumnPosition.defaultPos()));
-
-    Table updateColumnPositionTable = 
catalog.asTableCatalog().loadTable(tableIdentifier);
-
-    Column[] updateCols = updateColumnPositionTable.columns();
-    Assertions.assertEquals(3, updateCols.length);
-    Assertions.assertEquals(col2.name(), updateCols[0].name());
-    Assertions.assertEquals(col3.name(), updateCols[1].name());
-    Assertions.assertEquals(col1.name(), updateCols[2].name());
-
-    catalog.asTableCatalog().dropTable(tableIdentifier);
-  }
-
   @Test
   public void testAlterIcebergTable() {
     Column[] columns = createColumns();

Reply via email to