[jOOQ/jOOQ#10060] Fix emulation of JSON_ARRAYAGG (<string>)

This commit is contained in:
Lukas Eder 2020-10-12 14:01:26 +02:00
parent f695c41a0f
commit d306146b6b
2 changed files with 24 additions and 3 deletions

View File

@ -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<J> {
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<J> {
}
}
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) {

View File

@ -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");