From e35656ec035cf94cb21cd92b8e529fd9e748d2e7 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 27 Jun 2024 13:45:08 +0200 Subject: [PATCH] [jOOQ/jOOQ#16878] Wrong cast syntax used for BigQuery ARRAY types --- .../src/main/java/org/jooq/impl/ArrayDataType.java | 5 +++++ .../main/java/org/jooq/impl/DefaultDataType.java | 11 +++++++++++ jOOQ/src/main/java/org/jooq/impl/ParserImpl.java | 14 ++++++++++---- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java b/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java index 050c7050b4..eadbe06ee8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java @@ -192,6 +192,11 @@ final class ArrayDataType extends DefaultDataType { switch (configuration.family()) { + + + + + case DUCKDB: case POSTGRES: case YUGABYTEDB: diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java index ebef7d0803..db8840f5fc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java @@ -39,6 +39,7 @@ package org.jooq.impl; import static java.util.Collections.unmodifiableCollection; // ... +// ... import static org.jooq.SQLDialect.CLICKHOUSE; // ... import static org.jooq.SQLDialect.DUCKDB; @@ -113,6 +114,7 @@ import org.jooq.Field; import org.jooq.Generator; import org.jooq.Name; import org.jooq.Nullability; +// ... import org.jooq.QualifiedRecord; import org.jooq.QueryPart; import org.jooq.SQLDialect; @@ -150,6 +152,10 @@ public class DefaultDataType extends AbstractDataTypeX { private static final Set SUPPORT_HSQLDB_ARRAY_NOTATION = SQLDialect.supportedBy(H2, HSQLDB, POSTGRES, YUGABYTEDB); private static final Set SUPPORT_TRINO_ARRAY_NOTATION = SQLDialect.supportedBy(CLICKHOUSE, TRINO); + + + + /** * A pattern for data type name normalisation. */ @@ -736,6 +742,11 @@ public class DefaultDataType extends AbstractDataTypeX { else if (arrayCheck && SUPPORT_TRINO_ARRAY_NOTATION.contains(dialect) && upper.startsWith("ARRAY(")) result = getDataType(dialect, typeName.substring(6, typeName.length() - 1)).getArrayDataType(); + + + + + // [#366] Don't log a warning here. The warning is logged when // catching the exception in jOOQ-codegen if (result == null) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 1735ceb96d..2849ea8a31 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -7363,7 +7363,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { // Work around a missing feature in unnest() if (!f.getType().isArray()) - f = f.coerce(f.getDataType().getArrayDataType()); + f = f.coerce(f.getDataType().array()); result = unnest(f); } @@ -13482,7 +13482,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } if (array) - result = result.getArrayDataType(); + result = result.array(); } while (array); } @@ -13498,8 +13498,14 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { switch (character) { case 'A': - if (parseKeywordOrIdentifierIf("ARRAY")) - return OTHER.getArrayDataType(); + if (parseKeywordOrIdentifierIf("ARRAY")) { + if (peek('(')) + return parseParenthesised(c -> parseDataTypeIf(parseUnknownTypes).array()); + else if (peek('<')) + return parseParenthesised('<', c -> parseDataTypeIf(parseUnknownTypes).array(), '>'); + else + return OTHER.array(); + } else if (parseKeywordIf("AUTO_INCREMENT")) { parseDataTypeIdentityArgsIf(); return INTEGER.identity(true);