From 9e496d1e1de43c4773051304a4e354cc1f4d8941 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 11 Mar 2024 12:26:31 +0100 Subject: [PATCH] [jOOQ/jOOQ#7539] Support for SQLDialect.CLICKHOUSE - WIP --- .../main/java/org/jooq/impl/AbstractInList.java | 14 ++++++++++++++ jOOQ/src/main/java/org/jooq/impl/Array.java | 7 +++---- .../main/java/org/jooq/impl/BetweenCondition.java | 3 ++- jOOQ/src/main/java/org/jooq/impl/DSL.java | 6 +++--- jOOQ/src/main/java/org/jooq/impl/Names.java | 1 + .../java/org/jooq/impl/RowBetweenCondition.java | 2 +- 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractInList.java b/jOOQ/src/main/java/org/jooq/impl/AbstractInList.java index 5920e7a22f..a65e90d7c1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractInList.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractInList.java @@ -73,13 +73,16 @@ import static org.jooq.SQLDialect.TRINO; // ... import static org.jooq.SQLDialect.YUGABYTEDB; import static org.jooq.conf.ParamType.INDEXED; +import static org.jooq.impl.DSL.array; import static org.jooq.impl.DSL.falseCondition; import static org.jooq.impl.DSL.row; import static org.jooq.impl.DSL.trueCondition; import static org.jooq.impl.Keywords.K_AND; import static org.jooq.impl.Keywords.K_IN; +import static org.jooq.impl.Keywords.K_NOT; import static org.jooq.impl.Keywords.K_NOT_IN; import static org.jooq.impl.Keywords.K_OR; +import static org.jooq.impl.Names.N_HAS; import static org.jooq.impl.QueryPartListView.wrap; import static org.jooq.impl.Tools.EMPTY_FIELD; import static org.jooq.impl.Tools.anyMatch; @@ -154,10 +157,21 @@ abstract class AbstractInList extends AbstractCondition { + + // [#7539] Work around https://github.com/ClickHouse/ClickHouse/issues/58242 + else if (ctx.family() == CLICKHOUSE && anyMatch(values, v -> !(v instanceof Val))) + acceptClickHouse(ctx); else accept0(ctx); } + private final void acceptClickHouse(Context ctx) { + if (!(this instanceof InList)) + ctx.visit(K_NOT).sql(' '); + + ctx.visit(N_HAS).sql('(').visit(array(values)).sql(", ").visit(field).sql(')'); + } + private final void accept0(Context ctx) { accept1(ctx, this instanceof InList, field, values); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Array.java b/jOOQ/src/main/java/org/jooq/impl/Array.java index 78f4951144..4833bb7bee 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Array.java +++ b/jOOQ/src/main/java/org/jooq/impl/Array.java @@ -98,10 +98,9 @@ final class Array extends AbstractField implements QOM.Array { c -> { switch (ctx.family()) { - - - - + case CLICKHOUSE: + ctx.visit(K_ARRAY).sql('(').visit(fields).sql(')'); + break; default: ctx.visit(K_ARRAY).sql('[').visit(fields).sql(']'); diff --git a/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java b/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java index e8f91f476f..128eecb8f8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java @@ -47,6 +47,7 @@ import static org.jooq.Clause.CONDITION_NOT_BETWEEN_SYMMETRIC; // ... // ... // ... +import static org.jooq.SQLDialect.CLICKHOUSE; import static org.jooq.SQLDialect.CUBRID; // ... import static org.jooq.SQLDialect.DERBY; @@ -103,7 +104,7 @@ final class BetweenCondition extends AbstractCondition implements BetweenAndS private static final Clause[] CLAUSES_BETWEEN_SYMMETRIC = { CONDITION, CONDITION_BETWEEN_SYMMETRIC }; private static final Clause[] CLAUSES_NOT_BETWEEN = { CONDITION, CONDITION_NOT_BETWEEN }; private static final Clause[] CLAUSES_NOT_BETWEEN_SYMMETRIC = { CONDITION, CONDITION_NOT_BETWEEN_SYMMETRIC }; - private static final Set NO_SUPPORT_SYMMETRIC = SQLDialect.supportedBy(CUBRID, DERBY, DUCKDB, FIREBIRD, H2, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); + private static final Set NO_SUPPORT_SYMMETRIC = SQLDialect.supportedBy(CLICKHOUSE, CUBRID, DERBY, DUCKDB, FIREBIRD, H2, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); private final boolean symmetric; private final boolean not; diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 170cafc118..ffed92d41e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -29201,7 +29201,7 @@ public class DSL { * Create an array literal. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) public static Field array(T... values) { return array(Tools.fields(values)); } @@ -29211,7 +29211,7 @@ public class DSL { */ @SafeVarargs @NotNull - @Support({ H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) public static Field array(Field... fields) { return array(Arrays.asList(fields)); } @@ -29220,7 +29220,7 @@ public class DSL { * Create an array literal. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) public static Field array(Collection> fields) { return new Array<>(fields); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index fa4ebd8eb3..8e517f3e21 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -144,6 +144,7 @@ final class Names { static final Name N_groupBitOr = systemName("groupBitOr"); static final Name N_groupBitXnor = systemName("groupBitXnor"); static final Name N_groupBitXor = systemName("groupBitXor"); + static final Name N_HAS = systemName("has"); static final Name N_HASHBYTES = systemName("hashbytes"); static final Name N_HASH_MD5 = systemName("hash_md5"); static final Name N_HEX_TO_BINARY = systemName("hex_to_binary"); diff --git a/jOOQ/src/main/java/org/jooq/impl/RowBetweenCondition.java b/jOOQ/src/main/java/org/jooq/impl/RowBetweenCondition.java index 322e6e1f10..3e11dc2276 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowBetweenCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowBetweenCondition.java @@ -169,7 +169,7 @@ implements private static final Clause[] CLAUSES_BETWEEN_SYMMETRIC = { CONDITION, CONDITION_BETWEEN_SYMMETRIC }; private static final Clause[] CLAUSES_NOT_BETWEEN = { CONDITION, CONDITION_NOT_BETWEEN }; private static final Clause[] CLAUSES_NOT_BETWEEN_SYMMETRIC = { CONDITION, CONDITION_NOT_BETWEEN_SYMMETRIC }; - private static final Set NO_SUPPORT_SYMMETRIC = SQLDialect.supportedBy(CUBRID, DERBY, DUCKDB, FIREBIRD, H2, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); + private static final Set NO_SUPPORT_SYMMETRIC = SQLDialect.supportedBy(CLICKHOUSE, CUBRID, DERBY, DUCKDB, FIREBIRD, H2, IGNITE, MARIADB, MYSQL, SQLITE, TRINO); private static final Set EMULATE_BETWEEN = SQLDialect.supportedBy(CUBRID, DERBY, DUCKDB, FIREBIRD, MARIADB, MYSQL); private final boolean symmetric;