From 3116f0e64a33451fd26e72e601cbaf3c540f6019 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 14 Mar 2023 19:37:47 +0100 Subject: [PATCH] [jOOQ/jOOQ#11485] Add support for Trino DB - WIP --- .../org/jooq/impl/AbstractAggregateFunction.java | 6 +++++- jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java | 10 +++++++++- .../main/java/org/jooq/impl/FieldMapForUpdate.java | 4 ++-- .../main/java/org/jooq/impl/FieldMapsForInsert.java | 3 ++- jOOQ/src/main/java/org/jooq/impl/JSONObject.java | 6 +++--- jOOQ/src/main/java/org/jooq/impl/ListAgg.java | 12 +++++++++++- jOOQ/src/main/java/org/jooq/impl/Multiset.java | 2 +- .../src/main/java/org/jooq/impl/SelectQueryImpl.java | 11 ++++++++++- 8 files changed, 43 insertions(+), 11 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java index 07f93619a0..9db8f13236 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java @@ -281,7 +281,7 @@ implements } final void acceptArguments2(Context ctx, QueryPartCollectionView> args) { - acceptArguments3(ctx, args, identity()); + acceptArguments3(ctx, args, f -> applyMap(ctx, f)); } final void acceptArguments3(Context ctx, QueryPartCollectionView> args, Function, ? extends Field> fun) { @@ -295,6 +295,10 @@ implements ctx.visit(wrap(args).map((arg, i) -> applyFilter(ctx, arg, i) ? DSL.when(filter, arg == ASTERISK ? one() : arg) : arg).map(fun)); } + Field applyMap(Context ctx, Field arg) { + return arg; + } + boolean applyFilter(Context ctx, Field arg, int i) { return true; } diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index ba3b8d5af9..a04ce2bbc4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -83,6 +83,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +import static org.jooq.SQLDialect.TRINO; // ... import static org.jooq.SQLDialect.YUGABYTEDB; import static org.jooq.conf.ParamType.INLINED; @@ -703,7 +704,7 @@ public class DefaultBinding implements Binding { */ abstract static class InternalBinding implements org.jooq.Binding { static final Set NEEDS_PRECISION_SCALE_ON_BIGDECIMAL = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB); - static final Set REQUIRES_JSON_CAST = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB); + static final Set REQUIRES_JSON_CAST = SQLDialect.supportedBy(POSTGRES, TRINO, YUGABYTEDB); static final Set NO_SUPPORT_ENUM_CAST = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB); static final Set NO_SUPPORT_NVARCHAR = SQLDialect.supportedBy(DERBY, FIREBIRD, POSTGRES, SQLITE, YUGABYTEDB); @@ -814,6 +815,13 @@ public class DefaultBinding implements Binding { } } + if (dataType.isUUID()) { + switch (ctx.family()) { + case TRINO: + return true; + } + } + diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java index ac24c7d923..0ac22f50c2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java @@ -64,6 +64,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +import static org.jooq.SQLDialect.TRINO; // ... import static org.jooq.SQLDialect.YUGABYTEDB; import static org.jooq.conf.WriteIfReadonly.IGNORE; @@ -111,7 +112,6 @@ import org.jooq.SQLDialect; import org.jooq.Select; import org.jooq.Table; import org.jooq.exception.DataTypeException; -import org.jooq.impl.QOM.UNotYetImplemented; /** * @author Lukas Eder @@ -121,7 +121,7 @@ extends AbstractQueryPartMap { - static final Set CASTS_NEEDED = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB); + static final Set CASTS_NEEDED = SQLDialect.supportedBy(POSTGRES, TRINO, YUGABYTEDB); static final Set NO_SUPPORT_QUALIFY = SQLDialect.supportedBy(POSTGRES, SQLITE, YUGABYTEDB); static final Set EMULATE_RVE_SET_QUERY = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java index 8e59c34b0f..a476d7da66 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java @@ -46,6 +46,7 @@ import static org.jooq.Clause.INSERT_VALUES; // ... import static org.jooq.SQLDialect.POSTGRES; // ... +import static org.jooq.SQLDialect.TRINO; import static org.jooq.SQLDialect.YUGABYTEDB; import static org.jooq.conf.WriteIfReadonly.IGNORE; import static org.jooq.conf.WriteIfReadonly.THROW; @@ -103,7 +104,7 @@ import org.jooq.impl.Tools.BooleanDataKey; * @author Lukas Eder */ final class FieldMapsForInsert extends AbstractQueryPart implements UNotYetImplemented { - static final Set CASTS_NEEDED = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB); + static final Set CASTS_NEEDED = SQLDialect.supportedBy(POSTGRES, TRINO, YUGABYTEDB); final Table table; final Map, Field> empty; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java index a258296882..a33e580e5b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java @@ -268,10 +268,10 @@ implements } } - static final Field absentOnNullIf( + static final Field absentOnNullIf( BooleanSupplier test, - Function, Field> e, - Field array + Function, Field> e, + Field array ) { if (test.getAsBoolean()) return function(N_FILTER, array.getDataType(), diff --git a/jOOQ/src/main/java/org/jooq/impl/ListAgg.java b/jOOQ/src/main/java/org/jooq/impl/ListAgg.java index ce513bb39f..020582b669 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ListAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/ListAgg.java @@ -166,7 +166,17 @@ final class ListAgg extends AbstractAggregateFunction implements UNotYet } @Override - boolean applyFilter(Context ctx, Field arg, int i) { + final Field applyMap(Context ctx, Field arg) { + switch (ctx.family()) { + case TRINO: + return arg.getDataType().isString() ? arg : arg.cast(VARCHAR); + default: + return arg; + } + } + + @Override + final boolean applyFilter(Context ctx, Field arg, int i) { return i == 0; } diff --git a/jOOQ/src/main/java/org/jooq/impl/Multiset.java b/jOOQ/src/main/java/org/jooq/impl/Multiset.java index 587a2da93b..07f7a4c84c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Multiset.java +++ b/jOOQ/src/main/java/org/jooq/impl/Multiset.java @@ -129,7 +129,7 @@ final class Multiset extends AbstractField> implemen static final Set NO_SUPPORT_JSON_COMPARE = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB); static final Set NO_SUPPORT_JSONB_COMPARE = SQLDialect.supportedBy(); static final Set NO_SUPPORT_XML_COMPARE = SQLDialect.supportedBy(POSTGRES); - static final Set FORCE_LIMIT_IN_DERIVED_TABLE = SQLDialect.supportedBy(MARIADB, MYSQL); + static final Set FORCE_LIMIT_IN_DERIVED_TABLE = SQLDialect.supportedBy(MARIADB, MYSQL, TRINO); final TableLike table; final Select select; diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index cc98c65b51..7d99cc3bc8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -3261,7 +3261,16 @@ final class SelectQueryImpl extends AbstractResultQuery imp // [#13509] Force a LIMIT clause to prevent optimisation of "unnecessary" ORDER BY else if (!actualOrderBy.isEmpty() && TRUE.equals(ctx.data(DATA_FORCE_LIMIT_WITH_ORDER_BY))) { Limit l = new Limit(); - l.setLimit(Long.MAX_VALUE); + + switch (ctx.family()) { + case TRINO: + l.setLimit(Integer.MAX_VALUE); + break; + default: + l.setLimit(Long.MAX_VALUE); + break; + } + ctx.visit(l); } }