Ensure TypeContributor registered JdbcType has precedence over fallback and preferred types

This commit is contained in:
Christian Beikov 2022-12-15 18:46:51 +01:00
parent 37ec41d319
commit c6ecdb78f4
1 changed files with 25 additions and 16 deletions

View File

@ -391,6 +391,11 @@ public class MetadataBuildingProcess {
// add Dialect contributed types
final Dialect dialect = options.getServiceRegistry().getService( JdbcServices.class ).getDialect();
dialect.contributeTypes( typeContributions, options.getServiceRegistry() );
// Capture the dialect configured JdbcTypes so that we can detect if a TypeContributor overwrote them,
// which has precedence over the fallback and preferred type registrations
final JdbcType dialectUuidDescriptor = jdbcTypeRegistry.findDescriptor( SqlTypes.UUID );
final JdbcType dialectArrayDescriptor = jdbcTypeRegistry.findDescriptor( SqlTypes.ARRAY );
final JdbcType dialectIntervalDescriptor = jdbcTypeRegistry.findDescriptor( SqlTypes.INTERVAL_SECOND );
// add TypeContributor contributed types.
for ( TypeContributor contributor : classLoaderService.loadJavaServices( TypeContributor.class ) ) {
@ -400,7 +405,12 @@ public class MetadataBuildingProcess {
// add fallback type descriptors
final int preferredSqlTypeCodeForUuid = getPreferredSqlTypeCodeForUuid( serviceRegistry );
if ( preferredSqlTypeCodeForUuid != SqlTypes.UUID ) {
adaptToPreferredSqlTypeCode( jdbcTypeRegistry, SqlTypes.UUID, preferredSqlTypeCodeForUuid );
adaptToPreferredSqlTypeCode(
jdbcTypeRegistry,
dialectUuidDescriptor,
SqlTypes.UUID,
preferredSqlTypeCodeForUuid
);
}
else {
addFallbackIfNecessary( jdbcTypeRegistry, SqlTypes.UUID, SqlTypes.BINARY );
@ -408,15 +418,25 @@ public class MetadataBuildingProcess {
final int preferredSqlTypeCodeForArray = getPreferredSqlTypeCodeForArray( serviceRegistry );
if ( preferredSqlTypeCodeForArray == SqlTypes.ARRAY ) {
adaptToPreferredSqlTypeCode( jdbcTypeRegistry, null, SqlTypes.ARRAY, SqlTypes.VARBINARY );
adaptToPreferredSqlTypeCode( jdbcTypeRegistry, dialectArrayDescriptor, SqlTypes.ARRAY, SqlTypes.VARBINARY );
}
else {
adaptToPreferredSqlTypeCode( jdbcTypeRegistry, SqlTypes.ARRAY, preferredSqlTypeCodeForArray );
adaptToPreferredSqlTypeCode(
jdbcTypeRegistry,
dialectArrayDescriptor,
SqlTypes.ARRAY,
preferredSqlTypeCodeForArray
);
}
final int preferredSqlTypeCodeForDuration = getPreferredSqlTypeCodeForDuration( serviceRegistry );
if ( preferredSqlTypeCodeForDuration != SqlTypes.INTERVAL_SECOND ) {
adaptToPreferredSqlTypeCode( jdbcTypeRegistry, SqlTypes.INTERVAL_SECOND, preferredSqlTypeCodeForDuration );
adaptToPreferredSqlTypeCode(
jdbcTypeRegistry,
dialectIntervalDescriptor,
SqlTypes.INTERVAL_SECOND,
preferredSqlTypeCodeForDuration
);
}
else {
addFallbackIfNecessary( jdbcTypeRegistry, SqlTypes.INTERVAL_SECOND, SqlTypes.NUMERIC );
@ -471,18 +491,6 @@ public class MetadataBuildingProcess {
}
}
private static void adaptToPreferredSqlTypeCode(
JdbcTypeRegistry jdbcTypeRegistry,
int defaultSqlTypeCode,
int preferredSqlTypeCode) {
adaptToPreferredSqlTypeCode(
jdbcTypeRegistry,
jdbcTypeRegistry.findDescriptor( defaultSqlTypeCode ),
defaultSqlTypeCode,
preferredSqlTypeCode
);
}
private static void adaptToPreferredSqlTypeCode(
JdbcTypeRegistry jdbcTypeRegistry,
JdbcType dialectUuidDescriptor,
@ -494,6 +502,7 @@ public class MetadataBuildingProcess {
jdbcTypeRegistry.getDescriptor( preferredSqlTypeCode )
);
}
// else warning?
}
private static void adaptToPreferredSqlTypeCodeForInstant(