diff --git a/jOOQ/src/main/java/org/jooq/impl/Multiset.java b/jOOQ/src/main/java/org/jooq/impl/Multiset.java index 9fbaa18d81..9f6bc15230 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Multiset.java +++ b/jOOQ/src/main/java/org/jooq/impl/Multiset.java @@ -80,8 +80,10 @@ import static org.jooq.impl.Tools.emulateMultiset; import static org.jooq.impl.Tools.fieldName; import static org.jooq.impl.Tools.fieldNameString; import static org.jooq.impl.Tools.fieldNames; +import static org.jooq.impl.Tools.filter; import static org.jooq.impl.Tools.map; import static org.jooq.impl.Tools.selectQueryImpl; +import static org.jooq.impl.Tools.sortable; import static org.jooq.impl.Tools.visitSubquery; import static org.jooq.impl.Tools.BooleanDataKey.DATA_MULTISET_CONDITION; import static org.jooq.impl.Tools.BooleanDataKey.DATA_MULTISET_CONTENT; @@ -199,8 +201,14 @@ final class Multiset extends AbstractField> implemen default: { if (NO_SUPPORT_CORRELATED_DERIVED_TABLE.contains(ctx.dialect()) && isSimple(select)) { + List> l = map(select.getSelect(), f -> Tools.unalias(f)); + JSONArrayAggReturningStep returning = - jsonArrayaggEmulation(ctx, row(map(select.getSelect(), f -> Tools.unalias(f))), true, select.$distinct()).orderBy(select.$orderBy()); + jsonArrayaggEmulation(ctx, row(l), true, select.$distinct()) + .orderBy(multisetCondition + ? map(filter(l, f -> sortable(f)), f -> f.sortDefault()) + : select.$orderBy() + ); Select s = select .$select(Arrays.asList(DSL.coalesce( @@ -270,8 +278,14 @@ final class Multiset extends AbstractField> implemen default: { if (NO_SUPPORT_CORRELATED_DERIVED_TABLE.contains(ctx.dialect()) && isSimple(select)) { + List> l = map(select.getSelect(), f -> Tools.unalias(f)); + JSONArrayAggReturningStep returning = - jsonbArrayaggEmulation(ctx, row(map(select.getSelect(), f -> Tools.unalias(f))), true, select.$distinct()).orderBy(select.$orderBy()); + jsonbArrayaggEmulation(ctx, row(l), true, select.$distinct()) + .orderBy(multisetCondition + ? map(filter(l, f -> sortable(f)), f -> f.sortDefault()) + : select.$orderBy() + ); Select s = select .$select(Arrays.asList(DSL.coalesce( @@ -339,11 +353,17 @@ final class Multiset extends AbstractField> implemen default: { if (NO_SUPPORT_CORRELATED_DERIVED_TABLE.contains(ctx.dialect()) && isSimple(select) && !select.$distinct()) { + List> l = map(select.getSelect(), f -> Tools.unalias(f)); + acceptMultisetSubqueryForXMLEmulation(ctx, multisetCondition, (Select>) select .$select(asList(xmlelement( nResult(ctx), - xmlaggEmulation(ctx, row(map(select.getSelect(), f -> Tools.unalias(f))), true).orderBy(select.$orderBy()) + xmlaggEmulation(ctx, row(l), true) + .orderBy(multisetCondition + ? map(filter(l, f -> sortable(f)), f -> f.sortDefault()) + : select.$orderBy() + ) ))) .$orderBy(asList()) ); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index a8ef15884f..9f061eac66 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -7845,4 +7845,8 @@ final class Tools { throw new IllegalArgumentException("Unsupported quantifier: " + q); } } + + static final boolean sortable(Field f) { + return !f.getDataType().isBinary(); + } }