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; }