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();