From 73ccac60c4c333401557db0978c414cead87cc45 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 12 Mar 2024 09:19:40 +0100 Subject: [PATCH] [jOOQ/jOOQ#7539] Support for SQLDialect.CLICKHOUSE - WIP --- .../main/java/org/jooq/JSONArrayNullStep.java | 2 +- .../java/org/jooq/JSONArrayReturningStep.java | 2 +- .../java/org/jooq/JSONObjectNullStep.java | 2 +- .../org/jooq/JSONObjectReturningStep.java | 2 +- jOOQ/src/main/java/org/jooq/impl/DSL.java | 100 +++++++++--------- .../java/org/jooq/impl/DeleteQueryImpl.java | 18 +++- jOOQ/src/main/java/org/jooq/impl/Iif.java | 1 + .../main/java/org/jooq/impl/JSONArray.java | 11 ++ .../java/org/jooq/impl/JSONArrayLength.java | 14 +-- .../java/org/jooq/impl/JSONBArrayLength.java | 12 +-- .../java/org/jooq/impl/JSONBGetAttribute.java | 7 ++ .../jooq/impl/JSONBGetAttributeAsText.java | 4 + .../java/org/jooq/impl/JSONBGetElement.java | 7 ++ .../org/jooq/impl/JSONBGetElementAsText.java | 4 + .../main/java/org/jooq/impl/JSONBKeys.java | 7 ++ .../java/org/jooq/impl/JSONGetAttribute.java | 7 ++ .../org/jooq/impl/JSONGetAttributeAsText.java | 4 + .../java/org/jooq/impl/JSONGetElement.java | 7 ++ .../org/jooq/impl/JSONGetElementAsText.java | 4 + .../src/main/java/org/jooq/impl/JSONKeys.java | 7 ++ .../main/java/org/jooq/impl/JSONObject.java | 7 ++ jOOQ/src/main/java/org/jooq/impl/Limit.java | 13 ++- .../src/main/java/org/jooq/impl/MetaImpl.java | 3 +- jOOQ/src/main/java/org/jooq/impl/Names.java | 6 ++ .../main/java/org/jooq/impl/ParserImpl.java | 10 +- .../java/org/jooq/impl/RowIsDistinctFrom.java | 3 +- .../main/java/org/jooq/impl/RowIsNull.java | 3 +- .../java/org/jooq/impl/UpdateQueryImpl.java | 18 +++- 28 files changed, 195 insertions(+), 90 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/JSONArrayNullStep.java b/jOOQ/src/main/java/org/jooq/JSONArrayNullStep.java index 8c6d2b7cce..9ad6495d81 100644 --- a/jOOQ/src/main/java/org/jooq/JSONArrayNullStep.java +++ b/jOOQ/src/main/java/org/jooq/JSONArrayNullStep.java @@ -75,7 +75,7 @@ public interface JSONArrayNullStep extends JSONArrayReturningStep { *

* Include NULL values in output JSON. */ - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) @NotNull @CheckReturnValue JSONArrayReturningStep nullOnNull(); diff --git a/jOOQ/src/main/java/org/jooq/JSONArrayReturningStep.java b/jOOQ/src/main/java/org/jooq/JSONArrayReturningStep.java index 91f54277d1..f521833c52 100644 --- a/jOOQ/src/main/java/org/jooq/JSONArrayReturningStep.java +++ b/jOOQ/src/main/java/org/jooq/JSONArrayReturningStep.java @@ -73,7 +73,7 @@ public interface JSONArrayReturningStep extends Field { /** * Add the RETURNING clause to the JSON ARRAY function. */ - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) @NotNull @CheckReturnValue Field returning(DataType returning); } diff --git a/jOOQ/src/main/java/org/jooq/JSONObjectNullStep.java b/jOOQ/src/main/java/org/jooq/JSONObjectNullStep.java index f9d68017ab..e9f79f7914 100644 --- a/jOOQ/src/main/java/org/jooq/JSONObjectNullStep.java +++ b/jOOQ/src/main/java/org/jooq/JSONObjectNullStep.java @@ -75,7 +75,7 @@ public interface JSONObjectNullStep extends JSONObjectReturningStep { *

* Include NULL values in output JSON. */ - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) @NotNull @CheckReturnValue JSONObjectReturningStep nullOnNull(); diff --git a/jOOQ/src/main/java/org/jooq/JSONObjectReturningStep.java b/jOOQ/src/main/java/org/jooq/JSONObjectReturningStep.java index 8daf5ac57b..b8599252fa 100644 --- a/jOOQ/src/main/java/org/jooq/JSONObjectReturningStep.java +++ b/jOOQ/src/main/java/org/jooq/JSONObjectReturningStep.java @@ -73,7 +73,7 @@ public interface JSONObjectReturningStep extends Field { /** * Add the RETURNING clause to the JSON OBJECT function. */ - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) @NotNull @CheckReturnValue 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 61c461b214..fae38b0f2b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -22924,7 +22924,7 @@ public class DSL { * The JSON_ARRAY function. */ @NotNull - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static JSONArrayNullStep jsonArray(Field... fields) { return new JSONArray(SQLDataType.JSON, Arrays.asList(fields)); } @@ -22933,7 +22933,7 @@ public class DSL { * The JSON_ARRAY function. */ @NotNull - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static JSONArrayNullStep jsonArray(Collection> fields) { return new JSONArray(SQLDataType.JSON, new QueryPartList<>(fields)); } @@ -22942,7 +22942,7 @@ public class DSL { * The JSONB_ARRAY function. */ @NotNull - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static JSONArrayNullStep jsonbArray(Field... fields) { return new JSONArray(SQLDataType.JSONB, Arrays.asList(fields)); } @@ -22951,7 +22951,7 @@ public class DSL { * The JSONB_ARRAY function. */ @NotNull - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static JSONArrayNullStep jsonbArray(Collection> fields) { return new JSONArray(SQLDataType.JSONB, new QueryPartList<>(fields)); } @@ -22960,7 +22960,7 @@ public class DSL { * The JSON_OBJECT function. */ @NotNull - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static JSONObjectNullStep jsonObject(JSONEntry... entries) { return new JSONObject(SQLDataType.JSON, Arrays.asList(entries)); } @@ -22969,7 +22969,7 @@ public class DSL { * The JSON_OBJECT function. */ @NotNull - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static JSONObjectNullStep jsonObject(Collection> entries) { return new JSONObject(SQLDataType.JSON, new QueryPartList<>(entries)); } @@ -22978,7 +22978,7 @@ public class DSL { * The JSONB_OBJECT function. */ @NotNull - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static JSONObjectNullStep jsonbObject(JSONEntry... entries) { return new JSONObject(SQLDataType.JSONB, Arrays.asList(entries)); } @@ -22987,7 +22987,7 @@ public class DSL { * The JSONB_OBJECT function. */ @NotNull - @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static JSONObjectNullStep jsonbObject(Collection> entries) { return new JSONObject(SQLDataType.JSONB, new QueryPartList<>(entries)); } @@ -23001,7 +23001,7 @@ public class DSL { * @param index is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonGetElement(JSON field, int index) { return new JSONGetElement(Tools.field(field), Tools.field(index)); } @@ -23014,7 +23014,7 @@ public class DSL { * @param field is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonGetElement(JSON field, Field index) { return new JSONGetElement(Tools.field(field), index); } @@ -23027,7 +23027,7 @@ public class DSL { * @param index is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonGetElement(Field field, int index) { return new JSONGetElement(field, Tools.field(index)); } @@ -23038,7 +23038,7 @@ public class DSL { * Access an array element from a JSON array expression. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonGetElement(Field field, Field index) { return new JSONGetElement(field, index); } @@ -23052,7 +23052,7 @@ public class DSL { * @param index is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonbGetElement(JSONB field, int index) { return new JSONBGetElement(Tools.field(field), Tools.field(index)); } @@ -23065,7 +23065,7 @@ public class DSL { * @param field is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonbGetElement(JSONB field, Field index) { return new JSONBGetElement(Tools.field(field), index); } @@ -23078,7 +23078,7 @@ public class DSL { * @param index is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonbGetElement(Field field, int index) { return new JSONBGetElement(field, Tools.field(index)); } @@ -23089,7 +23089,7 @@ public class DSL { * Access an array element from a JSONB array expression. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonbGetElement(Field field, Field index) { return new JSONBGetElement(field, index); } @@ -23103,7 +23103,7 @@ public class DSL { * @param index is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonGetElementAsText(JSON field, int index) { return new JSONGetElementAsText(Tools.field(field), Tools.field(index)); } @@ -23116,7 +23116,7 @@ public class DSL { * @param field is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonGetElementAsText(JSON field, Field index) { return new JSONGetElementAsText(Tools.field(field), index); } @@ -23129,7 +23129,7 @@ public class DSL { * @param index is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonGetElementAsText(Field field, int index) { return new JSONGetElementAsText(field, Tools.field(index)); } @@ -23140,7 +23140,7 @@ public class DSL { * Access an array element from a JSON array expression and return it as a string. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonGetElementAsText(Field field, Field index) { return new JSONGetElementAsText(field, index); } @@ -23154,7 +23154,7 @@ public class DSL { * @param index is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonbGetElementAsText(JSONB field, int index) { return new JSONBGetElementAsText(Tools.field(field), Tools.field(index)); } @@ -23167,7 +23167,7 @@ public class DSL { * @param field is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonbGetElementAsText(JSONB field, Field index) { return new JSONBGetElementAsText(Tools.field(field), index); } @@ -23180,7 +23180,7 @@ public class DSL { * @param index is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonbGetElementAsText(Field field, int index) { return new JSONBGetElementAsText(field, Tools.field(index)); } @@ -23191,7 +23191,7 @@ public class DSL { * Access an array element from a JSONB array expression and return it as a string. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonbGetElementAsText(Field field, Field index) { return new JSONBGetElementAsText(field, index); } @@ -23205,7 +23205,7 @@ public class DSL { * @param attribute is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonGetAttribute(JSON field, @Stringly.Param String attribute) { return new JSONGetAttribute(Tools.field(field), Tools.field(attribute)); } @@ -23218,7 +23218,7 @@ public class DSL { * @param field is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonGetAttribute(JSON field, Field attribute) { return new JSONGetAttribute(Tools.field(field), attribute); } @@ -23231,7 +23231,7 @@ public class DSL { * @param attribute is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonGetAttribute(Field field, @Stringly.Param String attribute) { return new JSONGetAttribute(field, Tools.field(attribute)); } @@ -23242,7 +23242,7 @@ public class DSL { * Access an object attribute value from a JSON object expression. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonGetAttribute(Field field, Field attribute) { return new JSONGetAttribute(field, attribute); } @@ -23256,7 +23256,7 @@ public class DSL { * @param attribute is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonbGetAttribute(JSONB field, @Stringly.Param String attribute) { return new JSONBGetAttribute(Tools.field(field), Tools.field(attribute)); } @@ -23269,7 +23269,7 @@ public class DSL { * @param field is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonbGetAttribute(JSONB field, Field attribute) { return new JSONBGetAttribute(Tools.field(field), attribute); } @@ -23282,7 +23282,7 @@ public class DSL { * @param attribute is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonbGetAttribute(Field field, @Stringly.Param String attribute) { return new JSONBGetAttribute(field, Tools.field(attribute)); } @@ -23293,7 +23293,7 @@ public class DSL { * Access an object attribute value from a JSONB object expression. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonbGetAttribute(Field field, Field attribute) { return new JSONBGetAttribute(field, attribute); } @@ -23307,7 +23307,7 @@ public class DSL { * @param attribute is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonGetAttributeAsText(JSON field, @Stringly.Param String attribute) { return new JSONGetAttributeAsText(Tools.field(field), Tools.field(attribute)); } @@ -23320,7 +23320,7 @@ public class DSL { * @param field is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonGetAttributeAsText(JSON field, Field attribute) { return new JSONGetAttributeAsText(Tools.field(field), attribute); } @@ -23333,7 +23333,7 @@ public class DSL { * @param attribute is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonGetAttributeAsText(Field field, @Stringly.Param String attribute) { return new JSONGetAttributeAsText(field, Tools.field(attribute)); } @@ -23344,7 +23344,7 @@ public class DSL { * Access an object attribute value from a JSON object expression and return it as string. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonGetAttributeAsText(Field field, Field attribute) { return new JSONGetAttributeAsText(field, attribute); } @@ -23359,7 +23359,7 @@ public class DSL { * @param attribute is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonbGetAttributeAsText(JSONB field, @Stringly.Param String attribute) { return new JSONBGetAttributeAsText(Tools.field(field), Tools.field(attribute)); } @@ -23373,7 +23373,7 @@ public class DSL { * @param field is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonbGetAttributeAsText(JSONB field, Field attribute) { return new JSONBGetAttributeAsText(Tools.field(field), attribute); } @@ -23387,7 +23387,7 @@ public class DSL { * @param attribute is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonbGetAttributeAsText(Field field, @Stringly.Param String attribute) { return new JSONBGetAttributeAsText(field, Tools.field(attribute)); } @@ -23399,7 +23399,7 @@ public class DSL { * string. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonbGetAttributeAsText(Field field, Field attribute) { return new JSONBGetAttributeAsText(field, attribute); } @@ -23412,7 +23412,7 @@ public class DSL { * @param field is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonArrayLength(JSON field) { return new JSONArrayLength(Tools.field(field)); } @@ -23423,7 +23423,7 @@ public class DSL { * Calculate the length of a JSON array. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonArrayLength(Field field) { return new JSONArrayLength(field); } @@ -23436,7 +23436,7 @@ public class DSL { * @param field is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonbArrayLength(JSONB field) { return new JSONBArrayLength(Tools.field(field)); } @@ -23447,7 +23447,7 @@ public class DSL { * Calculate the length of a JSONB array. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) public static Field jsonbArrayLength(Field field) { return new JSONBArrayLength(field); } @@ -23460,7 +23460,7 @@ public class DSL { * @param field is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonKeys(JSON field) { return new JSONKeys(Tools.field(field)); } @@ -23471,7 +23471,7 @@ public class DSL { * Retrieve all keys from a JSON object as an array of strings. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonKeys(Field field) { return new JSONKeys(field); } @@ -23484,7 +23484,7 @@ public class DSL { * @param field is wrapped as {@link DSL#val(Object)}. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonbKeys(JSONB field) { return new JSONBKeys(Tools.field(field)); } @@ -23495,7 +23495,7 @@ public class DSL { * Retrieve all keys from a JSONB object as an array of strings. */ @NotNull - @Support({ MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static Field jsonbKeys(Field field) { return new JSONBKeys(field); } @@ -32057,7 +32057,7 @@ public class DSL { * The ntile([number]) over ([analytic clause]) function. */ @NotNull - @Support({ CUBRID, DUCKDB, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, CUBRID, DUCKDB, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static WindowOverStep ntile(int number) { return new Ntile(inline(number)); } @@ -32066,7 +32066,7 @@ public class DSL { * The ntile([number]) over ([analytic clause]) function. */ @NotNull - @Support({ CUBRID, DUCKDB, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) + @Support({ CLICKHOUSE, CUBRID, DUCKDB, FIREBIRD, H2, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO, YUGABYTEDB }) public static WindowOverStep ntile(Field number) { return new Ntile(number); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java index af7c48d9fa..967083773d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java @@ -365,6 +365,7 @@ implements moreWhere = trueCondition(); Condition where = DSL.and(getWhere(), moreWhere); + boolean noQualifyInWhere = NO_SUPPORT_QUALIFY_IN_WHERE.contains(ctx.dialect()); if (limit != null && NO_SUPPORT_LIMIT.contains(ctx.dialect()) || !orderBy.isEmpty() && NO_SUPPORT_ORDER_BY_LIMIT.contains(ctx.dialect())) { Field[] keyFields = @@ -379,10 +380,16 @@ implements .visit(K_WHERE).sql(' '); ctx.paramTypeIf(ParamType.INLINED, noSupportParametersInWhere, c -> { + if (noQualifyInWhere) + ctx.data(DATA_UNQUALIFY_LOCAL_SCOPE, true); + if (keyFields.length == 1) c.visit(keyFields[0].in(select((Field) keyFields[0]).from(table()).where(where).orderBy(orderBy).limit(limit))); else c.visit(row(keyFields).in(select(keyFields).from(table()).where(where).orderBy(orderBy).limit(limit))); + + if (noQualifyInWhere) + ctx.data(DATA_UNQUALIFY_LOCAL_SCOPE, false); }); ctx.end(DELETE_WHERE); @@ -394,10 +401,13 @@ implements ctx.paramTypeIf(ParamType.INLINED, noSupportParametersInWhere, c -> { c.formatSeparator().visit(K_WHERE).sql(' '); - if (NO_SUPPORT_QUALIFY_IN_WHERE.contains(ctx.dialect())) - ctx.data(DATA_UNQUALIFY_LOCAL_SCOPE, true, c1 -> c1.visit(where)); - else - ctx.visit(where); + if (noQualifyInWhere) + ctx.data(DATA_UNQUALIFY_LOCAL_SCOPE, true); + + ctx.visit(where); + + if (noQualifyInWhere) + ctx.data(DATA_UNQUALIFY_LOCAL_SCOPE, false); }); ctx.end(DELETE_WHERE); diff --git a/jOOQ/src/main/java/org/jooq/impl/Iif.java b/jOOQ/src/main/java/org/jooq/impl/Iif.java index bf063a866b..328e5c25a6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Iif.java +++ b/jOOQ/src/main/java/org/jooq/impl/Iif.java @@ -67,6 +67,7 @@ final class Iif extends AbstractField implements QOM.Iif { public final void accept(Context ctx) { switch (ctx.family()) { + case CLICKHOUSE: case MARIADB: case MYSQL: diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONArray.java b/jOOQ/src/main/java/org/jooq/impl/JSONArray.java index 5d0c4d86dd..a0c599d442 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONArray.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONArray.java @@ -206,6 +206,17 @@ implements + + case CLICKHOUSE: { + + // [#7539] ARRAY types can't mix data types, so use TUPLE for degrees > 1 + if (fields.size() > 1) + ctx.visit(function(N_toJSONString, getDataType(), function(N_TUPLE, OTHER, fields.toArray(EMPTY_FIELD)))); + else + ctx.visit(function(N_toJSONString, getDataType(), array(fields))); + + break; + } case TRINO: { // [#11485] While JSON_OBJECT is supported in Trino, it seems there are a few show stopping bugs, including: diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONArrayLength.java b/jOOQ/src/main/java/org/jooq/impl/JSONArrayLength.java index 6fe81e76b4..96f0e2559f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONArrayLength.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONArrayLength.java @@ -104,11 +104,7 @@ implements case MYSQL: return true; - - - case POSTGRES: - case SQLITE: - case YUGABYTEDB: + case CLICKHOUSE: return true; default: @@ -140,12 +136,8 @@ implements ctx.visit(function(N_JSON_LENGTH, getDataType(), field)); break; - - - case POSTGRES: - case SQLITE: - case YUGABYTEDB: - ctx.visit(function(N_JSON_ARRAY_LENGTH, getDataType(), field)); + case CLICKHOUSE: + ctx.visit(function(N_JSONArrayLength, getDataType(), field)); break; default: diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONBArrayLength.java b/jOOQ/src/main/java/org/jooq/impl/JSONBArrayLength.java index 03c15c8210..e68b45f6af 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONBArrayLength.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONBArrayLength.java @@ -107,10 +107,7 @@ implements case SQLITE: return true; - - - case POSTGRES: - case YUGABYTEDB: + case CLICKHOUSE: return true; default: @@ -146,11 +143,8 @@ implements ctx.visit(function(N_JSON_ARRAY_LENGTH, getDataType(), field)); break; - - - case POSTGRES: - case YUGABYTEDB: - ctx.visit(function(N_JSONB_ARRAY_LENGTH, getDataType(), field)); + case CLICKHOUSE: + ctx.visit(function(N_JSONArrayLength, getDataType(), field)); break; default: diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttribute.java b/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttribute.java index 0e611fd77a..a5d052b843 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttribute.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttribute.java @@ -115,6 +115,9 @@ implements case TRINO: return false; + case CLICKHOUSE: + return false; + default: return false; } @@ -166,6 +169,10 @@ implements ctx.visit(function(N_JSON_EXTRACT, JSONB, field, inline("$.").concat(attribute))); break; + case CLICKHOUSE: + ctx.visit(function(N_JSONExtractRaw, JSONB, field, isub(attribute, one()))); + break; + default: ctx.sql('(').visit(field).sql("->").visit(attribute).sql(')'); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttributeAsText.java b/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttributeAsText.java index ec34b7e968..4d00a5378c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttributeAsText.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONBGetAttributeAsText.java @@ -138,6 +138,10 @@ implements ctx.visit(function(N_JSON_EXTRACT, JSONB, field, inline("$.").concat(attribute))); break; + case CLICKHOUSE: + ctx.visit(function(N_JSONExtractString, JSONB, field, isub(attribute, one()))); + break; + default: ctx.sql('(').visit(field).sql("->>").visit(attribute).sql(')'); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONBGetElement.java b/jOOQ/src/main/java/org/jooq/impl/JSONBGetElement.java index 0adb4ba9b8..13b74bd862 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONBGetElement.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONBGetElement.java @@ -115,6 +115,9 @@ implements case TRINO: return false; + case CLICKHOUSE: + return false; + default: return false; } @@ -161,6 +164,10 @@ implements ctx.visit(function(N_JSON_EXTRACT, JSONB, field, inline("$[").concat(index).concat(inline("]")))); break; + case CLICKHOUSE: + ctx.visit(function(N_JSONExtractRaw, JSONB, field, isub(index, one()))); + break; + default: ctx.sql('(').visit(field).sql("->").visit(index).sql(')'); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONBGetElementAsText.java b/jOOQ/src/main/java/org/jooq/impl/JSONBGetElementAsText.java index 965c74ad3a..ad393ad788 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONBGetElementAsText.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONBGetElementAsText.java @@ -136,6 +136,10 @@ implements ctx.visit(function(N_JSON_EXTRACT, JSONB, field, inline("$[").concat(index).concat(inline("]")))); break; + case CLICKHOUSE: + ctx.visit(function(N_JSONExtractRaw, JSONB, field, isub(index, one()))); + break; + default: ctx.sql('(').visit(field).sql("->>").visit(index).sql(')'); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java b/jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java index e2d0d7f5ca..8a5e6b65df 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java @@ -111,6 +111,9 @@ implements case SQLITE: return false; + case CLICKHOUSE: + return true; + case TRINO: return false; @@ -155,6 +158,10 @@ implements ctx.visit(DSL.field(select(jsonbArrayAgg(DSL.field(name("key")))).from("json_each({0})", field))); break; + case CLICKHOUSE: + ctx.visit(function(N_JSONExtractKeys, getDataType(), field)); + break; + case TRINO: ctx.visit(DSL.cast(function(N_MAP_KEYS, OTHER, DSL.field("cast({0} as map(varchar, json))", OTHER, field)), JSON)); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONGetAttribute.java b/jOOQ/src/main/java/org/jooq/impl/JSONGetAttribute.java index a697f63ed4..fb545ee94d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONGetAttribute.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONGetAttribute.java @@ -115,6 +115,9 @@ implements case TRINO: return false; + case CLICKHOUSE: + return false; + default: return false; } @@ -166,6 +169,10 @@ implements ctx.visit(function(N_JSON_EXTRACT, JSON, field, inline("$.").concat(attribute))); break; + case CLICKHOUSE: + ctx.visit(function(N_JSONExtractRaw, JSON, field, isub(attribute, one()))); + break; + default: ctx.sql('(').visit(field).sql("->").visit(attribute).sql(')'); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONGetAttributeAsText.java b/jOOQ/src/main/java/org/jooq/impl/JSONGetAttributeAsText.java index 9467a305ab..de6b6dd6c8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONGetAttributeAsText.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONGetAttributeAsText.java @@ -139,6 +139,10 @@ implements ctx.visit(function(N_JSON_EXTRACT, JSON, field, inline("$.").concat(attribute))); break; + case CLICKHOUSE: + ctx.visit(function(N_JSONExtractString, JSON, field, isub(attribute, one()))); + break; + default: ctx.sql('(').visit(field).sql("->>").visit(attribute).sql(')'); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONGetElement.java b/jOOQ/src/main/java/org/jooq/impl/JSONGetElement.java index 2cd545f187..54af914994 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONGetElement.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONGetElement.java @@ -115,6 +115,9 @@ implements case TRINO: return false; + case CLICKHOUSE: + return false; + default: return false; } @@ -161,6 +164,10 @@ implements ctx.visit(function(N_JSON_EXTRACT, JSON, field, inline("$[").concat(index).concat(inline("]")))); break; + case CLICKHOUSE: + ctx.visit(function(N_JSONExtractRaw, JSON, field, isub(index, one()))); + break; + default: ctx.sql('(').visit(field).sql("->").visit(index).sql(')'); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONGetElementAsText.java b/jOOQ/src/main/java/org/jooq/impl/JSONGetElementAsText.java index 68adff8534..42adf874a5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONGetElementAsText.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONGetElementAsText.java @@ -136,6 +136,10 @@ implements ctx.visit(function(N_JSON_EXTRACT, JSON, field, inline("$[").concat(index).concat(inline("]")))); break; + case CLICKHOUSE: + ctx.visit(function(N_JSONExtractString, JSON, field, isub(index, one()))); + break; + default: ctx.sql('(').visit(field).sql("->>").visit(index).sql(')'); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONKeys.java b/jOOQ/src/main/java/org/jooq/impl/JSONKeys.java index 7b7b29047a..87f5a72ae4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONKeys.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONKeys.java @@ -109,6 +109,9 @@ implements case SQLITE: return false; + case CLICKHOUSE: + return true; + case TRINO: return false; @@ -149,6 +152,10 @@ implements ctx.visit(DSL.field(select(jsonArrayAgg(DSL.field(name("key")))).from("json_each({0})", field))); break; + case CLICKHOUSE: + ctx.visit(function(N_JSONExtractKeys, getDataType(), field)); + break; + case TRINO: ctx.visit(DSL.cast(function(N_MAP_KEYS, OTHER, DSL.field("cast({0} as map(varchar, json))", OTHER, field)), JSON)); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java index 09c494a129..281e7c235f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java @@ -245,6 +245,13 @@ implements break; } + case CLICKHOUSE: { + ctx.visit(function(N_toJSONString, getDataType(), array((List>) + flatMap(entries, e -> Arrays.>asList(e.key(), e.value())) + ))); + break; + } + case TRINO: { // [#11485] While JSON_OBJECT is supported in Trino, it seems there are a few show stopping bugs, including: // https://github.com/trinodb/trino/issues/16522 diff --git a/jOOQ/src/main/java/org/jooq/impl/Limit.java b/jOOQ/src/main/java/org/jooq/impl/Limit.java index 6c9aa45fdc..4bb66de624 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Limit.java +++ b/jOOQ/src/main/java/org/jooq/impl/Limit.java @@ -183,8 +183,19 @@ final class Limit extends AbstractQueryPart implements UTransient { break; } + case CLICKHOUSE: { + + // Use standard OFFSET .. FETCH only with WITH TIES to work around + // https://github.com/ClickHouse/ClickHouse/issues/61195 + if (!withTies() && !percent()) + acceptDefault(ctx, castMode); + else + acceptStandard(ctx, castMode); + + break; + } + - case CLICKHOUSE: case DERBY: case TRINO: { acceptStandard(ctx, castMode); diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java index dac01f1982..3c30f052bf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java @@ -46,6 +46,7 @@ import static java.util.Collections.emptyList; // ... // ... // ... +import static org.jooq.SQLDialect.CLICKHOUSE; // ... // ... import static org.jooq.SQLDialect.DERBY; @@ -152,7 +153,7 @@ import org.jooq.tools.StringUtils; final class MetaImpl extends AbstractMeta { private static final JooqLogger log = JooqLogger.getLogger(MetaImpl.class); - private static final Set INVERSE_SCHEMA_CATALOG = SQLDialect.supportedBy(MARIADB, MYSQL); + private static final Set INVERSE_SCHEMA_CATALOG = SQLDialect.supportedBy(CLICKHOUSE, MARIADB, MYSQL); private static final Set CURRENT_TIMESTAMP_COLUMN_DEFAULT = SQLDialect.supportedBy(MARIADB, MYSQL); private static final Set EXPRESSION_COLUMN_DEFAULT = SQLDialect.supportedBy(DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB); private static final Set NO_SUPPORT_SCHEMAS = SQLDialect.supportedBy(FIREBIRD, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index f983d825e5..eb1c83f23a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -295,11 +295,13 @@ final class Names { static final Name N_TIMESTAMPSUB = systemName("timestampsub"); static final Name N_TIMESTAMP_DIFF = systemName("timestamp_diff"); static final Name N_TIMESTAMP_SUB = systemName("timestamp_sub"); + static final Name N_toJSONString = systemName("toJSONString"); static final Name N_TO_CLOB = systemName("to_clob"); static final Name N_TO_NUMBER = systemName("to_number"); static final Name N_TO_VARIANT = systemName("to_variant"); static final Name N_TRUNCATE = systemName("truncate"); static final Name N_TRUNCNUM = systemName("truncnum"); + static final Name N_TUPLE = systemName("tuple"); static final Name N_UNNEST = systemName("unnest"); static final Name N_USER = systemName("user"); static final Name N_UUID_TO_CHAR = systemName("uuid_to_char"); @@ -453,6 +455,7 @@ final class Names { static final Name N_INSERTING = systemName("inserting"); static final Name N_INSTR = systemName("instr"); static final Name N_ISJSON = systemName("isjson"); + static final Name N_JSONArrayLength = systemName("JSONArrayLength"); static final Name N_JSONB_ARRAY = systemName("jsonb_array"); static final Name N_JSONB_ARRAY_LENGTH = systemName("jsonb_array_length"); static final Name N_JSONB_GET_ATTRIBUTE = systemName("jsonb_get_attribute"); @@ -465,6 +468,9 @@ final class Names { static final Name N_JSONB_REMOVE = systemName("jsonb_remove"); static final Name N_JSONB_REPLACE = systemName("jsonb_replace"); static final Name N_JSONB_SET = systemName("jsonb_set"); + static final Name N_JSONExtractKeys = systemName("JSONExtractKeys"); + static final Name N_JSONExtractRaw = systemName("JSONExtractRaw"); + static final Name N_JSONExtractString = systemName("JSONExtractString"); static final Name N_JSON_ARRAY = systemName("json_array"); static final Name N_JSON_ARRAY_LENGTH = systemName("json_array_length"); static final Name N_JSON_EXTRACT = systemName("json_extract"); diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 50b4f3fe35..4184f0c72d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -9047,9 +9047,9 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return field; else if ((field = parseFieldJSONLiteralIf()) != null) return field; - else if (parseFunctionNameIf("JSON_ARRAY_LENGTH", "JSON_LENGTH")) + else if (parseFunctionNameIf("JSON_ARRAY_LENGTH", "JSON_LENGTH", "JSONARRAYLENGTH")) return parseFunctionArgs1(DSL::jsonArrayLength); - else if (parseFunctionNameIf("JSON_KEYS")) + else if (parseFunctionNameIf("JSON_KEYS", "JSONExtractKeys")) return parseFunctionArgs1(DSL::jsonKeys); else if (parseFunctionNameIf("JSON_INSERT")) return parseFunctionArgs3(DSL::jsonInsert); @@ -14308,7 +14308,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { - if (parseIf("=") || parseKeywordIf("EQ")) + if (parseIf("==") || parseIf("=") || parseKeywordIf("EQ")) return Comparator.EQUALS; else if (parseIf("!=") || parseIf("<>") || parseIf("^=") || parseKeywordIf("NE")) return Comparator.NOT_EQUALS; @@ -14671,7 +14671,9 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } private final boolean peekKeyword(String keyword, boolean updatePosition, boolean peekIntoParens, boolean requireFunction) { - boolean caseSensitive = Character.isLowerCase(keyword.charAt(0)); + boolean caseSensitive = + Character.isLowerCase(keyword.charAt(0)) + || Character.isLowerCase(keyword.charAt(keyword.length() - 1)); int length = keyword.length(); int p = position(); diff --git a/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java b/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java index 8e542814a9..166d81d3d6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java @@ -42,6 +42,7 @@ import static org.jooq.Comparator.IS_NOT_DISTINCT_FROM; // ... // ... // ... +import static org.jooq.SQLDialect.CLICKHOUSE; import static org.jooq.SQLDialect.CUBRID; // ... import static org.jooq.SQLDialect.DERBY; @@ -86,7 +87,7 @@ import org.jooq.impl.QOM.UNotYetImplemented; * @author Lukas Eder */ final class RowIsDistinctFrom extends AbstractCondition implements UNotYetImplemented { - private static final Set EMULATE_DISTINCT = SQLDialect.supportedBy(CUBRID, DERBY); + private static final Set EMULATE_DISTINCT = SQLDialect.supportedBy(CLICKHOUSE, CUBRID, DERBY); // An emulation may be required only for the version where a subquery is used // E.g. in HSQLDB: https://sourceforge.net/p/hsqldb/bugs/1579/ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java b/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java index 6fdc43e938..63f524a068 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java @@ -42,6 +42,7 @@ import static java.util.Arrays.asList; // ... // ... // ... +import static org.jooq.SQLDialect.CLICKHOUSE; // ... import static org.jooq.SQLDialect.CUBRID; // ... @@ -83,7 +84,7 @@ final class RowIsNull extends AbstractCondition implements QOM.RowIsNull { // Currently not yet supported in SQLite: // https://www.sqlite.org/rowvalue.html - static final Set EMULATE_NULL_ROW = SQLDialect.supportedBy(CUBRID, DERBY, DUCKDB, FIREBIRD, HSQLDB, MARIADB, MYSQL, SQLITE, TRINO); + static final Set EMULATE_NULL_ROW = SQLDialect.supportedBy(CLICKHOUSE, CUBRID, DERBY, DUCKDB, FIREBIRD, HSQLDB, MARIADB, MYSQL, SQLITE, TRINO); private final Row row; diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java index 14db13d889..cd8c591e0a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java @@ -785,6 +785,7 @@ implements acceptFrom(ctx); + boolean noQualifyInWhere = NO_SUPPORT_QUALIFY_IN_WHERE.contains(ctx.dialect()); if (limit != null && NO_SUPPORT_LIMIT.contains(ctx.dialect()) || !orderBy.isEmpty() && NO_SUPPORT_ORDER_BY_LIMIT.contains(ctx.dialect())) { Field[] keyFields = @@ -798,11 +799,17 @@ implements .formatSeparator() .visit(K_WHERE).sql(' '); + if (noQualifyInWhere) + ctx.data(DATA_UNQUALIFY_LOCAL_SCOPE, true); + if (keyFields.length == 1) ctx.visit(keyFields[0].in(select((Field) keyFields[0]).from(table()).where(getWhere()).orderBy(orderBy).limit(limit))); else ctx.visit(row(keyFields).in(select(keyFields).from(table()).where(getWhere()).orderBy(orderBy).limit(limit))); + if (noQualifyInWhere) + ctx.data(DATA_UNQUALIFY_LOCAL_SCOPE, false); + ctx.end(UPDATE_WHERE); } else { @@ -812,10 +819,13 @@ implements ctx.formatSeparator() .visit(K_WHERE).sql(' '); - if (NO_SUPPORT_QUALIFY_IN_WHERE.contains(ctx.dialect())) - ctx.data(DATA_UNQUALIFY_LOCAL_SCOPE, true, c -> c.visit(getWhere())); - else - ctx.visit(getWhere()); + if (noQualifyInWhere) + ctx.data(DATA_UNQUALIFY_LOCAL_SCOPE, true); + + ctx.visit(getWhere()); + + if (noQualifyInWhere) + ctx.data(DATA_UNQUALIFY_LOCAL_SCOPE, false); } else if (REQUIRES_WHERE.contains(ctx.dialect())) ctx.formatSeparator()