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); + } }