From 8046610b2fabaec2f52dfedd135928a923d30cac Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 19 Jan 2023 09:13:39 +0100 Subject: [PATCH] [jOOQ/jOOQ#14046] Better emulation for PostgreSQL 12+ and YugabyteDB --- jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java | 10 ++++++++-- jOOQ/src/main/java/org/jooq/impl/Names.java | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java b/jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java index 503d633514..f1e61496e3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java @@ -72,6 +72,8 @@ implements QOM.JSONBKeys { + static final Set NO_SUPPORT_PATH_QUERY = SQLDialect.supportedUntil(); + final Field field; JSONBKeys( @@ -101,9 +103,13 @@ implements case POSTGRES: - case YUGABYTEDB: - ctx.visit(DSL.field(select(DSL.coalesce(jsonbArrayAgg(DSL.field(unquotedName("j"))), jsonbArray())).from("jsonb_object_keys({0}) as j(j)", field))); + case YUGABYTEDB: { + if (NO_SUPPORT_PATH_QUERY.contains(ctx.dialect())) + ctx.visit(DSL.field(select(DSL.coalesce(jsonArrayAgg(DSL.field(unquotedName("j"))), jsonArray())).from("json_object_keys({0}) as j(j)", field))); + else + ctx.visit(function(N_JSONB_PATH_QUERY_ARRAY, getDataType(), field, inline("$.keyvalue().key"))); break; + } diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index 08229a7a32..c5f711d5cb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -176,6 +176,7 @@ final class Names { static final Name N_JSONB_BUILD_ARRAY = systemName("jsonb_build_array"); static final Name N_JSONB_OBJECT_AGG = systemName("jsonb_object_agg"); static final Name N_JSONB_PATH_EXISTS = systemName("jsonb_path_exists"); + static final Name N_JSONB_PATH_QUERY_ARRAY = systemName("jsonb_path_query_array"); static final Name N_JSONB_PATH_QUERY_FIRST = systemName("jsonb_path_query_first"); static final Name N_JSONPATH = systemName("jsonpath"); static final Name N_JSON_AGG = systemName("json_agg");