diff --git a/jOOQ/src/main/java/org/jooq/JSONEntryValueStep.java b/jOOQ/src/main/java/org/jooq/JSONEntryValueStep.java index 36483e2fc1..93f5d8d721 100644 --- a/jOOQ/src/main/java/org/jooq/JSONEntryValueStep.java +++ b/jOOQ/src/main/java/org/jooq/JSONEntryValueStep.java @@ -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 }) JSONEntry 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 }) JSONEntry value(Field value); /** * The JSON entry value. */ @NotNull - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) JSONEntry value(Select> value); } diff --git a/jOOQ/src/main/java/org/jooq/JSONValueReturningStep.java b/jOOQ/src/main/java/org/jooq/JSONValueReturningStep.java index b371bfd205..8caa822680 100644 --- a/jOOQ/src/main/java/org/jooq/JSONValueReturningStep.java +++ b/jOOQ/src/main/java/org/jooq/JSONValueReturningStep.java @@ -70,7 +70,7 @@ public interface JSONValueReturningStep extends Field { /** * Add the RETURNING clause to the JSON VALUE function. */ - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) @NotNull Field returning(DataType returning); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 1d78974815..f8194d12ff 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -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 jsonValue(Field 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 jsonValue(Field json, Field 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 jsonbValue(Field 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 jsonbValue(Field json, Field 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 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 JSONEntry jsonEntry(Field 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 JSONEntry 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 JSONEntry jsonEntry(String key, Field 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 JSONEntry jsonEntry(String key, Select> 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 JSONEntry jsonEntry(Field 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 JSONEntry jsonEntry(Field key, Field 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 JSONEntry jsonEntry(Field key, Select> 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 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 jsonObject(Field 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 jsonObject(Field key, Select> 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 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 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 jsonbObject(Field 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 jsonbObject(Field key, Select> 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 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 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 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 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 field, Field 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 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 field, Field path) { return new JSONExists(field, Tools.nullSafe(path)); } diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttribute.java b/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttribute.java index a5d052b843..6583f5e81d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttribute.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttribute.java @@ -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: diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttributeAsText.java b/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttributeAsText.java index 4d00a5378c..4e7377f570 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttributeAsText.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttributeAsText.java @@ -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: diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONExists.java b/jOOQ/src/main/java/org/jooq/impl/JSONExists.java index 7cf72ef1e6..c415f868a0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONExists.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONExists.java @@ -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(", "); diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONGetAttribute.java b/jOOQ/src/main/java/org/jooq/impl/JSONGetAttribute.java index fb545ee94d..832f8cd235 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONGetAttribute.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONGetAttribute.java @@ -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: diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONGetAttributeAsText.java b/jOOQ/src/main/java/org/jooq/impl/JSONGetAttributeAsText.java index de6b6dd6c8..fd95adba6a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONGetAttributeAsText.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONGetAttributeAsText.java @@ -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: diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONKeys.java b/jOOQ/src/main/java/org/jooq/impl/JSONKeys.java index 87f5a72ae4..c8eaf6cabf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONKeys.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONKeys.java @@ -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: diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java index 281e7c235f..be66da318a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java @@ -246,8 +246,8 @@ implements } case CLICKHOUSE: { - ctx.visit(function(N_toJSONString, getDataType(), array((List>) - flatMap(entries, e -> Arrays.>asList(e.key(), e.value())) + ctx.visit(function(N_toJSONString, getDataType(), function(N_MAP, OTHER, + flatMap(entries, e -> Arrays.>asList(e.key(), e.value())).toArray(EMPTY_FIELD) ))); break; } diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONValue.java b/jOOQ/src/main/java/org/jooq/impl/JSONValue.java index 5d3ce31742..e6f61d8148 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONValue.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONValue.java @@ -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; +