CHANHAE OH created FLINK-38850:
----------------------------------
Summary: [Connector/JDBC] Support PostgreSQL uuid type
Key: FLINK-38850
URL: https://issues.apache.org/jira/browse/FLINK-38850
Project: Flink
Issue Type: Improvement
Components: Connectors / JDBC
Affects Versions: jdbc-4.0.0
Reporter: CHANHAE OH
Fix For: jdbc-4.0.0
h2. 1. The Reason for This Change (Motivation)
Currently, the Flink JDBC Connector for PostgreSQL does not recognize the
native uuid data type. When a user attempts to read a table containing a uuid
column through the PostgresCatalog, it fails with an
UnsupportedOperationException: Doesn't support Postgres type 'uuid' yet.
The uuid type is a widely used and important data type in PostgreSQL for
storing unique identifiers. Adding support for it significantly improves the
usability and completeness of the PostgreSQL connector.
h2. 2. The Solution (Changes)
This PR introduces support for the PostgreSQL uuid type by making the following
changes:
# Schema-level Mapping (PostgresTypeMapper.java):
Mapped the PostgreSQL {{uuid}} type to Flink's {{{}DataTypes.VARCHAR(36){}}}.
This is the most appropriate mapping as the standard string representation of a
UUID is 36 characters long.
# Runtime Data Conversion (AbstractDialectConverter.java):
Resolved a fundamental {{ClassCastException}} that occurred during runtime. The
PostgreSQL JDBC driver returns a {{java.util.UUID}} object for {{uuid}}
columns, but the existing converter logic tried to cast it directly to a
{{{}java.lang.String{}}}.
The deserialization logic for {{CHAR}} and {{VARCHAR}} types has been updated
from {{(String) val}} to the more robust {{{}val.toString(){}}}. This not only
fixes the issue for UUID but also improves the connector's resilience by
correctly handling any object that has a valid string representation.
# Test Environment Setup (PostgresMetadata.java):
Added the {{stringtype=unspecified}} option to the test-only JDBC URL in
{{{}PostgresMetadata.java{}}}. This change is {*}critical for the verification
process{*}. When populating test data, the test framework attempts to insert a
Java {{String}} into a {{uuid}} database column. Without this option, the JDBC
driver specifies the type as {{{}varchar{}}}, causing a {{PSQLException}} from
the PostgreSQL server. With {{{}stringtype=unspecified{}}}, the driver does not
specify the type, allowing the server to correctly perform an implicit cast
from the string literal to the uuid type. *This change is confined to the test
scope and does not affect the main production code.*
h2. 3. Test Case Description (Verification)
Comprehensive tests have been added to verify the correctness of this feature
and ensure no regressions were introduced:
# PostgresCatalogTest.java:
A new test testUuidDataTypes() was added. It verifies that the PostgresCatalog
correctly infers the schema of a table with a uuid column as VARCHAR(36).
The existing testListTables() test was updated to correctly expect the newly
added uuid_table.
# PostgresCatalogITCase.java:
A new end-to-end test testUuidTypes() was added. This test executes a Flink SQL
SELECT query on the uuid_table and asserts that the data is read correctly,
confirming that the runtime data conversion works as expected.
# PostgresDynamicTableSourceITCase.java:
The existing integration test was modified to include a uuid column. This
verifies that the changes work correctly within the dynamic table source
framework.
related PR : https://github.com/apache/flink-connector-jdbc/pull/182
--
This message was sent by Atlassian Jira
(v8.20.10#820010)