diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDataType.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDataType.java index 5e70f9bc8e..9b88e33da2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDataType.java @@ -842,6 +842,13 @@ implements return convert(object, converterContext()); } + static final T convert0(DataType type, Object object, ConverterContext cc) { + if (type instanceof AbstractDataType t) + return t.convert(object, cc); + else + return type.convert(object); + } + /* non-final */ T convert(Object object, ConverterContext cc) { // [#1441] Avoid unneeded type conversions to improve performance diff --git a/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java b/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java index 67fdd222f1..6e646f036d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java @@ -316,8 +316,9 @@ final class ConvertedDataType extends AbstractDataTypeX { return (U) object; // [#3200] Try to convert arbitrary objects to T + // [#16013] [#17428] Avoid repeated conversion in case of chained converters else - return ((ContextConverter) getConverter()).from(delegate.convert(object, cc), cc); + return ((ContextConverter) getConverter()).from((T) convert0(delegate(delegate), object, cc), cc); } @Override