This is an automated email from the ASF dual-hosted git repository.
davidzollo pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git
The following commit(s) were added to refs/heads/dev by this push:
new 8f29bdaea9 [Fix][Connector-V2] Support PostgreSQL enum in JDBC source
(#11232)
8f29bdaea9 is described below
commit 8f29bdaea9d81fa9303258b5348dd0d732db4ba2
Author: Jast <[email protected]>
AuthorDate: Wed Jul 1 20:34:05 2026 +0800
[Fix][Connector-V2] Support PostgreSQL enum in JDBC source (#11232)
---
.../dialect/psql/PostgresTypeConverter.java | 7 ++++
.../internal/dialect/psql/PostgresTypeMapper.java | 1 +
.../dialect/psql/PostgresTypeConverterTest.java | 43 ++++++++++++++++++++++
3 files changed, 51 insertions(+)
diff --git
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/psql/PostgresTypeConverter.java
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/psql/PostgresTypeConverter.java
index 588b2df183..465a587e3f 100644
---
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/psql/PostgresTypeConverter.java
+++
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/psql/PostgresTypeConverter.java
@@ -34,6 +34,8 @@ import
org.apache.seatunnel.connectors.seatunnel.jdbc.internal.dialect.DatabaseI
import com.google.auto.service.AutoService;
import lombok.extern.slf4j.Slf4j;
+import java.sql.Types;
+
// reference http://www.postgres.cn/docs/13/datatype.html
@Slf4j
@AutoService(TypeConverter.class)
@@ -283,6 +285,11 @@ public class PostgresTypeConverter implements
TypeConverter<BasicTypeDefine> {
}
break;
default:
+ if (typeDefine.getSqlType() == Types.OTHER) {
+ builder.dataType(BasicType.STRING_TYPE);
+ builder.sourceType(typeDefine.getColumnType());
+ break;
+ }
throw CommonError.convertToSeaTunnelTypeError(
identifier(), typeDefine.getDataType(),
typeDefine.getName());
}
diff --git
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/psql/PostgresTypeMapper.java
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/psql/PostgresTypeMapper.java
index 58bed581ed..3f5cae4fdb 100644
---
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/psql/PostgresTypeMapper.java
+++
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/psql/PostgresTypeMapper.java
@@ -44,6 +44,7 @@ public class PostgresTypeMapper implements
JdbcDialectTypeMapper {
.name(columnName)
.columnType(nativeType)
.dataType(nativeType)
+ .sqlType(metadata.getColumnType(colIndex))
.nullable(isNullable ==
ResultSetMetaData.columnNullable)
.length((long) precision)
.precision((long) precision)
diff --git
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/psql/PostgresTypeConverterTest.java
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/psql/PostgresTypeConverterTest.java
index f8058a7c00..842b2abf8e 100644
---
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/psql/PostgresTypeConverterTest.java
+++
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/psql/PostgresTypeConverterTest.java
@@ -31,6 +31,13 @@ import
org.apache.seatunnel.common.exception.SeaTunnelRuntimeException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Types;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
public class PostgresTypeConverterTest {
@Test
public void testConvertUnsupported() {
@@ -266,6 +273,42 @@ public class PostgresTypeConverterTest {
Assertions.assertEquals(typeDefine.getColumnType(),
column.getSourceType());
}
+ @Test
+ public void testConvertCustomEnumAsString() {
+ BasicTypeDefine<Object> typeDefine =
+ BasicTypeDefine.builder()
+ .name("status")
+ .columnType("JobStatus")
+ .dataType("JobStatus")
+ .sqlType(Types.OTHER)
+ .nullable(true)
+ .build();
+
+ Column column = PostgresTypeConverter.INSTANCE.convert(typeDefine);
+
+ Assertions.assertEquals(typeDefine.getName(), column.getName());
+ Assertions.assertEquals(BasicType.STRING_TYPE, column.getDataType());
+ Assertions.assertEquals(typeDefine.getColumnType(),
column.getSourceType());
+ Assertions.assertTrue(column.isNullable());
+ }
+
+ @Test
+ public void testTypeMapperPassesJdbcTypeForCustomEnum() throws
SQLException {
+ ResultSetMetaData metadata = mock(ResultSetMetaData.class);
+ when(metadata.getColumnLabel(1)).thenReturn("status");
+ when(metadata.getColumnTypeName(1)).thenReturn("JobStatus");
+ when(metadata.getColumnType(1)).thenReturn(Types.OTHER);
+
when(metadata.isNullable(1)).thenReturn(ResultSetMetaData.columnNullable);
+ when(metadata.getPrecision(1)).thenReturn(0);
+ when(metadata.getScale(1)).thenReturn(0);
+
+ Column column = new PostgresTypeMapper().mappingColumn(metadata, 1);
+
+ Assertions.assertEquals("status", column.getName());
+ Assertions.assertEquals(BasicType.STRING_TYPE, column.getDataType());
+ Assertions.assertEquals("JobStatus", column.getSourceType());
+ }
+
@Test
public void testConvertBinary() {
BasicTypeDefine<Object> typeDefine =