From e8175b939284e82fb71e8f31fbafddca24ebf958 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 16 Dec 2022 16:26:21 +0100 Subject: [PATCH] [jOOQ/jOOQ#14416] Support UNNEST(ARRAY[...]) in dialects that do not otherwise support arrays --- jOOQ/src/main/java/org/jooq/impl/Array.java | 2 +- .../main/java/org/jooq/impl/ArrayTable.java | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Array.java b/jOOQ/src/main/java/org/jooq/impl/Array.java index 227e1f7b5f..a4dcea969a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Array.java +++ b/jOOQ/src/main/java/org/jooq/impl/Array.java @@ -67,7 +67,7 @@ final class Array extends AbstractField implements QOM.Array { private static final Set REQUIRES_CAST = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB); - private final FieldsImpl fields; + final FieldsImpl fields; Array(Collection> fields) { super(N_ARRAY, type(fields)); diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayTable.java b/jOOQ/src/main/java/org/jooq/impl/ArrayTable.java index 480343756f..28d730d7d4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayTable.java @@ -177,6 +177,8 @@ implements } private final QueryPart table(Configuration configuration) { + boolean isArray = array.getDataType().getType().isArray(); + switch (configuration.family()) { @@ -187,6 +189,8 @@ implements + + // Most dialects can simulate unnested arrays using UNION ALL @@ -211,8 +215,12 @@ implements case MARIADB: case MYSQL: case SQLITE: - if (array.getDataType().getType().isArray() && array instanceof Param) - return emulate(); + if (isArray && array instanceof Param) + return emulateParam(); + + // [#14416] While Array isn't supported everywhere, Unnest(Array) is + else if (isArray && array instanceof Array) + return emulateArray(); @@ -283,7 +291,12 @@ implements } @SuppressWarnings("unchecked") - private final QueryPart emulate() { + private final QueryPart emulateParam() { return new ArrayTableEmulation(((Param) array).getValue(), fieldAliases); } + + @SuppressWarnings("unchecked") + private final QueryPart emulateArray() { + return new ArrayTableEmulation(((Array) array).fields.fields, fieldAliases); + } }