From a26e6f767657c78165bc15bed466529ff440f47d Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 13 Oct 2021 17:57:14 +0200 Subject: [PATCH] [jOOQ/jOOQ#12413] DataTypeException in multiset with a mapped nested row --- .../src/main/java/org/jooq/impl/AbstractRecord.java | 13 +++++++++---- .../main/java/org/jooq/impl/ConvertedDataType.java | 7 +++++++ 2 files changed, 16 insertions(+), 4 deletions(-) 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));