From 1b0f34eb05c8748799e0316fd266fa8d6472e725 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 13 Mar 2025 12:04:35 +0100 Subject: [PATCH] [jOOQ/jOOQ#18152] JSON MULTISET emulation of deeply nested records doesn't correctly set touched flag to false --- .../main/java/org/jooq/impl/JSONReader.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONReader.java b/jOOQ/src/main/java/org/jooq/impl/JSONReader.java index 47f0554f0b..955626727d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONReader.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONReader.java @@ -249,12 +249,11 @@ final class JSONReader { private static final List patchRecord(DSLContext ctx, boolean multiset, Fields result, List record) { for (int i = 0; i < result.fields().length; i++) { Field field = result.field(i); + Object value = record.get(i); // [#8829] LoaderImpl expects binary data to be encoded in base64, // not according to org.jooq.tools.Convert - if (field.getDataType().isBinary() && record.get(i) instanceof String) { - String s = (String) record.get(i); - + if (field.getDataType().isBinary() && value instanceof String s) { if (multiset) { // [#12134] PostgreSQL encodes binary data as hex @@ -286,16 +285,24 @@ final class JSONReader { (AbstractRow) field.getDataType().getRow(), (Class) field.getDataType().getRecordType(), multiset, - record.get(i) + value )); } // [#14657] Recurse for nested ROW - else if (multiset && field.getDataType().isRecord() && record.get(i) instanceof List) { + // [#18152] Handle also the Map encoding of nested ROW values + else if (multiset && field.getDataType().isRecord() && (value instanceof List || value instanceof Map)) { AbstractRow actualRow = (AbstractRow) field.getDataType().getRow(); Class recordType = field.getDataType().getRecordType(); - List l = (List) record.get(i); - patchRecord(ctx, multiset, actualRow, l); + + List l; + + if (value instanceof List) + l = patchRecord(ctx, multiset, actualRow, (List) value); + else if (value instanceof Map) + l = patchRecord(ctx, multiset, actualRow, new ArrayList<>(((Map) value).values())); + else + throw new IllegalStateException(); record.set(i, newRecord(true, ctx.configuration(), recordType, actualRow).operate(r -> { r.from(l);