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

This commit is contained in:
Lukas Eder 2024-03-11 12:26:31 +01:00
parent 0116bd8a11
commit 9e496d1e1d
6 changed files with 24 additions and 9 deletions

View File

@ -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<T> 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);
}

View File

@ -98,10 +98,9 @@ final class Array<T> extends AbstractField<T[]> implements QOM.Array<T> {
c -> {
switch (ctx.family()) {
case CLICKHOUSE:
ctx.visit(K_ARRAY).sql('(').visit(fields).sql(')');
break;
default:
ctx.visit(K_ARRAY).sql('[').visit(fields).sql(']');

View File

@ -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<T> 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<SQLDialect> NO_SUPPORT_SYMMETRIC = SQLDialect.supportedBy(CUBRID, DERBY, DUCKDB, FIREBIRD, H2, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);
private static final Set<SQLDialect> NO_SUPPORT_SYMMETRIC = SQLDialect.supportedBy(CLICKHOUSE, CUBRID, DERBY, DUCKDB, FIREBIRD, H2, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);
private final boolean symmetric;
private final boolean not;

View File

@ -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 <T> Field<T[]> 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 <T> Field<T[]> array(Field<T>... 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 <T> Field<T[]> array(Collection<? extends Field<T>> fields) {
return new Array<>(fields);
}

View File

@ -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");

View File

@ -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<SQLDialect> NO_SUPPORT_SYMMETRIC = SQLDialect.supportedBy(CUBRID, DERBY, DUCKDB, FIREBIRD, H2, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);
private static final Set<SQLDialect> NO_SUPPORT_SYMMETRIC = SQLDialect.supportedBy(CLICKHOUSE, CUBRID, DERBY, DUCKDB, FIREBIRD, H2, IGNITE, MARIADB, MYSQL, SQLITE, TRINO);
private static final Set<SQLDialect> EMULATE_BETWEEN = SQLDialect.supportedBy(CUBRID, DERBY, DUCKDB, FIREBIRD, MARIADB, MYSQL);
private final boolean symmetric;