From f3bf1e7e73e6c1ee72f108098287aabde93ec8a5 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 14 Jul 2021 16:16:56 +0200 Subject: [PATCH] [jOOQ/jOOQ#12189] Db2 cannot handle scalar subqueries in JSON_OBJECT in the presence of a MULTISET ad-hoc converter --- jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java | 4 ++++ jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java | 4 ++++ jOOQ/src/main/java/org/jooq/impl/Tools.java | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java b/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java index c7ca9484b1..6104c51f83 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java @@ -228,5 +228,9 @@ final class ConvertedDataType extends AbstractDataTypeX { public final DataType asConvertedDataType(Converter converter) { return super.asConvertedDataType(new ChainedConverterBinding(getBinding(), converter)); } + + final DataType delegate() { + return delegate instanceof ConvertedDataType ? ((ConvertedDataType) delegate).delegate() : delegate; + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java b/jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java index 2f20dbbf49..73b8150eac 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java @@ -63,6 +63,7 @@ import static org.jooq.impl.Names.N_JSON_QUERY; import static org.jooq.impl.SQLDataType.VARCHAR; import static org.jooq.impl.Tools.combine; import static org.jooq.impl.Tools.emulateMultiset; +import static org.jooq.impl.Tools.isScalarSubquery; import static org.jooq.impl.Tools.BooleanDataKey.DATA_MULTISET_CONTENT; import java.util.Set; @@ -241,6 +242,9 @@ final class JSONEntryImpl extends AbstractQueryPart implements JSONEntry, } static final boolean isJSON(Scope scope, DataType t) { + if (t instanceof ConvertedDataType) + t = ((ConvertedDataType) t).delegate(); + return t.isJSON() || t.isRecord() && (TRUE.equals(scope.data(DATA_MULTISET_CONTENT)) && emulateMultisetWithJSON(scope)) || t.isMultiset() && emulateMultisetWithJSON(scope); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 73f47c6c88..8a23f5ac12 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -5409,6 +5409,11 @@ final class Tools { return result != null ? result : table; } + static final boolean isScalarSubquery(Field field) { + // TODO: Replace other instanceof checks by this one + return uncoerce(field) instanceof ScalarSubquery; + } + static final Field uncoerce(Field field) { return field instanceof Coerce ? ((Coerce) field).field : field; }