From fe4a29bd744644cc4faaea276fc88bc564f42012 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 14 Apr 2020 14:39:55 +0200 Subject: [PATCH] [jOOQ/jOOQ#10060] Emulate JSON_ARRAYAGG() in older MariaDB versions --- .../org/jooq/JSONArrayAggOrderByStep.java | 5 ++-- jOOQ/src/main/java/org/jooq/impl/DSL.java | 1 + .../main/java/org/jooq/impl/JSONArrayAgg.java | 29 +++++++++++++++---- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/JSONArrayAggOrderByStep.java b/jOOQ/src/main/java/org/jooq/JSONArrayAggOrderByStep.java index cbe07efd19..a5d88d22a3 100644 --- a/jOOQ/src/main/java/org/jooq/JSONArrayAggOrderByStep.java +++ b/jOOQ/src/main/java/org/jooq/JSONArrayAggOrderByStep.java @@ -40,6 +40,7 @@ package org.jooq; // ... // ... import static org.jooq.SQLDialect.H2; +import static org.jooq.SQLDialect.MARIADB; // ... import static org.jooq.SQLDialect.POSTGRES; @@ -59,12 +60,12 @@ public interface JSONArrayAggOrderByStep extends JSONArrayAggNullStep { /** * Add an ORDER BY clause to the function. */ - @Support({ H2, POSTGRES }) + @Support({ H2, MARIADB, POSTGRES }) JSONArrayAggNullStep orderBy(OrderField... fields); /** * Add an ORDER BY clause to the function. */ - @Support({ H2, POSTGRES }) + @Support({ H2, MARIADB, POSTGRES }) JSONArrayAggNullStep orderBy(Collection> fields); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 3cca7161f5..d434544849 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -60,6 +60,7 @@ import static org.jooq.SQLDialect.MARIADB; // ... // ... // ... +// ... import static org.jooq.SQLDialect.MYSQL; // ... // ... diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java b/jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java index 5dd57a2fdf..d3392dc925 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java @@ -37,6 +37,8 @@ */ package org.jooq.impl; +import static org.jooq.impl.DSL.groupConcat; +import static org.jooq.impl.DSL.inline; import static org.jooq.impl.JSONNullClause.ABSENT_ON_NULL; import static org.jooq.impl.JSONNullClause.NULL_ON_NULL; import static org.jooq.impl.JSONObject.acceptJSONNullClause; @@ -77,6 +79,19 @@ implements JSONArrayAggOrderByStep { @Override public void accept(Context ctx) { switch (ctx.family()) { + case MARIADB: + case MYSQL: + + // Workaround for https://jira.mariadb.org/browse/MDEV-21914 + if (!Tools.isEmpty(withinGroupOrderBy)) + ctx.visit(DSL.concat(inline('['), groupConcat(arguments.get(0)).orderBy(withinGroupOrderBy), inline(']'))); + + // Workaround for https://jira.mariadb.org/browse/MDEV-21912 + else + ctx.visit(DSL.concat(inline('['), groupConcat(arguments.get(0)), inline(']'))); + + break; + @@ -95,15 +110,19 @@ implements JSONArrayAggOrderByStep { break; default: - ctx.visit(N_JSON_ARRAYAGG).sql('('); - ctx.visit(arguments.get(0)); - acceptOrderBy(ctx); - acceptJSONNullClause(ctx, nullClause); - ctx.sql(')'); + acceptStandard(ctx); break; } } + private final void acceptStandard(Context ctx) { + ctx.visit(N_JSON_ARRAYAGG).sql('('); + ctx.visit(arguments.get(0)); + acceptOrderBy(ctx); + acceptJSONNullClause(ctx, nullClause); + ctx.sql(')'); + } + @Override public final JSONArrayAgg nullOnNull() { nullClause = NULL_ON_NULL;