[jOOQ/jOOQ#11485] Add support for Trino DB - WIP

This commit is contained in:
Lukas Eder 2023-03-14 19:37:47 +01:00
parent 73df9474ef
commit 3116f0e64a
8 changed files with 43 additions and 11 deletions

View File

@ -281,7 +281,7 @@ implements
}
final void acceptArguments2(Context<?> ctx, QueryPartCollectionView<Field<?>> args) {
acceptArguments3(ctx, args, identity());
acceptArguments3(ctx, args, f -> applyMap(ctx, f));
}
final void acceptArguments3(Context<?> ctx, QueryPartCollectionView<Field<?>> args, Function<? super Field<?>, ? 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;
}

View File

@ -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<T, U> implements Binding<T, U> {
*/
abstract static class InternalBinding<T, U> implements org.jooq.Binding<T, U> {
static final Set<SQLDialect> NEEDS_PRECISION_SCALE_ON_BIGDECIMAL = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB);
static final Set<SQLDialect> REQUIRES_JSON_CAST = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> REQUIRES_JSON_CAST = SQLDialect.supportedBy(POSTGRES, TRINO, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_ENUM_CAST = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_NVARCHAR = SQLDialect.supportedBy(DERBY, FIREBIRD, POSTGRES, SQLITE, YUGABYTEDB);
@ -814,6 +815,13 @@ public class DefaultBinding<T, U> implements Binding<T, U> {
}
}
if (dataType.isUUID()) {
switch (ctx.family()) {
case TRINO:
return true;
}
}

View File

@ -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<FieldOrRow, FieldOrRowOrSelect>
{
static final Set<SQLDialect> CASTS_NEEDED = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> CASTS_NEEDED = SQLDialect.supportedBy(POSTGRES, TRINO, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_QUALIFY = SQLDialect.supportedBy(POSTGRES, SQLITE, YUGABYTEDB);
static final Set<SQLDialect> EMULATE_RVE_SET_QUERY = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, IGNITE, MARIADB, MYSQL, SQLITE);

View File

@ -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<SQLDialect> CASTS_NEEDED = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> CASTS_NEEDED = SQLDialect.supportedBy(POSTGRES, TRINO, YUGABYTEDB);
final Table<?> table;
final Map<Field<?>, Field<?>> empty;

View File

@ -268,10 +268,10 @@ implements
}
}
static final <T> Field<T[]> absentOnNullIf(
static final Field<?> absentOnNullIf(
BooleanSupplier test,
Function<Field<T[]>, Field<T[]>> e,
Field<T[]> array
Function<Field<?>, Field<?>> e,
Field<?> array
) {
if (test.getAsBoolean())
return function(N_FILTER, array.getDataType(),

View File

@ -166,7 +166,17 @@ final class ListAgg extends AbstractAggregateFunction<String> 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;
}

View File

@ -129,7 +129,7 @@ final class Multiset<R extends Record> extends AbstractField<Result<R>> implemen
static final Set<SQLDialect> NO_SUPPORT_JSON_COMPARE = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_JSONB_COMPARE = SQLDialect.supportedBy();
static final Set<SQLDialect> NO_SUPPORT_XML_COMPARE = SQLDialect.supportedBy(POSTGRES);
static final Set<SQLDialect> FORCE_LIMIT_IN_DERIVED_TABLE = SQLDialect.supportedBy(MARIADB, MYSQL);
static final Set<SQLDialect> FORCE_LIMIT_IN_DERIVED_TABLE = SQLDialect.supportedBy(MARIADB, MYSQL, TRINO);
final TableLike<R> table;
final Select<R> select;

View File

@ -3261,7 +3261,16 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> 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);
}
}