[jOOQ/jOOQ#7539] Support for SQLDialect.CLICKHOUSE - WIP

This commit is contained in:
Lukas Eder 2024-03-14 16:29:41 +01:00
parent 37a61f9cf4
commit 7e22b9818e
27 changed files with 131 additions and 104 deletions

View File

@ -117,7 +117,7 @@ public interface AlterTableStep {
* @see DSLContext#commentOnTable(Table)
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, TRINO, YUGABYTEDB })
AlterTableFinalStep comment(String comment);
/**
@ -127,7 +127,7 @@ public interface AlterTableStep {
* @see DSLContext#commentOnTable(Table)
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, TRINO, YUGABYTEDB })
AlterTableFinalStep comment(Comment comment);
/**

View File

@ -73,35 +73,35 @@ public interface AlterViewStep {
/**
* Add the <code>COMMENT</code> clause to the <code>ALTER VIEW</code> statement.
*/
@Support({ FIREBIRD, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, DUCKDB, FIREBIRD, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB })
@NotNull @CheckReturnValue
AlterViewFinalStep comment(@Stringly.Comment String comment);
/**
* Add the <code>COMMENT</code> clause to the <code>ALTER VIEW</code> statement.
*/
@Support({ FIREBIRD, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, DUCKDB, FIREBIRD, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB })
@NotNull @CheckReturnValue
AlterViewFinalStep comment(Comment comment);
/**
* Add the <code>RENAME TO</code> clause to the <code>ALTER VIEW</code> statement.
*/
@Support({ DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB })
@NotNull @CheckReturnValue
AlterViewFinalStep renameTo(@Stringly.Name String renameTo);
/**
* Add the <code>RENAME TO</code> clause to the <code>ALTER VIEW</code> statement.
*/
@Support({ DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB })
@NotNull @CheckReturnValue
AlterViewFinalStep renameTo(Name renameTo);
/**
* Add the <code>RENAME TO</code> clause to the <code>ALTER VIEW</code> statement.
*/
@Support({ DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB })
@NotNull @CheckReturnValue
AlterViewFinalStep renameTo(Table<?> renameTo);

View File

@ -73,14 +73,14 @@ public interface CreateTableCommentStep extends CreateTableStorageStep {
/**
* Add the <code>COMMENT</code> clause to the <code>CREATE TABLE</code> statement.
*/
@Support({ FIREBIRD, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
@Support({ CLICKHOUSE, FIREBIRD, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
@NotNull @CheckReturnValue
CreateTableStorageStep comment(@Stringly.Comment String comment);
/**
* Add the <code>COMMENT</code> clause to the <code>CREATE TABLE</code> statement.
*/
@Support({ FIREBIRD, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
@Support({ CLICKHOUSE, FIREBIRD, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
@NotNull @CheckReturnValue
CreateTableStorageStep comment(Comment comment);
}

View File

@ -9708,7 +9708,7 @@ public interface DSLContext extends Scope {
* @see DSL#alterView(Table, Field...)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, TRINO, YUGABYTEDB })
AlterViewStep alterView(Table<?> view, Field<?>... fields);
/**
@ -9717,7 +9717,7 @@ public interface DSLContext extends Scope {
* @see DSL#alterView(Table, Collection)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, TRINO, YUGABYTEDB })
AlterViewStep alterView(Table<?> view, Collection<? extends Field<?>> fields);
/**

View File

@ -300,7 +300,7 @@ extends
* as {@link DSLContext#createTable(Table)}.
*/
@NotNull
@Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
@Support({ CLICKHOUSE, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
Field<T> comment(String comment);
/**
@ -308,7 +308,7 @@ extends
* as {@link DSLContext#createTable(Table)}.
*/
@NotNull
@Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
@Support({ CLICKHOUSE, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
Field<T> comment(Comment comment);
// ------------------------------------------------------------------------

View File

@ -38,6 +38,7 @@
package org.jooq;
// ...
import static org.jooq.SQLDialect.CLICKHOUSE;
// ...
import static org.jooq.SQLDialect.CUBRID;
// ...
@ -136,7 +137,7 @@ public interface SelectDistinctOnStep<R extends Record> extends SelectIntoStep<R
* it is added explicitly via the jOOQ API.
*/
@NotNull @CheckReturnValue
@Support({ CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
SelectIntoStep<R> on(SelectFieldOrAsterisk... fields);
/**
@ -147,7 +148,7 @@ public interface SelectDistinctOnStep<R extends Record> extends SelectIntoStep<R
* it is added explicitly via the jOOQ API.
*/
@NotNull @CheckReturnValue
@Support({ CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
SelectIntoStep<R> on(Collection<? extends SelectFieldOrAsterisk> fields);
/**
@ -155,7 +156,7 @@ public interface SelectDistinctOnStep<R extends Record> extends SelectIntoStep<R
* <code>SELECT DISTINCT ON ()</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
SelectIntoStep<R> distinctOn(SelectFieldOrAsterisk... fields);
/**
@ -163,6 +164,6 @@ public interface SelectDistinctOnStep<R extends Record> extends SelectIntoStep<R
* <code>SELECT DISTINCT ON ()</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
SelectIntoStep<R> distinctOn(Collection<? extends SelectFieldOrAsterisk> fields);
}

View File

@ -130,7 +130,7 @@ public interface SelectQuery<R extends Record> extends Select<R>, ConditionProvi
* <p>
* This also sets the <code>distinct</code> flag to <code>true</code>
*/
@Support({ CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
void addDistinctOn(SelectFieldOrAsterisk... fields);
/**
@ -138,7 +138,7 @@ public interface SelectQuery<R extends Record> extends Select<R>, ConditionProvi
* <p>
* This also sets the <code>distinct</code> flag to <code>true</code>
*/
@Support({ CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
void addDistinctOn(Collection<? extends SelectFieldOrAsterisk> fields);
/**

View File

@ -183,7 +183,7 @@ implements
private static final Clause[] CLAUSES = { Clause.ALTER_VIEW };
private static final Set<SQLDialect> NO_SUPPORT_RENAME_IF_EXISTS = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD);
private static final Set<SQLDialect> NO_SUPPORT_IF_EXISTS = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD);
private static final Set<SQLDialect> SUPPORT_ALTER_TABLE_RENAME = SQLDialect.supportedBy(HSQLDB, YUGABYTEDB);
private static final Set<SQLDialect> SUPPORT_ALTER_TABLE_RENAME = SQLDialect.supportedBy(CLICKHOUSE, HSQLDB, YUGABYTEDB);
private final boolean supportsIfExists(Context<?> ctx) {
if (renameTo != null)
@ -263,6 +263,7 @@ implements
return;
}
if (renameTo != null) {
@ -280,7 +281,11 @@ implements
if (SUPPORT_ALTER_TABLE_RENAME.contains(ctx.dialect())) {
ctx.visit((ifExists ? alterTableIfExists(view) : alterTable(view)).renameTo(renameTo));
return;
}
}
accept1(ctx);
}
@ -337,12 +342,10 @@ implements
ctx.start(Clause.ALTER_VIEW_VIEW)
.visit(K_ALTER).sql(' ');
if (SUPPORT_ALTER_TABLE_RENAME.contains(ctx.dialect()))
ctx.visit(K_TABLE).sql(' ');
else if (materialized)
ctx.visit(K_MATERIALIZED).sql(' ').visit(K_VIEW).sql(' ');
if (materialized)
ctx.visit(K_MATERIALIZED).sql(' ').visit(K_VIEW);
else
ctx.visit(K_VIEW).sql(' ');
ctx.visit(K_VIEW);
if (ifExists && supportsIfExists(ctx))
ctx.sql(' ').visit(K_IF_EXISTS);

View File

@ -39,6 +39,8 @@ package org.jooq.impl;
import static java.util.Arrays.asList;
// ...
import static org.jooq.SQLDialect.CLICKHOUSE;
// ...
// ...
import static org.jooq.SQLDialect.POSTGRES;
import static org.jooq.SQLDialect.YUGABYTEDB;
@ -66,9 +68,10 @@ import org.jooq.impl.QOM.UnmodifiableList;
*/
final class Array<T> extends AbstractField<T[]> implements QOM.Array<T> {
private static final Set<SQLDialect> REQUIRES_CAST = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> REQUIRES_CAST = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_SQUARE_BRACKETS = SQLDialect.supportedBy(CLICKHOUSE);
final FieldsImpl<Record> fields;
final FieldsImpl<Record> fields;
Array(Collection<? extends Field<T>> fields) {
super(N_ARRAY, type(fields));
@ -96,16 +99,10 @@ final class Array<T> extends AbstractField<T[]> implements QOM.Array<T> {
default:
renderCastIf(ctx,
c -> {
switch (ctx.family()) {
case CLICKHOUSE:
ctx.visit(K_ARRAY).sql('(').visit(fields).sql(')');
break;
default:
ctx.visit(K_ARRAY).sql('[').visit(fields).sql(']');
break;
}
if (NO_SUPPORT_SQUARE_BRACKETS.contains(ctx.dialect()))
ctx.visit(K_ARRAY).sql('(').visit(fields).sql(')');
else
ctx.visit(K_ARRAY).sql('[').visit(fields).sql(']');
},
c -> {
DataType<?> type = (DataType<?>) c.data(DATA_EMPTY_ARRAY_BASE_TYPE);

View File

@ -37,10 +37,17 @@
*/
package org.jooq.impl;
import static org.jooq.SQLDialect.CLICKHOUSE;
// ...
import static org.jooq.impl.DSL.inline;
import static org.jooq.impl.Keywords.K_AS;
import static org.jooq.impl.Keywords.*;
import static org.jooq.impl.Keywords.K_CAST;
import static org.jooq.impl.Keywords.K_CONVERSION;
import static org.jooq.impl.Keywords.K_DEFAULT;
import static org.jooq.impl.Keywords.K_ERROR;
import static org.jooq.impl.Keywords.K_NULL;
import static org.jooq.impl.Keywords.K_ON;
import static org.jooq.impl.Keywords.K_TRIM;
import static org.jooq.impl.Names.N_CAST;
import static org.jooq.impl.Names.N_SAFE_CAST;
import static org.jooq.impl.Names.N_TO_CLOB;
@ -48,6 +55,7 @@ import static org.jooq.impl.Names.N_TO_DATE;
import static org.jooq.impl.Names.N_TO_TIMESTAMP;
import static org.jooq.impl.Names.N_TRY_CAST;
import static org.jooq.impl.Names.N_XMLTYPE;
import static org.jooq.impl.Names.N_accurateCastOrNull;
import static org.jooq.impl.SQLDataType.BOOLEAN;
import static org.jooq.impl.SQLDataType.CHAR;
import static org.jooq.impl.SQLDataType.DECIMAL;
@ -387,6 +395,10 @@ final class Cast<T> extends AbstractField<T> implements QOM.Cast<T> {
case CLICKHOUSE:
ctx.visit(N_accurateCastOrNull);
break;
default:
ctx.visit(N_TRY_CAST);
break;
@ -397,7 +409,12 @@ final class Cast<T> extends AbstractField<T> implements QOM.Cast<T> {
ctx.sql('(').castMode(CastMode.NEVER);
expression.accept(ctx);
ctx.castMode(castMode).sql(' ').visit(K_AS).sql(' ');
ctx.castMode(castMode);
if (tryCast && ctx.family() == CLICKHOUSE)
ctx.sql(", '").stringLiteral(true);
else
ctx.sql(' ').visit(K_AS).sql(' ');
switch (ctx.family()) {
case CLICKHOUSE:
@ -411,6 +428,9 @@ final class Cast<T> extends AbstractField<T> implements QOM.Cast<T> {
break;
}
if (tryCast)
if (ctx.family() == CLICKHOUSE)
ctx.stringLiteral(false).sql('\'');

View File

@ -688,7 +688,7 @@ final class Convert {
return from(((Optional) from).orElse(null), scope);
// Regular checks
else if (fromClass == byte[].class) {
else if (fromClass == byte[].class && !toClass.isArray()) {
// [#5824] UUID's most significant bits in byte[] are first
if (toClass == UUID.class) {

View File

@ -7842,7 +7842,7 @@ public class DSL {
* @see DSLContext#alterView(Table, Field...)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, TRINO, YUGABYTEDB })
public static org.jooq.AlterViewStep alterView(Table<?> view, Field<?>... fields) {
return dsl().alterView(view, fields);
}
@ -7857,7 +7857,7 @@ public class DSL {
* @see DSLContext#alterView(Table, Collection)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, TRINO, YUGABYTEDB })
public static org.jooq.AlterViewStep alterView(Table<?> view, Collection<? extends Field<?>> fields) {
return dsl().alterView(view, fields);
}
@ -22621,7 +22621,7 @@ public class DSL {
* @param dataType The data type to try to cast the value to
*/
@NotNull
@Support({ DUCKDB, TRINO })
@Support({ CLICKHOUSE, DUCKDB, TRINO })
public static <T> Field<T> tryCast(Object value, DataType<T> dataType) {
return new TryCast<>(Tools.field(value), dataType);
}
@ -22633,7 +22633,7 @@ public class DSL {
* @param dataType The data type to try to cast the value to
*/
@NotNull
@Support({ DUCKDB, TRINO })
@Support({ CLICKHOUSE, DUCKDB, TRINO })
public static <T> Field<T> tryCast(Field<?> value, DataType<T> dataType) {
return new TryCast<>(value, dataType);
}

View File

@ -90,6 +90,7 @@ import static org.jooq.SQLDialect.TRINO;
// ...
import static org.jooq.SQLDialect.YUGABYTEDB;
import static org.jooq.conf.ParamType.INLINED;
import static org.jooq.impl.Array.NO_SUPPORT_SQUARE_BRACKETS;
import static org.jooq.impl.Convert.convert;
import static org.jooq.impl.Convert.patchIso8601Timestamp;
import static org.jooq.impl.DSL.cast;
@ -1327,7 +1328,7 @@ public class DefaultBinding<T, U> implements Binding<T, U> {
// By default, render HSQLDB syntax
else {
boolean squareBrackets = true;
boolean squareBrackets = !NO_SUPPORT_SQUARE_BRACKETS.contains(ctx.dialect());
ctx.render().visit(K_ARRAY);
ctx.render().sql(squareBrackets ? '[' : '(');
@ -1383,6 +1384,7 @@ public class DefaultBinding<T, U> implements Binding<T, U> {
ctx.statement().setString(ctx.index(), toPGArrayString(value));
break;
}
case HSQLDB: {
Object[] a = value;
Class<?> t = dataType.getType();
@ -1397,10 +1399,13 @@ public class DefaultBinding<T, U> implements Binding<T, U> {
ctx.statement().setArray(ctx.index(), new MockArray(ctx.family(), a, t));
break;
}
case CLICKHOUSE:
case H2: {
ctx.statement().setObject(ctx.index(), value);
break;
}
default:
throw new SQLDialectNotSupportedException("Cannot bind ARRAY types in dialect " + ctx.family());
}

View File

@ -138,18 +138,18 @@ implements
QOM.Delete<R>
{
private static final Clause[] CLAUSES = { DELETE };
private static final Set<SQLDialect> SPECIAL_DELETE_AS_SYNTAX = SQLDialect.supportedBy(MARIADB, MYSQL);
private static final Clause[] CLAUSES = { DELETE };
static final Set<SQLDialect> SPECIAL_DELETE_AS_SYNTAX = SQLDialect.supportedBy(MARIADB, MYSQL);
// LIMIT is not supported at all
private static final Set<SQLDialect> NO_SUPPORT_LIMIT = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, DUCKDB, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_LIMIT = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, DUCKDB, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB);
// LIMIT is supported but not ORDER BY
private static final Set<SQLDialect> NO_SUPPORT_ORDER_BY_LIMIT = SQLDialect.supportedBy(IGNITE);
private static final Set<SQLDialect> SUPPORT_MULTITABLE_DELETE = SQLDialect.supportedBy(MARIADB, MYSQL);
private static final Set<SQLDialect> REQUIRE_REPEAT_FROM_IN_USING = SQLDialect.supportedBy(MARIADB, MYSQL);
private static final Set<SQLDialect> NO_SUPPORT_REPEAT_FROM_IN_USING = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
private static final Set<SQLDialect> REQUIRES_WHERE = SQLDialect.supportedBy(CLICKHOUSE);
static final Set<SQLDialect> NO_SUPPORT_ORDER_BY_LIMIT = SQLDialect.supportedBy(IGNITE);
static final Set<SQLDialect> SUPPORT_MULTITABLE_DELETE = SQLDialect.supportedBy(MARIADB, MYSQL);
static final Set<SQLDialect> REQUIRE_REPEAT_FROM_IN_USING = SQLDialect.supportedBy(MARIADB, MYSQL);
static final Set<SQLDialect> NO_SUPPORT_REPEAT_FROM_IN_USING = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> REQUIRES_WHERE = SQLDialect.supportedBy(CLICKHOUSE);
@ -158,12 +158,12 @@ implements
// https://github.com/ClickHouse/ClickHouse/issues/61020
static final Set<SQLDialect> NO_SUPPORT_QUALIFY_IN_WHERE = SQLDialect.supportedBy(CLICKHOUSE);
static final Set<SQLDialect> NO_SUPPORT_QUALIFY_IN_WHERE = SQLDialect.supportedBy(CLICKHOUSE);
private final TableList using;
private final ConditionProviderImpl condition;
private final SortFieldList orderBy;
private Field<? extends Number> limit;
private final TableList using;
private final ConditionProviderImpl condition;
private final SortFieldList orderBy;
private Field<? extends Number> limit;
DeleteQueryImpl(Configuration configuration, WithImpl with, Table<R> table) {
super(configuration, with, table);

View File

@ -59,6 +59,7 @@ final class Names {
static final Name N_ARRAY_TABLE = name("array_table");
static final Name N_COLUMN_VALUE = name("COLUMN_VALUE");
static final Name N_accurateCastOrNull = systemName("accurateCastOrNull");
static final Name N_ADD = systemName("add");
static final Name N_ADD_DAYS = systemName("add_days");
static final Name N_ADD_HOURS = systemName("add_hours");

View File

@ -92,7 +92,7 @@ implements
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);

View File

@ -92,7 +92,7 @@ implements
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);

View File

@ -92,7 +92,7 @@ implements
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);

View File

@ -92,7 +92,7 @@ implements
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);

View File

@ -92,7 +92,7 @@ implements
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);

View File

@ -92,7 +92,7 @@ implements
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);

View File

@ -92,7 +92,7 @@ implements
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);

View File

@ -92,7 +92,7 @@ implements
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);

View File

@ -92,7 +92,7 @@ implements
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);
private static final Set<SQLDialect> NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);

View File

@ -343,17 +343,17 @@ import org.jooq.tools.StringUtils;
* @author Lukas Eder
*/
final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> implements SelectQuery<R> {
private static final JooqLogger log = JooqLogger.getLogger(SelectQueryImpl.class);
private static final Clause[] CLAUSES = { SELECT };
static final Set<SQLDialect> EMULATE_SELECT_INTO_AS_CTAS = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB);
private static final Set<SQLDialect> SUPPORT_SELECT_INTO_TABLE = SQLDialect.supportedBy(HSQLDB, POSTGRES, YUGABYTEDB);
private static final JooqLogger log = JooqLogger.getLogger(SelectQueryImpl.class);
private static final Clause[] CLAUSES = { SELECT };
static final Set<SQLDialect> EMULATE_SELECT_INTO_AS_CTAS = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB);
private static final Set<SQLDialect> SUPPORT_SELECT_INTO_TABLE = SQLDialect.supportedBy(HSQLDB, POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_WINDOW_CLAUSE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB);
private static final Set<SQLDialect> REQUIRES_FROM_CLAUSE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB);
private static final Set<SQLDialect> REQUIRES_DERIVED_TABLE_DML = SQLDialect.supportedUntil(MYSQL);
private static final Set<SQLDialect> NO_IMPLICIT_GROUP_BY_ON_HAVING = SQLDialect.supportedBy(SQLITE);
static final Set<SQLDialect> NO_SUPPORT_WINDOW_CLAUSE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB);
private static final Set<SQLDialect> REQUIRES_FROM_CLAUSE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB);
private static final Set<SQLDialect> REQUIRES_DERIVED_TABLE_DML = SQLDialect.supportedUntil(MYSQL);
private static final Set<SQLDialect> NO_IMPLICIT_GROUP_BY_ON_HAVING = SQLDialect.supportedBy(SQLITE);
@ -369,14 +369,14 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
static final Set<SQLDialect> SUPPORT_FULL_WITH_TIES = SQLDialect.supportedBy(CLICKHOUSE, H2, MARIADB, POSTGRES, TRINO);
static final Set<SQLDialect> EMULATE_DISTINCT_ON = SQLDialect.supportedBy(DERBY, FIREBIRD, HSQLDB, MARIADB, MYSQL, SQLITE, TRINO);
static final Set<SQLDialect> NO_SUPPORT_FOR_UPDATE_OF_FIELDS = SQLDialect.supportedBy(MYSQL, POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_UNION_ORDER_BY_ALIAS = SQLDialect.supportedBy(FIREBIRD);
static final Set<SQLDialect> NO_SUPPORT_WITH_READ_ONLY = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_LIMIT_ZERO = SQLDialect.supportedBy(DERBY, HSQLDB);
static final Set<SQLDialect> SUPPORT_FULL_WITH_TIES = SQLDialect.supportedBy(CLICKHOUSE, H2, MARIADB, POSTGRES, TRINO);
static final Set<SQLDialect> EMULATE_DISTINCT_ON = SQLDialect.supportedBy(DERBY, FIREBIRD, HSQLDB, MARIADB, MYSQL, SQLITE, TRINO);
static final Set<SQLDialect> NO_SUPPORT_FOR_UPDATE_OF_FIELDS = SQLDialect.supportedBy(MYSQL, POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_UNION_ORDER_BY_ALIAS = SQLDialect.supportedBy(FIREBIRD);
static final Set<SQLDialect> NO_SUPPORT_WITH_READ_ONLY = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_LIMIT_ZERO = SQLDialect.supportedBy(DERBY, HSQLDB);
static final Set<SQLDialect> WRAP_EXP_BODY_IN_DERIVED_TABLE_LIMIT = SQLDialect.supportedUntil(CLICKHOUSE);
static final Set<SQLDialect> WRAP_EXP_BODY_IN_DERIVED_TABLE_ORDER_BY = SQLDialect.supportedBy(CLICKHOUSE);
@ -3514,14 +3514,12 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
}
private final boolean wrapQueryExpressionBodyInDerivedTable(Context<?> ctx) {
return false
;
// [#2059] [#7539] Some dialects require query in derived table when using ORDER BY
return !unionOp.isEmpty() && (
WRAP_EXP_BODY_IN_DERIVED_TABLE_LIMIT.contains(ctx.dialect()) && getLimit().isApplicable()
|| WRAP_EXP_BODY_IN_DERIVED_TABLE_ORDER_BY.contains(ctx.dialect()) && !getOrderBy().isEmpty()
);
}

View File

@ -112,6 +112,7 @@ implements
case CLICKHOUSE:
case CUBRID:
case DERBY:
case DUCKDB:
@ -161,6 +162,7 @@ implements
case CLICKHOUSE:
case CUBRID:
case DERBY:
case DUCKDB:

View File

@ -197,7 +197,7 @@ implements
QOM.Update<R>
{
private static final Clause[] CLAUSES = { UPDATE };
private static final Clause[] CLAUSES = { UPDATE };
@ -205,25 +205,25 @@ implements
private static final Set<SQLDialect> REQUIRES_WHERE = SQLDialect.supportedBy(CLICKHOUSE);
private static final Set<SQLDialect> EMULATE_FROM_WITH_MERGE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB);
private static final Set<SQLDialect> EMULATE_RETURNING_WITH_UPSERT = SQLDialect.supportedBy(MARIADB);
static final Set<SQLDialect> REQUIRES_WHERE = SQLDialect.supportedBy(CLICKHOUSE);
static final Set<SQLDialect> EMULATE_FROM_WITH_MERGE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB);
static final Set<SQLDialect> EMULATE_RETURNING_WITH_UPSERT = SQLDialect.supportedBy(MARIADB);
// LIMIT is not supported at all
private static final Set<SQLDialect> NO_SUPPORT_LIMIT = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, DUCKDB, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_LIMIT = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, DUCKDB, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB);
// LIMIT is supported but not ORDER BY
private static final Set<SQLDialect> NO_SUPPORT_ORDER_BY_LIMIT = SQLDialect.supportedBy(IGNITE);
static final Set<SQLDialect> NO_SUPPORT_UPDATE_JOIN = SQLDialect.supportedBy(CLICKHOUSE, CUBRID, DERBY, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, POSTGRES, SQLITE, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_ORDER_BY_LIMIT = SQLDialect.supportedBy(IGNITE);
static final Set<SQLDialect> NO_SUPPORT_UPDATE_JOIN = SQLDialect.supportedBy(CLICKHOUSE, CUBRID, DERBY, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, POSTGRES, SQLITE, YUGABYTEDB);
// https://github.com/ClickHouse/ClickHouse/issues/61020
static final Set<SQLDialect> NO_SUPPORT_QUALIFY_IN_WHERE = SQLDialect.supportedBy(CLICKHOUSE);
static final Set<SQLDialect> NO_SUPPORT_QUALIFY_IN_WHERE = SQLDialect.supportedBy(CLICKHOUSE);
private final FieldMapForUpdate updateMap;
private final TableList from;
private final ConditionProviderImpl condition;
private final SortFieldList orderBy;
private Field<? extends Number> limit;
private final FieldMapForUpdate updateMap;
private final TableList from;
private final ConditionProviderImpl condition;
private final SortFieldList orderBy;
private Field<? extends Number> limit;
UpdateQueryImpl(Configuration configuration, WithImpl with, Table<R> table) {
super(configuration, with, table);