From 2e24767acacc5c996b1855fd2f928248158620dc Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 1 Nov 2024 15:49:03 +0100 Subject: [PATCH] [jOOQ/jOOQ#17512] Oracle RETURNING emulation doesn't use configured ConverterProvider from an AutoConverter --- jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java | 10 ++++++++++ jOOQ/src/main/java/org/jooq/impl/AutoConverter.java | 10 +++++++++- jOOQ/src/main/java/org/jooq/impl/Tools.java | 5 +++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index 27159d2cdc..d06b7f65df 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -73,6 +73,7 @@ import static org.jooq.SQLDialect.SQLITE; import static org.jooq.SQLDialect.TRINO; // ... import static org.jooq.conf.SettingsTools.renderLocale; +import static org.jooq.impl.AbstractDataType.convert0; import static org.jooq.impl.CommonTableExpressionList.markTopLevelCteAndAccept; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.select; @@ -99,11 +100,15 @@ import static org.jooq.impl.Tools.EMPTY_FIELD; import static org.jooq.impl.Tools.EMPTY_STRING; import static org.jooq.impl.Tools.anyMatch; import static org.jooq.impl.Tools.autoAlias; +import static org.jooq.impl.Tools.converterContext; import static org.jooq.impl.Tools.flattenCollection; import static org.jooq.impl.Tools.increment; import static org.jooq.impl.Tools.map; +import static org.jooq.impl.Tools.newRecord; import static org.jooq.impl.Tools.reference; import static org.jooq.impl.Tools.removeGenerator; +import static org.jooq.impl.Tools.row0; +import static org.jooq.impl.Tools.setValue; import static org.jooq.impl.Tools.unalias; import static org.jooq.impl.Tools.updateQueryImpl; import static org.jooq.impl.Tools.BooleanDataKey.DATA_UNALIAS_ALIASED_EXPRESSIONS; @@ -133,10 +138,12 @@ import java.util.function.BiFunction; import org.jooq.Asterisk; import org.jooq.Binding; +import org.jooq.BindingGetResultSetContext; import org.jooq.CommonTableExpression; import org.jooq.Condition; import org.jooq.Configuration; import org.jooq.Context; +import org.jooq.ConverterContext; import org.jooq.DMLQuery; import org.jooq.DSLContext; import org.jooq.DataType; @@ -1301,6 +1308,9 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/AutoConverter.java b/jOOQ/src/main/java/org/jooq/impl/AutoConverter.java index 5b4182e85e..5fd5da4f08 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AutoConverter.java +++ b/jOOQ/src/main/java/org/jooq/impl/AutoConverter.java @@ -44,6 +44,7 @@ import org.jooq.Configuration; import org.jooq.ContextConverter; import org.jooq.Converter; import org.jooq.ConverterContext; +import org.jooq.exception.DataTypeException; import org.jetbrains.annotations.NotNull; @@ -71,7 +72,14 @@ public /* non-final */ class AutoConverter extends AbstractContextConverte private final ContextConverter delegate(ConverterContext ctx) { Converter c = ctx.configuration().converterProvider().provide(fromType(), toType()); - return scoped(c != null ? c : CONFIG.get().converterProvider().provide(fromType(), toType())); + + if (c == null) + c = CONFIG.get().converterProvider().provide(fromType(), toType()); + + if (c == null) + throw new DataTypeException("Cannot auto convert from " + fromType() + " to " + toType()); + else + return scoped(c); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index e2233b3d15..7a8fce8495 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -97,6 +97,7 @@ import static org.jooq.conf.SettingsTools.updatablePrimaryKeys; import static org.jooq.conf.ThrowExceptions.THROW_FIRST; import static org.jooq.conf.ThrowExceptions.THROW_NONE; import static org.jooq.exception.DataAccessException.sqlStateClass; +import static org.jooq.impl.AbstractDataType.convert0; import static org.jooq.impl.CacheType.REFLECTION_CACHE_GET_ANNOTATED_GETTER; import static org.jooq.impl.CacheType.REFLECTION_CACHE_GET_ANNOTATED_MEMBERS; import static org.jooq.impl.CacheType.REFLECTION_CACHE_GET_ANNOTATED_SETTERS; @@ -3761,14 +3762,14 @@ final class Tools { * Type-safely set a value to a record */ static final void setValue(Record target, Field targetField, Object value, ConverterContext cc) { - target.set(targetField, ((AbstractDataType) targetField.getDataType()).convert(value, cc)); + target.set(targetField, convert0(targetField.getDataType(), value, cc)); } /** * Type-safely set a value to a record */ static final void setValue(AbstractRecord target, Field targetField, int targetIndex, Object value, ConverterContext cc) { - target.set(targetField, targetIndex, ((AbstractDataType) targetField.getDataType()).convert(value, cc)); + target.set(targetField, targetIndex, convert0(targetField.getDataType(), value, cc)); } /**