From d46ba60b9367bc40d0301e85ed89b58f1364ce7e Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 23 Feb 2021 17:13:04 +0100 Subject: [PATCH] [jOOQ/jOOQ#11481] Stop using the deprecated JSON_MERGE function in MariaDB 10.4+ and MySQL 8.0.19+ --- jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java | 13 +++++++------ jOOQ/src/main/java/org/jooq/impl/JSONObject.java | 5 +++-- jOOQ/src/main/java/org/jooq/impl/Names.java | 1 + 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java b/jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java index f84fe21b89..adbb3bb3fa 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONArrayAgg.java @@ -39,7 +39,9 @@ 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; @@ -52,6 +54,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_MERGE_PRESERVE; import static org.jooq.impl.Names.N_JSON_QUOTE; import static org.jooq.impl.SQLDataType.JSON; import static org.jooq.impl.SQLDataType.VARCHAR; @@ -59,7 +62,6 @@ import static org.jooq.impl.SQLDataType.VARCHAR; import java.util.Collection; import java.util.Set; -import org.jooq.AggregateFilterStep; import org.jooq.Context; import org.jooq.DataType; import org.jooq.Field; @@ -67,8 +69,6 @@ import org.jooq.JSONArrayAggOrderByStep; import org.jooq.OrderField; import org.jooq.SQLDialect; -import org.jetbrains.annotations.NotNull; - /** * The JSON array constructor. @@ -82,8 +82,9 @@ implements JSONArrayAggOrderByStep { /** * Generated UID */ - private static final long serialVersionUID = 1772007627336725780L; - static final Set EMULATE_WITH_GROUP_CONCAT = SQLDialect.supportedBy(MARIADB, MYSQL); + private static final long serialVersionUID = 1772007627336725780L; + static final Set EMULATE_WITH_GROUP_CONCAT = SQLDialect.supportedBy(MARIADB, MYSQL); + static final Set SUPPORT_JSON_MERGE_PRESERVE = SQLDialect.supportedBy(MARIADB, MYSQL); private JSONOnNull onNull; private DataType returning; @@ -99,7 +100,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(ctx)).sql(')'); + ctx.visit(SUPPORT_JSON_MERGE_PRESERVE.contains(ctx.dialect()) ? N_JSON_MERGE_PRESERVE : N_JSON_MERGE).sql('(').visit(inline("[]")).sql(", ").visit(groupConcatEmulation(ctx)).sql(')'); break; } diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java index f7d34d2f1b..0852047ea1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java @@ -189,10 +189,11 @@ implements case MARIADB: { JSONEntry first; + Name name = JSONArrayAgg.SUPPORT_JSON_MERGE_PRESERVE.contains(ctx.dialect()) ? N_JSON_MERGE_PRESERVE : N_JSON_MERGE; // Workaround for https://jira.mariadb.org/browse/MDEV-13701 if (entries.size() > 1) { - ctx.visit(N_JSON_MERGE).sql('(').visit(inline("{}")) + ctx.visit(name).sql('(').visit(inline("{}")) .formatIndentStart(); for (JSONEntry entry : entries) @@ -204,7 +205,7 @@ implements } else if (!entries.isEmpty() && isJSONArray((first = entries.iterator().next()).value())) { ctx.visit(jsonObject( - key(first.key()).value(DSL.field("{0}({1}, {2})", getDataType(), N_JSON_MERGE, inline("[]"), first.value())) + key(first.key()).value(DSL.field("{0}({1}, {2})", getDataType(), name, inline("[]"), first.value())) )); } else diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index 1a31e05a77..8ff544b09a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -161,6 +161,7 @@ final class Names { static final Name N_JSON_CONTAINS_PATH = unquotedName("json_contains_path"); static final Name N_JSON_EXTRACT = unquotedName("json_extract"); static final Name N_JSON_MERGE = unquotedName("json_merge"); + static final Name N_JSON_MERGE_PRESERVE = unquotedName("json_merge_preserve"); 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");