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

jerryshao 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 384b2c63ed [#13343] fix(doris): handle unknown-table error code 1109 
used in newer version.  (#13537)
384b2c63ed is described below

commit 384b2c63ed94fb79bb67a473bc6103bd42d64313
Author: Qi Yu <[email protected]>
AuthorDate: Mon Sep 28 14:37:01 2026 +0800

    [#13343] fix(doris): handle unknown-table error code 1109 used in newer 
version.  (#13537)
    
    ### What changes were proposed in this pull request?
    
    Map Doris JDBC error code 1109 (`ERR_UNKNOWN_TABLE`) to
    `NoSuchTableException`. Add regression tests for exception conversion
    and DROP returning `false` with codes 1051, 1105, and 1109.
    
    ### Why are the changes needed?
    
    The previous fix only parses missing-table messages for code 1105. Newer
    Doris versions preserve code 1109, which falls through to a generic
    runtime exception and makes dropping a missing table return HTTP 500.
    
    Fix: #13343
    
    ### Does this PR introduce _any_ user-facing change?
    
    Dropping a missing Doris table also returns HTTP 200 with
    `dropped:false` when the backend reports code 1109.
    
    ### How was this patch tested?
    
    - Confirmed the new converter regression fails for code 1109 before the
    fix.
    - `./gradlew spotlessApply -PskipWeb=true`
    - `./gradlew :catalogs:catalog-jdbc-doris:test -PskipITs
    -PskipDockerTests=true -PskipWeb=true`
---
 .../doris/converter/DorisExceptionConverter.java   |  2 ++
 .../converter/TestDorisExceptionConverter.java     | 22 ++++++++++++
 .../TestDorisTableOperationsSqlGeneration.java     | 39 ++++++++++++++++++++++
 3 files changed, 63 insertions(+)

diff --git 
a/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/converter/DorisExceptionConverter.java
 
b/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/converter/DorisExceptionConverter.java
index 0c19f360aa..377150dc70 100644
--- 
a/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/converter/DorisExceptionConverter.java
+++ 
b/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/converter/DorisExceptionConverter.java
@@ -48,6 +48,7 @@ public class DorisExceptionConverter extends 
JdbcExceptionConverter {
   static final int CODE_UNAUTHORIZED = 1045;
   static final int CODE_NO_SUCH_COLUMN = 1054;
   static final int CODE_OTHER = 1105;
+  static final int CODE_UNKNOWN_TABLE = 1109;
   static final int CODE_DELETE_NON_EXISTING_PARTITION = 1507;
   static final int CODE_PARTITION_ALREADY_EXISTS = 1517;
   static final int CODE_BUCKETS_AUTO_NOT_SUPPORTED = 1064;
@@ -112,6 +113,7 @@ public class DorisExceptionConverter extends 
JdbcExceptionConverter {
       case CODE_UNKNOWN_DATABASE:
         return new NoSuchSchemaException(se, message);
       case CODE_NO_SUCH_TABLE:
+      case CODE_UNKNOWN_TABLE:
         return new NoSuchTableException(se, message);
       case CODE_UNAUTHORIZED:
         return new UnauthorizedException(se, message);
diff --git 
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/converter/TestDorisExceptionConverter.java
 
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/converter/TestDorisExceptionConverter.java
index 0133a99f73..876eefde1d 100644
--- 
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/converter/TestDorisExceptionConverter.java
+++ 
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/converter/TestDorisExceptionConverter.java
@@ -23,8 +23,30 @@ import 
org.apache.gravitino.exceptions.GravitinoRuntimeException;
 import org.apache.gravitino.exceptions.NoSuchTableException;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 
 public class TestDorisExceptionConverter {
+  /**
+   * Verifies missing-table errors from both legacy and newer Doris versions.
+   *
+   * @param errorCode the JDBC error code returned by Doris
+   */
+  @ParameterizedTest
+  @ValueSource(ints = {1051, 1105, 1109})
+  public void testUnknownTableErrorCodes(int errorCode) {
+    String message =
+        "errCode = 2, detailMessage = Unknown table 'no_such_table_xyz' in 
__internal_schema";
+    SQLException sqlException = new SQLException(message, "42S02", errorCode);
+
+    GravitinoRuntimeException converted =
+        new DorisExceptionConverter().toGravitinoException(sqlException);
+
+    Assertions.assertInstanceOf(NoSuchTableException.class, converted);
+    Assertions.assertEquals(message, converted.getMessage());
+    Assertions.assertSame(sqlException, converted.getCause());
+  }
+
   @Test
   public void testUnknownTableWithoutQuotes() {
     String message = "errCode = 2, detailMessage = Unknown table 
no_such_table_xyz in s_12412";
diff --git 
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperationsSqlGeneration.java
 
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperationsSqlGeneration.java
index cf8fe7f781..464797da76 100644
--- 
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperationsSqlGeneration.java
+++ 
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperationsSqlGeneration.java
@@ -36,6 +36,7 @@ import java.util.List;
 import java.util.Map;
 import javax.sql.DataSource;
 import 
org.apache.gravitino.catalog.doris.converter.DorisColumnDefaultValueConverter;
+import org.apache.gravitino.catalog.doris.converter.DorisExceptionConverter;
 import org.apache.gravitino.catalog.doris.converter.DorisTypeConverter;
 import org.apache.gravitino.catalog.jdbc.JdbcColumn;
 import org.apache.gravitino.catalog.jdbc.JdbcTable;
@@ -52,6 +53,8 @@ import org.apache.gravitino.rel.indexes.Indexes;
 import org.apache.gravitino.rel.types.Types;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.mockito.Mockito;
 
 public class TestDorisTableOperationsSqlGeneration {
@@ -75,6 +78,10 @@ public class TestDorisTableOperationsSqlGeneration {
       }
     }
 
+    void setExceptionConverter(JdbcExceptionConverter converter) {
+      super.exceptionMapper = converter;
+    }
+
     public void setDataSource(DataSource dataSource) {
       super.dataSource = dataSource;
     }
@@ -128,6 +135,38 @@ public class TestDorisTableOperationsSqlGeneration {
     }
   }
 
+  /**
+   * Verifies DROP returns false for missing-table errors from different Doris 
versions.
+   *
+   * @param errorCode the JDBC error code returned by Doris
+   * @throws SQLException if setting up the mocked JDBC connection fails
+   */
+  @ParameterizedTest
+  @ValueSource(ints = {1051, 1105, 1109})
+  public void testDropMissingTableReturnsFalse(int errorCode) throws 
SQLException {
+    DataSource dataSource = Mockito.mock(DataSource.class);
+    Connection connection = Mockito.mock(Connection.class);
+    Statement statement = Mockito.mock(Statement.class);
+    Mockito.when(dataSource.getConnection()).thenReturn(connection);
+    Mockito.when(connection.createStatement()).thenReturn(statement);
+    Mockito.when(statement.executeUpdate("DROP TABLE `no_such_table_xyz`"))
+        .thenThrow(
+            new SQLException(
+                "errCode = 2, detailMessage = Unknown table 
'no_such_table_xyz' in test_schema",
+                "42S02",
+                errorCode));
+
+    TestableDorisTableOperations ops = new TestableDorisTableOperations();
+    ops.setDataSource(dataSource);
+    ops.setExceptionConverter(new DorisExceptionConverter());
+
+    Assertions.assertFalse(ops.drop("test_schema", "no_such_table_xyz"));
+    Mockito.verify(connection).setCatalog("test_schema");
+    Mockito.verify(statement).executeUpdate("DROP TABLE `no_such_table_xyz`");
+    Mockito.verify(statement).close();
+    Mockito.verify(connection).close();
+  }
+
   @Test
   public void testCreateTableWithEmptyStringDefaultValue() {
     TestableDorisTableOperations ops = new TestableDorisTableOperations();

Reply via email to