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

jshao pushed a commit to branch branch-0.9
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-0.9 by this push:
     new e096d09b46 improvement(catalogs): fix index existence check (#7660)
e096d09b46 is described below

commit e096d09b463170a3ae34d4e73a3ae2b7dddde731
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Jul 11 10:04:34 2025 +0800

    improvement(catalogs): fix index existence check (#7660)
    
    ### What changes were proposed in this pull request?
    
    fix index existence check
    
    ### Why are the changes needed?
    
    Fix: #7591
    
    ### Does this PR introduce _any_ user-facing change?
    
    No
    
    ### How was this patch tested?
    
    tests added.
    
    Co-authored-by: BIN <[email protected]>
    Co-authored-by: senlizishi <[email protected]>
---
 .../doris/operation/DorisTableOperations.java      |  2 +-
 .../doris/operation/TestDorisTableOperations.java  | 48 +++++++++++++++++++
 .../mysql/operation/MysqlTableOperations.java      | 10 ++--
 .../mysql/operation/TestMysqlTableOperations.java  | 54 +++++++++++++++++++++-
 .../operation/OceanBaseTableOperations.java        | 10 ++--
 .../operation/TestOceanBaseTableOperations.java    | 53 ++++++++++++++++++++-
 6 files changed, 162 insertions(+), 15 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 425bf51d4c..48f48575f3 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
@@ -774,7 +774,7 @@ public class DorisTableOperations extends 
JdbcTableOperations {
 
   static String deleteIndexDefinition(
       JdbcTable lazyLoadTable, TableChange.DeleteIndex deleteIndex) {
-    if (deleteIndex.isIfExists()) {
+    if (!deleteIndex.isIfExists()) {
       Preconditions.checkArgument(
           Arrays.stream(lazyLoadTable.index())
               .anyMatch(index -> index.name().equals(deleteIndex.getName())),
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 a9dfb0ed60..dd164473b4 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
@@ -640,4 +640,52 @@ public class TestDorisTableOperations extends TestDoris {
     assertTrue(loadedListPartitions.containsKey("p2"));
     assertTrue(Arrays.deepEquals(listPartition2.lists(), 
loadedListPartitions.get("p2").lists()));
   }
+
+  @Test
+  public void testOperationIndexDefinition() {
+    String tableName = 
GravitinoITUtils.genRandomName("doris_basic_test_table");
+    String tableComment = "test_comment";
+    List<JdbcColumn> columns = new ArrayList<>();
+    JdbcColumn col_1 =
+        
JdbcColumn.builder().withName("col_1").withType(INT).withComment("id").build();
+    columns.add(col_1);
+    JdbcColumn col_2 =
+        
JdbcColumn.builder().withName("col_2").withType(VARCHAR_255).withComment("col_2").build();
+    columns.add(col_2);
+
+    Distribution distribution =
+        Distributions.hash(DEFAULT_BUCKET_SIZE, NamedReference.field("col_1"));
+    Index[] indexes = new Index[] {Indexes.unique("uk_2", new String[][] 
{{"col_1"}})};
+
+    // create table
+    TABLE_OPERATIONS.create(
+        databaseName,
+        tableName,
+        columns.toArray(new JdbcColumn[0]),
+        tableComment,
+        createProperties(),
+        null,
+        distribution,
+        indexes);
+    JdbcTable load = TABLE_OPERATIONS.load(databaseName, tableName);
+
+    // If ifExists is set to true then the code should not throw an exception 
if the index doesn't
+    // exist.
+    TableChange.DeleteIndex deleteIndex = new TableChange.DeleteIndex("uk_1", 
true);
+    String sql = DorisTableOperations.deleteIndexDefinition(null, deleteIndex);
+    Assertions.assertEquals("DROP INDEX uk_1", sql);
+
+    // The index existence check should only verify existence when ifExists is 
false, preventing
+    // failures when dropping non-existent indexes.
+    TableChange.DeleteIndex deleteIndex2 = new TableChange.DeleteIndex("uk_1", 
false);
+    IllegalArgumentException thrown =
+        Assertions.assertThrows(
+            IllegalArgumentException.class,
+            () -> DorisTableOperations.deleteIndexDefinition(load, 
deleteIndex2));
+    Assertions.assertEquals("Index does not exist", thrown.getMessage());
+
+    TableChange.DeleteIndex deleteIndex3 = new TableChange.DeleteIndex("uk_2", 
false);
+    sql = DorisTableOperations.deleteIndexDefinition(load, deleteIndex3);
+    Assertions.assertEquals("DROP INDEX uk_2", sql);
+  }
 }
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 36b4daebf9..35683e7346 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
@@ -346,11 +346,11 @@ public class MysqlTableOperations extends 
JdbcTableOperations {
   @VisibleForTesting
   static String deleteIndexDefinition(
       JdbcTable lazyLoadTable, TableChange.DeleteIndex deleteIndex) {
-    if (deleteIndex.isIfExists()) {
-      if (Arrays.stream(lazyLoadTable.index())
-          .anyMatch(index -> index.name().equals(deleteIndex.getName()))) {
-        throw new IllegalArgumentException("Index does not exist");
-      }
+    if (!deleteIndex.isIfExists()) {
+      Preconditions.checkArgument(
+          Arrays.stream(lazyLoadTable.index())
+              .anyMatch(index -> index.name().equals(deleteIndex.getName())),
+          "Index does not exist");
     }
     return "DROP INDEX " + BACK_QUOTE + deleteIndex.getName() + BACK_QUOTE;
   }
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 923e20fa0c..e33533742b 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
@@ -1051,8 +1051,58 @@ public class TestMysqlTableOperations extends TestMysql {
     sql = MysqlTableOperations.addIndexDefinition(successIndex);
     Assertions.assertEquals("ADD PRIMARY KEY  (`col_1`, `col_2`)", sql);
 
-    TableChange.DeleteIndex deleteIndex = new TableChange.DeleteIndex("uk_1", 
false);
-    sql = MysqlTableOperations.deleteIndexDefinition(null, deleteIndex);
+    String tableName = RandomStringUtils.randomAlphabetic(16) + "_op_table";
+    String tableComment = "test_comment";
+    List<JdbcColumn> columns = new ArrayList<>();
+    columns.add(
+        JdbcColumn.builder()
+            .withName("col_1")
+            .withType(INT)
+            .withComment("id")
+            .withNullable(false)
+            .build());
+    columns.add(
+        JdbcColumn.builder()
+            .withName("col_2")
+            .withType(INT)
+            .withNullable(true)
+            .withDefaultValue(Literals.NULL)
+            .build());
+    Map<String, String> properties = new HashMap<>();
+    properties.put(MYSQL_AUTO_INCREMENT_OFFSET_KEY, "10");
+
+    Index[] indexes = new Index[] {Indexes.unique("uk_2", new String[][] 
{{"col_1"}})};
+    // create table
+    TABLE_OPERATIONS.create(
+        TEST_DB_NAME.toString(),
+        tableName,
+        columns.toArray(new JdbcColumn[0]),
+        tableComment,
+        properties,
+        null,
+        Distributions.NONE,
+        indexes);
+
+    // load table
+    JdbcTable load = TABLE_OPERATIONS.load(TEST_DB_NAME.toString(), tableName);
+
+    // If ifExists is set to true then the code should not throw an exception 
if the index doesn't
+    // exist.
+    TableChange.DeleteIndex deleteIndex = new TableChange.DeleteIndex("uk_1", 
true);
+    sql = MysqlTableOperations.deleteIndexDefinition(load, deleteIndex);
     Assertions.assertEquals("DROP INDEX `uk_1`", sql);
+
+    // The index existence check should only verify existence when ifExists is 
false, preventing
+    // failures when dropping non-existent indexes.
+    TableChange.DeleteIndex deleteIndex2 = new TableChange.DeleteIndex("uk_1", 
false);
+    IllegalArgumentException thrown =
+        Assertions.assertThrows(
+            IllegalArgumentException.class,
+            () -> MysqlTableOperations.deleteIndexDefinition(load, 
deleteIndex2));
+    Assertions.assertEquals("Index does not exist", thrown.getMessage());
+
+    TableChange.DeleteIndex deleteIndex3 = new TableChange.DeleteIndex("uk_2", 
false);
+    sql = MysqlTableOperations.deleteIndexDefinition(load, deleteIndex3);
+    Assertions.assertEquals("DROP INDEX `uk_2`", sql);
   }
 }
diff --git 
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/operation/OceanBaseTableOperations.java
 
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/operation/OceanBaseTableOperations.java
index 98f2d174f1..e79250b1b1 100644
--- 
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/operation/OceanBaseTableOperations.java
+++ 
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/operation/OceanBaseTableOperations.java
@@ -361,11 +361,11 @@ public class OceanBaseTableOperations extends 
JdbcTableOperations {
   @VisibleForTesting
   static String deleteIndexDefinition(
       JdbcTable lazyLoadTable, TableChange.DeleteIndex deleteIndex) {
-    if (deleteIndex.isIfExists()) {
-      if (Arrays.stream(lazyLoadTable.index())
-          .anyMatch(index -> index.name().equals(deleteIndex.getName()))) {
-        throw new IllegalArgumentException("Index does not exist");
-      }
+    if (!deleteIndex.isIfExists()) {
+      Preconditions.checkArgument(
+          Arrays.stream(lazyLoadTable.index())
+              .anyMatch(index -> index.name().equals(deleteIndex.getName())),
+          "Index does not exist");
     }
     return "DROP INDEX " + BACK_QUOTE + deleteIndex.getName() + BACK_QUOTE;
   }
diff --git 
a/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBaseTableOperations.java
 
b/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBaseTableOperations.java
index 6f2a422fbd..c8d4fb2382 100644
--- 
a/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBaseTableOperations.java
+++ 
b/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBaseTableOperations.java
@@ -990,8 +990,57 @@ public class TestOceanBaseTableOperations extends 
TestOceanBase {
     sql = OceanBaseTableOperations.addIndexDefinition(successIndex);
     Assertions.assertEquals("ADD PRIMARY KEY  (`col_1`, `col_2`)", sql);
 
-    TableChange.DeleteIndex deleteIndex = new TableChange.DeleteIndex("uk_1", 
false);
-    sql = OceanBaseTableOperations.deleteIndexDefinition(null, deleteIndex);
+    String tableName = RandomStringUtils.randomAlphabetic(16).toLowerCase() + 
"_oi_table";
+    String tableComment = "test_comment";
+    List<JdbcColumn> columns = new ArrayList<>();
+    columns.add(
+        JdbcColumn.builder()
+            .withName("col_1")
+            .withType(INT)
+            .withNullable(false)
+            .withComment("set primary key")
+            .build());
+    columns.add(
+        JdbcColumn.builder()
+            .withName("col_2")
+            .withType(VARCHAR)
+            .withComment("test_comment")
+            .withNullable(true)
+            .build());
+    Map<String, String> properties = new HashMap<>();
+
+    Index[] indexes = new Index[] {Indexes.unique("uk_2", new String[][] 
{{"col_1"}})};
+    // create table
+    TABLE_OPERATIONS.create(
+        TEST_DB_NAME,
+        tableName,
+        columns.toArray(new JdbcColumn[0]),
+        tableComment,
+        properties,
+        null,
+        Distributions.NONE,
+        indexes);
+
+    // load table
+    JdbcTable load = TABLE_OPERATIONS.load(TEST_DB_NAME, tableName);
+
+    // If ifExists is set to true then the code should not throw an exception 
if the index doesn't
+    // exist.
+    TableChange.DeleteIndex deleteIndex = new TableChange.DeleteIndex("uk_1", 
true);
+    sql = OceanBaseTableOperations.deleteIndexDefinition(load, deleteIndex);
     Assertions.assertEquals("DROP INDEX `uk_1`", sql);
+
+    // The index existence check should only verify existence when ifExists is 
false, preventing
+    // failures when dropping non-existent indexes.
+    TableChange.DeleteIndex deleteIndex2 = new TableChange.DeleteIndex("uk_1", 
false);
+    IllegalArgumentException thrown =
+        Assertions.assertThrows(
+            IllegalArgumentException.class,
+            () -> OceanBaseTableOperations.deleteIndexDefinition(load, 
deleteIndex2));
+    Assertions.assertEquals("Index does not exist", thrown.getMessage());
+
+    TableChange.DeleteIndex deleteIndex3 = new TableChange.DeleteIndex("uk_2", 
false);
+    sql = OceanBaseTableOperations.deleteIndexDefinition(load, deleteIndex3);
+    Assertions.assertEquals("DROP INDEX `uk_2`", sql);
   }
 }

Reply via email to