diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java index 2cbeecf86f..3fe2125d30 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java @@ -1013,11 +1013,16 @@ abstract class AbstractRecord extends AbstractStore implements Record { * public for broader use...? */ protected final void from(Record source) { - for (Field field : fields.fields.fields) { - Field sourceField = source.field(field); + if (source instanceof AbstractRecord) { AbstractRecord a = (AbstractRecord) source; + a.new TransferRecordState<>(fields.fields.fields).apply(this); + } + else { + for (Field field : fields.fields.fields) { + Field sourceField = source.field(field); - if (sourceField != null && source.changed(sourceField)) - Tools.setValue(this, field, source, sourceField); + if (sourceField != null && source.changed(sourceField)) + Tools.setValue(this, field, source, sourceField); + } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java b/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java index 6104c51f83..1805e81a77 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java @@ -37,6 +37,8 @@ */ package org.jooq.impl; +import java.util.List; + import org.jooq.Binding; import org.jooq.CharacterSet; import org.jooq.Collation; @@ -219,6 +221,11 @@ final class ConvertedDataType extends AbstractDataTypeX { else if (delegate.isMultiset() && !(object instanceof Result)) return (U) object; + // [#12413] Avoid double conversion passes between Record and custom object types + // (List is what we produce when reading XML or JSON nested data) + else if (delegate.isRecord() && !(object instanceof Record || object instanceof List)) + return (U) object; + // [#3200] Try to convert arbitrary objects to T else return ((Converter) getConverter()).from(delegate.convert(object));