diff --git a/jOOQ/src/main/java/org/jooq/impl/Multiset.java b/jOOQ/src/main/java/org/jooq/impl/Multiset.java index fc50ea5b28..5d4198d166 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Multiset.java +++ b/jOOQ/src/main/java/org/jooq/impl/Multiset.java @@ -128,6 +128,8 @@ import org.jooq.Result; import org.jooq.SQLDialect; import org.jooq.Scope; import org.jooq.Select; +// ... +import org.jooq.SelectForStep; import org.jooq.SelectOrderByStep; import org.jooq.SortField; import org.jooq.Spatial; @@ -215,6 +217,9 @@ final class Multiset extends AbstractField> implemen + + + @@ -235,63 +240,8 @@ 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(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( - returningClob(ctx, returning), - returningClob(ctx, jsonArray()) - ))) - .$distinct(false) - .$orderBy(Arrays.asList()); - - visitSubquery(ctx, s); - } - else { - JSONArrayAggOrderByStep order; - JSONArrayAggReturningStep returning; - - returning = order = jsonArrayaggEmulation(ctx, t, true, false); - - // TODO: Re-apply derived table's ORDER BY clause as aggregate ORDER BY - if (multisetCondition) - returning = order.orderBy(t.fields()); - - Select> s = patchOracleArrayAggBug( - ctx, - select(DSL.coalesce( - returningClob(ctx, returning), - returningClob(ctx, jsonArray()) - )).from(t) - ); - - if (multisetCondition && NO_SUPPORT_JSON_COMPARE.contains(ctx.dialect())) - ctx.visit(DSL.field(s).cast(VARCHAR)); - else - visitSubquery(ctx, s); - } - + acceptDefaultJSONEmulation(ctx, multisetCondition, t, false); break; } } @@ -311,65 +261,9 @@ 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(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( - returningClob(ctx, returning), - returningClob(ctx, jsonbArray()) - ))) - .$distinct(false) - .$orderBy(Arrays.asList()); - - visitSubquery(ctx, s); - } - else { - JSONArrayAggOrderByStep order; - JSONArrayAggReturningStep returning; - - returning = order = jsonbArrayaggEmulation(ctx, t, false, false); - - // TODO: Re-apply derived table's ORDER BY clause as aggregate ORDER BY - if (multisetCondition) - returning = order.orderBy(t.fields()); - - Select> s = patchOracleArrayAggBug( - ctx, - select(DSL.coalesce( - returningClob(ctx, returning), - returningClob(ctx, jsonbArray()) - )).from(t) - ); - - if (multisetCondition && NO_SUPPORT_JSONB_COMPARE.contains(ctx.dialect())) - ctx.visit(DSL.field(s).cast(VARCHAR)); - else - visitSubquery(ctx, s); - } - + acceptDefaultJSONEmulation(ctx, multisetCondition, t, true); break; } } @@ -458,6 +352,85 @@ final class Multiset extends AbstractField> implemen break; } } + + private final void acceptDefaultJSONEmulation( + Context ctx, + boolean multisetCondition, + Table t, + boolean jsonb + ) { + if (NO_SUPPORT_CORRELATED_DERIVED_TABLE.contains(ctx.dialect()) && isSimple(select)) { + List> l = map(select.getSelect(), f -> Tools.unalias(f)); + + JSONArrayAggReturningStep returning = + (jsonb ? jsonbArrayaggEmulation(ctx, row(l), true, select.$distinct()) : 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( + returningClob(ctx, returning), + returningClob(ctx, (JSONArrayReturningStep) (jsonb ? jsonbArray() : jsonArray())) + ))) + .$distinct(false) + .$orderBy(Arrays.asList()); + + visitSubquery(ctx, s); + } + else { + JSONArrayAggOrderByStep order; + JSONArrayAggReturningStep returning; + + returning = order = jsonb ? jsonbArrayaggEmulation(ctx, t, true, false) : jsonArrayaggEmulation(ctx, t, true, false); + + // TODO: Re-apply derived table's ORDER BY clause as aggregate ORDER BY + if (multisetCondition) + returning = order.orderBy(t.fields()); + + Select> s = patchOracleArrayAggBug( + ctx, + select(DSL.coalesce( + returningClob(ctx, returning), + returningClob(ctx, (JSONArrayReturningStep) (jsonb ? jsonbArray() : jsonArray())) + )).from(t) + ); + + if (multisetCondition && (jsonb ? NO_SUPPORT_JSONB_COMPARE : NO_SUPPORT_JSON_COMPARE).contains(ctx.dialect())) + ctx.visit(DSL.field(s).cast(VARCHAR)); + else + visitSubquery(ctx, s); + } + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + private static final void acceptMultisetSubqueryForXMLEmulation(Context ctx, boolean multisetCondition, Select> s) { if (multisetCondition && NO_SUPPORT_XML_COMPARE.contains(ctx.dialect()))