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

This commit is contained in:
Lukas Eder 2024-03-12 12:59:41 +01:00
parent 321a6367b5
commit 3d36c257d1
11 changed files with 116 additions and 41 deletions

View File

@ -38,6 +38,7 @@
package org.jooq;
// ...
import static org.jooq.SQLDialect.CLICKHOUSE;
// ...
// ...
import static org.jooq.SQLDialect.H2;
@ -64,20 +65,20 @@ public interface JSONEntryValueStep {
* The JSON entry value.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
<T> JSONEntry<T> value(T value);
/**
* The JSON entry value.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
<T> JSONEntry<T> value(Field<T> value);
/**
* The JSON entry value.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
<T> JSONEntry<T> value(Select<? extends Record1<T>> value);
}

View File

@ -70,7 +70,7 @@ public interface JSONValueReturningStep<T> extends Field<T> {
/**
* Add the <code>RETURNING</code> clause to the <code>JSON VALUE</code> function.
*/
@Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
@NotNull
Field<T> returning(DataType<?> returning);
}

View File

@ -28875,7 +28875,7 @@ public class DSL {
* The JSON value extractor function.
*/
@NotNull
@Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static JSONValueOnStep<JSON> jsonValue(Field<JSON> json, String path) {
return jsonValue(json, Tools.field(path));
}
@ -28884,7 +28884,7 @@ public class DSL {
* The JSON value extractor function.
*/
@NotNull
@Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static JSONValueOnStep<JSON> jsonValue(Field<JSON> json, Field<String> path) {
return new JSONValue<>(SQLDataType.JSON, json, path, null);
}
@ -28893,7 +28893,7 @@ public class DSL {
* The JSON value extractor function.
*/
@NotNull
@Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static JSONValueOnStep<JSONB> jsonbValue(Field<JSONB> json, String path) {
return jsonbValue(json, Tools.field(path));
}
@ -28902,7 +28902,7 @@ public class DSL {
* The JSON value extractor function.
*/
@NotNull
@Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static JSONValueOnStep<JSONB> jsonbValue(Field<JSONB> json, Field<String> path) {
return new JSONValue<>(SQLDataType.JSONB, json, path, null);
}
@ -28914,7 +28914,7 @@ public class DSL {
* This is the same as calling {@link #jsonEntry(String, Field)}.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static JSONEntryValueStep key(String key) {
return key(Tools.field(key));
}
@ -28926,7 +28926,7 @@ public class DSL {
* This is the same as calling {@link #jsonEntry(Field, Field)}.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static JSONEntryValueStep key(Field<String> key) {
return new JSONEntryImpl<>(key);
}
@ -28939,7 +28939,7 @@ public class DSL {
* {@link Field#getName()} as a key.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static <T> JSONEntry<T> jsonEntry(Field<T> value) {
return jsonEntry(value.getName(), value);
}
@ -28949,7 +28949,7 @@ public class DSL {
* {@link #jsonObject(JSONEntry...)}.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static <T> JSONEntry<T> jsonEntry(String key, T value) {
return jsonEntry(Tools.field(key), Tools.field(value));
}
@ -28959,7 +28959,7 @@ public class DSL {
* {@link #jsonObject(JSONEntry...)}.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static <T> JSONEntry<T> jsonEntry(String key, Field<T> value) {
return jsonEntry(Tools.field(key), value);
}
@ -28969,7 +28969,7 @@ public class DSL {
* {@link #jsonObject(JSONEntry...)}.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static <T> JSONEntry<T> jsonEntry(String key, Select<? extends Record1<T>> value) {
return jsonEntry(Tools.field(key), field(value));
}
@ -28979,7 +28979,7 @@ public class DSL {
* {@link #jsonObject(JSONEntry...)}.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static <T> JSONEntry<T> jsonEntry(Field<String> key, T value) {
return jsonEntry(key, Tools.field(value));
}
@ -28989,7 +28989,7 @@ public class DSL {
* {@link #jsonObject(JSONEntry...)}.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static <T> JSONEntry<T> jsonEntry(Field<String> key, Field<T> value) {
return new JSONEntryImpl<>(key, value);
}
@ -28999,7 +28999,7 @@ public class DSL {
* {@link #jsonObject(JSONEntry...)}.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static <T> JSONEntry<T> jsonEntry(Field<String> key, Select<? extends Record1<T>> value) {
return jsonEntry(key, field(value));
}
@ -29008,7 +29008,7 @@ public class DSL {
* The JSON object constructor.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static JSONObjectNullStep<JSON> jsonObject(String key, Field<?> value) {
return jsonObject(jsonEntry(key, value));
}
@ -29017,7 +29017,7 @@ public class DSL {
* The JSON object constructor.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static JSONObjectNullStep<JSON> jsonObject(Field<String> key, Field<?> value) {
return jsonObject(jsonEntry(key, value));
}
@ -29026,7 +29026,7 @@ public class DSL {
* The JSON object constructor.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static JSONObjectNullStep<JSON> jsonObject(Field<String> key, Select<? extends Record1<?>> value) {
return jsonObject(jsonEntry(key, value));
}
@ -29042,7 +29042,7 @@ public class DSL {
* {@link #jsonObject(JSONEntry...)} instead.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Deprecated(forRemoval = true, since = "3.19")
public static JSONObjectNullStep<JSON> jsonObject(Field<?>... entries) {
return new JSONObject(SQLDataType.JSON, Tools.jsonEntries(entries));
@ -29052,7 +29052,7 @@ public class DSL {
* The JSON object constructor.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static JSONObjectNullStep<JSONB> jsonbObject(String key, Field<?> value) {
return jsonbObject(jsonEntry(key, value));
}
@ -29061,7 +29061,7 @@ public class DSL {
* The JSON object constructor.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static JSONObjectNullStep<JSONB> jsonbObject(Field<String> key, Field<?> value) {
return jsonbObject(jsonEntry(key, value));
}
@ -29070,7 +29070,7 @@ public class DSL {
* The JSON object constructor.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static JSONObjectNullStep<JSONB> jsonbObject(Field<String> key, Select<? extends Record1<?>> value) {
return jsonbObject(jsonEntry(key, value));
}
@ -29086,7 +29086,7 @@ public class DSL {
* {@link #jsonObject(JSONEntry...)} instead.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Deprecated(forRemoval = true, since = "3.19")
public static JSONObjectNullStep<JSONB> jsonbObject(Field<?>... entries) {
return new JSONObject(SQLDataType.JSONB, Tools.jsonEntries(entries));
@ -29096,7 +29096,7 @@ public class DSL {
* The JSON object constructor.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static JSONObjectNullStep<JSON> jsonObject() {
return jsonObject(Tools.EMPTY_JSONENTRY);
}
@ -29105,7 +29105,7 @@ public class DSL {
* The JSON object constructor.
*/
@NotNull
@Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
@Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB })
public static JSONObjectNullStep<JSONB> jsonbObject() {
return jsonbObject(Tools.EMPTY_JSONENTRY);
}
@ -29228,7 +29228,7 @@ public class DSL {
* The JSON exists predicate.
*/
@NotNull
@Support({ MARIADB, MYSQL, POSTGRES, SQLITE })
@Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE })
public static JSONExistsOnStep jsonExists(Field<JSON> field, String path) {
return jsonExists(field, Tools.field(path));
}
@ -29237,7 +29237,7 @@ public class DSL {
* The JSON exists predicate.
*/
@NotNull
@Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static JSONExistsOnStep jsonExists(Field<JSON> field, Field<String> path) {
return new JSONExists(field, Tools.nullSafe(path));
}
@ -29246,7 +29246,7 @@ public class DSL {
* The JSONB exists predicate.
*/
@NotNull
@Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static JSONExistsOnStep jsonbExists(Field<JSONB> field, String path) {
return jsonbExists(field, Tools.field(path));
}
@ -29255,7 +29255,7 @@ public class DSL {
* The JSONB exists predicate.
*/
@NotNull
@Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static JSONExistsOnStep jsonbExists(Field<JSONB> field, Field<String> path) {
return new JSONExists(field, Tools.nullSafe(path));
}

View File

@ -116,7 +116,7 @@ implements
return false;
case CLICKHOUSE:
return false;
return true;
default:
return false;
@ -170,7 +170,7 @@ implements
break;
case CLICKHOUSE:
ctx.visit(function(N_JSONExtractRaw, JSONB, field, isub(attribute, one())));
ctx.visit(function(N_JSONExtractRaw, getDataType(), field, attribute));
break;
default:

View File

@ -92,6 +92,38 @@ implements
// XXX: QueryPart API
// -------------------------------------------------------------------------
@Override
final boolean parenthesised(Context<?> ctx) {
switch (ctx.family()) {
case MYSQL:
return false;
case MARIADB:
return false;
case SQLITE:
return false;
case CLICKHOUSE:
return true;
default:
return false;
}
}
@Override
public final void accept(Context<?> ctx) {
switch (ctx.family()) {
@ -139,7 +171,7 @@ implements
break;
case CLICKHOUSE:
ctx.visit(function(N_JSONExtractString, JSONB, field, isub(attribute, one())));
ctx.visit(function(N_JSONExtractString, getDataType(), field, attribute));
break;
default:

View File

@ -39,6 +39,7 @@ package org.jooq.impl;
import static org.jooq.conf.ParamType.INLINED;
import static org.jooq.impl.DSL.function;
import static org.jooq.impl.DSL.systemName;
import static org.jooq.impl.JSONExists.Behaviour.ERROR;
import static org.jooq.impl.JSONExists.Behaviour.FALSE;
import static org.jooq.impl.JSONExists.Behaviour.TRUE;
@ -144,6 +145,10 @@ final class JSONExists extends AbstractCondition implements JSONExistsOnStep, UN
ctx.sql(')');
break;
case CLICKHOUSE:
ctx.visit(function(systemName("JSON_EXISTS"), getDataType(), json, path));
break;
default:
ctx.visit(K_JSON_EXISTS).sql('(').visit(json).sql(", ");

View File

@ -116,7 +116,7 @@ implements
return false;
case CLICKHOUSE:
return false;
return true;
default:
return false;
@ -170,7 +170,7 @@ implements
break;
case CLICKHOUSE:
ctx.visit(function(N_JSONExtractRaw, JSON, field, isub(attribute, one())));
ctx.visit(function(N_JSONExtractRaw, getDataType(), field, attribute));
break;
default:

View File

@ -92,6 +92,38 @@ implements
// XXX: QueryPart API
// -------------------------------------------------------------------------
@Override
final boolean parenthesised(Context<?> ctx) {
switch (ctx.family()) {
case MYSQL:
return false;
case MARIADB:
return false;
case SQLITE:
return false;
case CLICKHOUSE:
return true;
default:
return false;
}
}
@Override
public final void accept(Context<?> ctx) {
switch (ctx.family()) {
@ -140,7 +172,7 @@ implements
break;
case CLICKHOUSE:
ctx.visit(function(N_JSONExtractString, JSON, field, isub(attribute, one())));
ctx.visit(function(N_JSONExtractString, getDataType(), field, attribute));
break;
default:

View File

@ -110,7 +110,7 @@ implements
return false;
case CLICKHOUSE:
return true;
return false;
case TRINO:
return false;
@ -153,7 +153,7 @@ implements
break;
case CLICKHOUSE:
ctx.visit(function(N_JSONExtractKeys, getDataType(), field));
ctx.visit(function(N_toJSONString, getDataType(), function(N_JSONExtractKeys, OTHER, field)));
break;
case TRINO:

View File

@ -246,8 +246,8 @@ implements
}
case CLICKHOUSE: {
ctx.visit(function(N_toJSONString, getDataType(), array((List<Field<?>>)
flatMap(entries, e -> Arrays.<Field<?>>asList(e.key(), e.value()))
ctx.visit(function(N_toJSONString, getDataType(), function(N_MAP, OTHER,
flatMap(entries, e -> Arrays.<Field<?>>asList(e.key(), e.value())).toArray(EMPTY_FIELD)
)));
break;
}

View File

@ -44,6 +44,7 @@ import static org.jooq.impl.DSL.inline;
import static org.jooq.impl.DSL.inlined;
import static org.jooq.impl.DSL.jsonTable;
import static org.jooq.impl.DSL.select;
import static org.jooq.impl.DSL.systemName;
import static org.jooq.impl.JSONValue.Behaviour.DEFAULT;
import static org.jooq.impl.JSONValue.Behaviour.ERROR;
import static org.jooq.impl.JSONValue.Behaviour.NULL;
@ -195,6 +196,10 @@ implements
ctx.visit(function(N_JSONB_PATH_QUERY_FIRST, json.getDataType(), castIfNeeded(json, JSONB), DSL.field("cast({0} as jsonpath)", path)));
break;
case CLICKHOUSE:
ctx.visit(function(systemName("JSON_VALUE"), getDataType(), json, path));
break;