From 7e22b9818e785c2c5fc199de34476d3ac2890dae Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 14 Mar 2024 16:29:41 +0100 Subject: [PATCH] [jOOQ/jOOQ#7539] Support for SQLDialect.CLICKHOUSE - WIP --- .../main/java/org/jooq/AlterTableStep.java | 4 +- .../src/main/java/org/jooq/AlterViewStep.java | 10 ++--- .../java/org/jooq/CreateTableCommentStep.java | 4 +- jOOQ/src/main/java/org/jooq/DSLContext.java | 4 +- jOOQ/src/main/java/org/jooq/Field.java | 4 +- .../java/org/jooq/SelectDistinctOnStep.java | 9 ++-- jOOQ/src/main/java/org/jooq/SelectQuery.java | 4 +- .../java/org/jooq/impl/AlterViewImpl.java | 17 ++++--- jOOQ/src/main/java/org/jooq/impl/Array.java | 21 ++++----- jOOQ/src/main/java/org/jooq/impl/Cast.java | 24 +++++++++- jOOQ/src/main/java/org/jooq/impl/Convert.java | 2 +- jOOQ/src/main/java/org/jooq/impl/DSL.java | 8 ++-- .../java/org/jooq/impl/DefaultBinding.java | 7 ++- .../java/org/jooq/impl/DeleteQueryImpl.java | 26 +++++------ jOOQ/src/main/java/org/jooq/impl/Names.java | 1 + .../src/main/java/org/jooq/impl/RegrAvgX.java | 2 +- .../src/main/java/org/jooq/impl/RegrAvgY.java | 2 +- .../main/java/org/jooq/impl/RegrCount.java | 2 +- .../java/org/jooq/impl/RegrIntercept.java | 2 +- jOOQ/src/main/java/org/jooq/impl/RegrR2.java | 2 +- .../main/java/org/jooq/impl/RegrSlope.java | 2 +- jOOQ/src/main/java/org/jooq/impl/RegrSxx.java | 2 +- jOOQ/src/main/java/org/jooq/impl/RegrSxy.java | 2 +- jOOQ/src/main/java/org/jooq/impl/RegrSyy.java | 2 +- .../java/org/jooq/impl/SelectQueryImpl.java | 44 +++++++++---------- jOOQ/src/main/java/org/jooq/impl/Square.java | 2 + .../java/org/jooq/impl/UpdateQueryImpl.java | 26 +++++------ 27 files changed, 131 insertions(+), 104 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/AlterTableStep.java b/jOOQ/src/main/java/org/jooq/AlterTableStep.java index 584d75f555..7c3e6be9a2 100644 --- a/jOOQ/src/main/java/org/jooq/AlterTableStep.java +++ b/jOOQ/src/main/java/org/jooq/AlterTableStep.java @@ -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); /** diff --git a/jOOQ/src/main/java/org/jooq/AlterViewStep.java b/jOOQ/src/main/java/org/jooq/AlterViewStep.java index 483f214c9e..162ec40157 100644 --- a/jOOQ/src/main/java/org/jooq/AlterViewStep.java +++ b/jOOQ/src/main/java/org/jooq/AlterViewStep.java @@ -73,35 +73,35 @@ public interface AlterViewStep { /** * Add the COMMENT clause to the ALTER VIEW 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 COMMENT clause to the ALTER VIEW 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 RENAME TO clause to the ALTER VIEW 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 RENAME TO clause to the ALTER VIEW statement. */ - @Support({ DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) @NotNull @CheckReturnValue AlterViewFinalStep renameTo(Name renameTo); /** * Add the RENAME TO clause to the ALTER VIEW statement. */ - @Support({ DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) @NotNull @CheckReturnValue AlterViewFinalStep renameTo(Table renameTo); diff --git a/jOOQ/src/main/java/org/jooq/CreateTableCommentStep.java b/jOOQ/src/main/java/org/jooq/CreateTableCommentStep.java index c4a8a6377b..fe6d4e2aff 100644 --- a/jOOQ/src/main/java/org/jooq/CreateTableCommentStep.java +++ b/jOOQ/src/main/java/org/jooq/CreateTableCommentStep.java @@ -73,14 +73,14 @@ public interface CreateTableCommentStep extends CreateTableStorageStep { /** * Add the COMMENT clause to the CREATE TABLE statement. */ - @Support({ FIREBIRD, MARIADB, MYSQL, POSTGRES, YUGABYTEDB }) + @Support({ CLICKHOUSE, FIREBIRD, MARIADB, MYSQL, POSTGRES, YUGABYTEDB }) @NotNull @CheckReturnValue CreateTableStorageStep comment(@Stringly.Comment String comment); /** * Add the COMMENT clause to the CREATE TABLE statement. */ - @Support({ FIREBIRD, MARIADB, MYSQL, POSTGRES, YUGABYTEDB }) + @Support({ CLICKHOUSE, FIREBIRD, MARIADB, MYSQL, POSTGRES, YUGABYTEDB }) @NotNull @CheckReturnValue CreateTableStorageStep comment(Comment comment); } diff --git a/jOOQ/src/main/java/org/jooq/DSLContext.java b/jOOQ/src/main/java/org/jooq/DSLContext.java index fb5d7f97cd..522b5b8854 100644 --- a/jOOQ/src/main/java/org/jooq/DSLContext.java +++ b/jOOQ/src/main/java/org/jooq/DSLContext.java @@ -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> fields); /** diff --git a/jOOQ/src/main/java/org/jooq/Field.java b/jOOQ/src/main/java/org/jooq/Field.java index 813db02763..305dc7fcf2 100644 --- a/jOOQ/src/main/java/org/jooq/Field.java +++ b/jOOQ/src/main/java/org/jooq/Field.java @@ -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 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 comment(Comment comment); // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/SelectDistinctOnStep.java b/jOOQ/src/main/java/org/jooq/SelectDistinctOnStep.java index 289b6019c1..5a8356e7e6 100644 --- a/jOOQ/src/main/java/org/jooq/SelectDistinctOnStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectDistinctOnStep.java @@ -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 extends SelectIntoStep on(SelectFieldOrAsterisk... fields); /** @@ -147,7 +148,7 @@ public interface SelectDistinctOnStep extends SelectIntoStep on(Collection fields); /** @@ -155,7 +156,7 @@ public interface SelectDistinctOnStep extends SelectIntoStepSELECT DISTINCT ON (…) 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 distinctOn(SelectFieldOrAsterisk... fields); /** @@ -163,6 +164,6 @@ public interface SelectDistinctOnStep extends SelectIntoStepSELECT DISTINCT ON (…) 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 distinctOn(Collection fields); } diff --git a/jOOQ/src/main/java/org/jooq/SelectQuery.java b/jOOQ/src/main/java/org/jooq/SelectQuery.java index 85b484943f..8ea5f9566c 100644 --- a/jOOQ/src/main/java/org/jooq/SelectQuery.java +++ b/jOOQ/src/main/java/org/jooq/SelectQuery.java @@ -130,7 +130,7 @@ public interface SelectQuery extends Select, ConditionProvi *

* This also sets the distinct flag to true */ - @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 extends Select, ConditionProvi *

* This also sets the distinct flag to true */ - @Support({ CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, CUBRID, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) void addDistinctOn(Collection fields); /** diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterViewImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterViewImpl.java index 31acbf6216..bdbe813d59 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterViewImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterViewImpl.java @@ -183,7 +183,7 @@ implements private static final Clause[] CLAUSES = { Clause.ALTER_VIEW }; private static final Set NO_SUPPORT_RENAME_IF_EXISTS = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD); private static final Set NO_SUPPORT_IF_EXISTS = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD); - private static final Set SUPPORT_ALTER_TABLE_RENAME = SQLDialect.supportedBy(HSQLDB, YUGABYTEDB); + private static final Set 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); diff --git a/jOOQ/src/main/java/org/jooq/impl/Array.java b/jOOQ/src/main/java/org/jooq/impl/Array.java index 4833bb7bee..a5803d5b01 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Array.java +++ b/jOOQ/src/main/java/org/jooq/impl/Array.java @@ -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 extends AbstractField implements QOM.Array { - private static final Set REQUIRES_CAST = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB); + static final Set REQUIRES_CAST = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB); + static final Set NO_SUPPORT_SQUARE_BRACKETS = SQLDialect.supportedBy(CLICKHOUSE); - final FieldsImpl fields; + final FieldsImpl fields; Array(Collection> fields) { super(N_ARRAY, type(fields)); @@ -96,16 +99,10 @@ final class Array extends AbstractField implements QOM.Array { 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); diff --git a/jOOQ/src/main/java/org/jooq/impl/Cast.java b/jOOQ/src/main/java/org/jooq/impl/Cast.java index 7ea6e30e1a..2ddd0a2ae1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Cast.java +++ b/jOOQ/src/main/java/org/jooq/impl/Cast.java @@ -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 extends AbstractField implements QOM.Cast { + case CLICKHOUSE: + ctx.visit(N_accurateCastOrNull); + break; + default: ctx.visit(N_TRY_CAST); break; @@ -397,7 +409,12 @@ final class Cast extends AbstractField implements QOM.Cast { 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 extends AbstractField implements QOM.Cast { break; } + if (tryCast) + if (ctx.family() == CLICKHOUSE) + ctx.stringLiteral(false).sql('\''); diff --git a/jOOQ/src/main/java/org/jooq/impl/Convert.java b/jOOQ/src/main/java/org/jooq/impl/Convert.java index 7147796bd0..15a8fde8eb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Convert.java +++ b/jOOQ/src/main/java/org/jooq/impl/Convert.java @@ -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) { diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index ca0d4b4c95..82347ca95c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -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> 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 Field tryCast(Object value, DataType 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 Field tryCast(Field value, DataType dataType) { return new TryCast<>(value, dataType); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index 2e333c91d9..922780adcf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -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 implements Binding { // 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 implements Binding { ctx.statement().setString(ctx.index(), toPGArrayString(value)); break; } + case HSQLDB: { Object[] a = value; Class t = dataType.getType(); @@ -1397,10 +1399,13 @@ public class DefaultBinding implements Binding { 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()); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java index 967083773d..70fccebbcc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java @@ -138,18 +138,18 @@ implements QOM.Delete { - private static final Clause[] CLAUSES = { DELETE }; - private static final Set SPECIAL_DELETE_AS_SYNTAX = SQLDialect.supportedBy(MARIADB, MYSQL); + private static final Clause[] CLAUSES = { DELETE }; + static final Set SPECIAL_DELETE_AS_SYNTAX = SQLDialect.supportedBy(MARIADB, MYSQL); // LIMIT is not supported at all - private static final Set NO_SUPPORT_LIMIT = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, DUCKDB, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB); + static final Set 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 NO_SUPPORT_ORDER_BY_LIMIT = SQLDialect.supportedBy(IGNITE); - private static final Set SUPPORT_MULTITABLE_DELETE = SQLDialect.supportedBy(MARIADB, MYSQL); - private static final Set REQUIRE_REPEAT_FROM_IN_USING = SQLDialect.supportedBy(MARIADB, MYSQL); - private static final Set NO_SUPPORT_REPEAT_FROM_IN_USING = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB); - private static final Set REQUIRES_WHERE = SQLDialect.supportedBy(CLICKHOUSE); + static final Set NO_SUPPORT_ORDER_BY_LIMIT = SQLDialect.supportedBy(IGNITE); + static final Set SUPPORT_MULTITABLE_DELETE = SQLDialect.supportedBy(MARIADB, MYSQL); + static final Set REQUIRE_REPEAT_FROM_IN_USING = SQLDialect.supportedBy(MARIADB, MYSQL); + static final Set NO_SUPPORT_REPEAT_FROM_IN_USING = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB); + static final Set REQUIRES_WHERE = SQLDialect.supportedBy(CLICKHOUSE); @@ -158,12 +158,12 @@ implements // https://github.com/ClickHouse/ClickHouse/issues/61020 - static final Set NO_SUPPORT_QUALIFY_IN_WHERE = SQLDialect.supportedBy(CLICKHOUSE); + static final Set NO_SUPPORT_QUALIFY_IN_WHERE = SQLDialect.supportedBy(CLICKHOUSE); - private final TableList using; - private final ConditionProviderImpl condition; - private final SortFieldList orderBy; - private Field limit; + private final TableList using; + private final ConditionProviderImpl condition; + private final SortFieldList orderBy; + private Field limit; DeleteQueryImpl(Configuration configuration, WithImpl with, Table table) { super(configuration, with, table); diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index 7e1652344c..eea1e04746 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -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"); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrAvgX.java b/jOOQ/src/main/java/org/jooq/impl/RegrAvgX.java index a6ebca9f55..6714ac544e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrAvgX.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrAvgX.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrAvgY.java b/jOOQ/src/main/java/org/jooq/impl/RegrAvgY.java index b87906d0b1..9f3daf54b2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrAvgY.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrAvgY.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrCount.java b/jOOQ/src/main/java/org/jooq/impl/RegrCount.java index 9cefb7ca49..892fa702f8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrCount.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrCount.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java b/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java index 7d797db7a6..839f6ac37d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrR2.java b/jOOQ/src/main/java/org/jooq/impl/RegrR2.java index 02a394cbbd..0e544444d9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrR2.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrR2.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java b/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java index 46820693ae..9f998a6f54 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java b/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java index 6372cf3ef9..b82951e5a4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java b/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java index 2c24c8e27a..4754c92811 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java b/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java index 5268c84432..b1f01dc819 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 4f33b61211..ed827ace75 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -343,17 +343,17 @@ import org.jooq.tools.StringUtils; * @author Lukas Eder */ final class SelectQueryImpl extends AbstractResultQuery implements SelectQuery { - private static final JooqLogger log = JooqLogger.getLogger(SelectQueryImpl.class); - private static final Clause[] CLAUSES = { SELECT }; - static final Set EMULATE_SELECT_INTO_AS_CTAS = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB); - private static final Set 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 EMULATE_SELECT_INTO_AS_CTAS = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB); + private static final Set SUPPORT_SELECT_INTO_TABLE = SQLDialect.supportedBy(HSQLDB, POSTGRES, YUGABYTEDB); - static final Set NO_SUPPORT_WINDOW_CLAUSE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB); - private static final Set REQUIRES_FROM_CLAUSE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB); - private static final Set REQUIRES_DERIVED_TABLE_DML = SQLDialect.supportedUntil(MYSQL); - private static final Set NO_IMPLICIT_GROUP_BY_ON_HAVING = SQLDialect.supportedBy(SQLITE); + static final Set NO_SUPPORT_WINDOW_CLAUSE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB); + private static final Set REQUIRES_FROM_CLAUSE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB); + private static final Set REQUIRES_DERIVED_TABLE_DML = SQLDialect.supportedUntil(MYSQL); + private static final Set NO_IMPLICIT_GROUP_BY_ON_HAVING = SQLDialect.supportedBy(SQLITE); @@ -369,14 +369,14 @@ final class SelectQueryImpl extends AbstractResultQuery imp - static final Set SUPPORT_FULL_WITH_TIES = SQLDialect.supportedBy(CLICKHOUSE, H2, MARIADB, POSTGRES, TRINO); - static final Set EMULATE_DISTINCT_ON = SQLDialect.supportedBy(DERBY, FIREBIRD, HSQLDB, MARIADB, MYSQL, SQLITE, TRINO); - static final Set NO_SUPPORT_FOR_UPDATE_OF_FIELDS = SQLDialect.supportedBy(MYSQL, POSTGRES, YUGABYTEDB); - static final Set NO_SUPPORT_UNION_ORDER_BY_ALIAS = SQLDialect.supportedBy(FIREBIRD); - static final Set NO_SUPPORT_WITH_READ_ONLY = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB); - static final Set NO_SUPPORT_LIMIT_ZERO = SQLDialect.supportedBy(DERBY, HSQLDB); - - + static final Set SUPPORT_FULL_WITH_TIES = SQLDialect.supportedBy(CLICKHOUSE, H2, MARIADB, POSTGRES, TRINO); + static final Set EMULATE_DISTINCT_ON = SQLDialect.supportedBy(DERBY, FIREBIRD, HSQLDB, MARIADB, MYSQL, SQLITE, TRINO); + static final Set NO_SUPPORT_FOR_UPDATE_OF_FIELDS = SQLDialect.supportedBy(MYSQL, POSTGRES, YUGABYTEDB); + static final Set NO_SUPPORT_UNION_ORDER_BY_ALIAS = SQLDialect.supportedBy(FIREBIRD); + static final Set NO_SUPPORT_WITH_READ_ONLY = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB); + static final Set NO_SUPPORT_LIMIT_ZERO = SQLDialect.supportedBy(DERBY, HSQLDB); + static final Set WRAP_EXP_BODY_IN_DERIVED_TABLE_LIMIT = SQLDialect.supportedUntil(CLICKHOUSE); + static final Set WRAP_EXP_BODY_IN_DERIVED_TABLE_ORDER_BY = SQLDialect.supportedBy(CLICKHOUSE); @@ -3514,14 +3514,12 @@ final class SelectQueryImpl extends AbstractResultQuery 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() + ); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Square.java b/jOOQ/src/main/java/org/jooq/impl/Square.java index 83c5c47d86..0c3e0c7f2a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Square.java +++ b/jOOQ/src/main/java/org/jooq/impl/Square.java @@ -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: diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java index cd8c591e0a..e31fc61924 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java @@ -197,7 +197,7 @@ implements QOM.Update { - private static final Clause[] CLAUSES = { UPDATE }; + private static final Clause[] CLAUSES = { UPDATE }; @@ -205,25 +205,25 @@ implements - private static final Set REQUIRES_WHERE = SQLDialect.supportedBy(CLICKHOUSE); - private static final Set EMULATE_FROM_WITH_MERGE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB); - private static final Set EMULATE_RETURNING_WITH_UPSERT = SQLDialect.supportedBy(MARIADB); + static final Set REQUIRES_WHERE = SQLDialect.supportedBy(CLICKHOUSE); + static final Set EMULATE_FROM_WITH_MERGE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB); + static final Set EMULATE_RETURNING_WITH_UPSERT = SQLDialect.supportedBy(MARIADB); // LIMIT is not supported at all - private static final Set NO_SUPPORT_LIMIT = SQLDialect.supportedUntil(CLICKHOUSE, CUBRID, DERBY, DUCKDB, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB); + static final Set 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 NO_SUPPORT_ORDER_BY_LIMIT = SQLDialect.supportedBy(IGNITE); - static final Set NO_SUPPORT_UPDATE_JOIN = SQLDialect.supportedBy(CLICKHOUSE, CUBRID, DERBY, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, POSTGRES, SQLITE, YUGABYTEDB); + static final Set NO_SUPPORT_ORDER_BY_LIMIT = SQLDialect.supportedBy(IGNITE); + static final Set 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 NO_SUPPORT_QUALIFY_IN_WHERE = SQLDialect.supportedBy(CLICKHOUSE); + static final Set 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 limit; + private final FieldMapForUpdate updateMap; + private final TableList from; + private final ConditionProviderImpl condition; + private final SortFieldList orderBy; + private Field limit; UpdateQueryImpl(Configuration configuration, WithImpl with, Table table) { super(configuration, with, table);