From d306146b6b22f1974a8083a29a285ea68e23c178 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 12 Oct 2020 14:01:26 +0200 Subject: [PATCH] [jOOQ/jOOQ#10060] Fix emulation of JSON_ARRAYAGG () --- .../main/java/org/jooq/impl/JSONArrayAgg.java | 26 ++++++++++++++++--- jOOQ/src/main/java/org/jooq/impl/Names.java | 1 + 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java b/jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java index 8a1aa3c0ee..ba86745552 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java @@ -40,6 +40,7 @@ package org.jooq.impl; // ... import static org.jooq.SQLDialect.MARIADB; import static org.jooq.SQLDialect.MYSQL; +import static org.jooq.impl.DSL.function; import static org.jooq.impl.DSL.groupConcat; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.JSONNull.JSONNullType.ABSENT_ON_NULL; @@ -48,6 +49,7 @@ import static org.jooq.impl.Names.N_JSONB_AGG; import static org.jooq.impl.Names.N_JSON_AGG; import static org.jooq.impl.Names.N_JSON_ARRAYAGG; import static org.jooq.impl.Names.N_JSON_MERGE; +import static org.jooq.impl.Names.N_JSON_QUOTE; import static org.jooq.impl.SQLDataType.JSON; import static org.jooq.impl.SQLDataType.VARCHAR; @@ -91,7 +93,7 @@ implements JSONArrayAggOrderByStep { case MYSQL: { // Workaround for https://jira.mariadb.org/browse/MDEV-21912, // https://jira.mariadb.org/browse/MDEV-21914, and other issues - ctx.visit(N_JSON_MERGE).sql('(').visit(inline("[]")).sql(", ").visit(groupConcatEmulation()).sql(')'); + ctx.visit(N_JSON_MERGE).sql('(').visit(inline("[]")).sql(", ").visit(groupConcatEmulation(ctx)).sql(')'); break; } @@ -125,8 +127,26 @@ implements JSONArrayAggOrderByStep { } } - private final Field groupConcatEmulation() { - return DSL.concat(inline('['), groupConcatEmulationWithoutArrayWrappers(arguments.get(0), withinGroupOrderBy), inline(']')); + @SuppressWarnings("unchecked") + private final Field groupConcatEmulation(Context ctx) { + Field arg = arguments.get(0); + + if (arg.getDataType().isString()) { + switch (ctx.family()) { + case MARIADB: + case MYSQL: + arg = function(N_JSON_QUOTE, getDataType(), arg); + break; + + + + + + + } + } + + return DSL.concat(inline('['), groupConcatEmulationWithoutArrayWrappers(arg, withinGroupOrderBy), inline(']')); } static final Field groupConcatEmulationWithoutArrayWrappers(Field field, SortFieldList orderBy) { diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index fd1f6916e7..3b064dbc88 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -138,6 +138,7 @@ final class Names { static final Name N_JSON_OBJECT = unquotedName("json_object"); static final Name N_JSON_OBJECT_AGG = unquotedName("json_object_agg"); static final Name N_JSON_OBJECTAGG = unquotedName("json_objectagg"); + static final Name N_JSON_QUOTE = unquotedName("json_quote"); static final Name N_JSON_TABLE = unquotedName("json_table"); static final Name N_JSON_VALUE = unquotedName("json_value"); static final Name N_JSONB_AGG = unquotedName("jsonb_agg");