diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java index 0aa439f929..af79fc65f2 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -198,6 +198,7 @@ import org.jooq.meta.jaxb.VisibilityModifier; // ... // ... import org.jooq.meta.postgres.PostgresRoutineDefinition; +// ... import org.jooq.tools.JooqLogger; import org.jooq.tools.StopWatch; import org.jooq.tools.StringUtils; @@ -8484,6 +8485,10 @@ public class JavaGenerator extends AbstractGenerator { + + + + out.println("}"); for (ParameterDefinition parameter : routine.getInParameters()) { diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultDataTypeDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultDataTypeDefinition.java index f3e23b216c..bad10233ca 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultDataTypeDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultDataTypeDefinition.java @@ -449,6 +449,7 @@ public class DefaultDataTypeDefinition implements DataTypeDefinition { + return false; diff --git a/jOOQ/src/main/java/org/jooq/DSLContext.java b/jOOQ/src/main/java/org/jooq/DSLContext.java index 3ca43ed886..7e3a24dc84 100644 --- a/jOOQ/src/main/java/org/jooq/DSLContext.java +++ b/jOOQ/src/main/java/org/jooq/DSLContext.java @@ -11032,7 +11032,7 @@ public interface DSLContext extends Scope { * @see DSL#set(Name, Param) */ @NotNull @CheckReturnValue - @Support({ MYSQL, POSTGRES, YUGABYTEDB }) + @Support({ MARIADB, MYSQL, POSTGRES, YUGABYTEDB }) RowCountQuery set(Name name, Param value); /** diff --git a/jOOQ/src/main/java/org/jooq/Field.java b/jOOQ/src/main/java/org/jooq/Field.java index c827f1e867..c0675605ed 100644 --- a/jOOQ/src/main/java/org/jooq/Field.java +++ b/jOOQ/src/main/java/org/jooq/Field.java @@ -1259,7 +1259,7 @@ extends * Create a condition to check if this field contains JSON data. */ @NotNull - @Support({ MYSQL }) + @Support({ MARIADB, MYSQL }) Condition isJson(); /** @@ -1268,7 +1268,7 @@ extends * Create a condition to check if this field does not contain JSON data. */ @NotNull - @Support({ MYSQL }) + @Support({ MARIADB, MYSQL }) Condition isNotJson(); // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/InsertOnDuplicateStep.java b/jOOQ/src/main/java/org/jooq/InsertOnDuplicateStep.java index 42549cef73..e5ba11ab7b 100644 --- a/jOOQ/src/main/java/org/jooq/InsertOnDuplicateStep.java +++ b/jOOQ/src/main/java/org/jooq/InsertOnDuplicateStep.java @@ -106,14 +106,14 @@ public interface InsertOnDuplicateStep extends InsertReturning * Add a ON CONFLICT ON CONSTRAINT clause to this INSERT statement. */ @NotNull @CheckReturnValue - @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, POSTGRES, YUGABYTEDB }) + @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, YUGABYTEDB }) InsertOnConflictDoUpdateStep onConflictOnConstraint(Constraint constraint); /** * Add a ON CONFLICT ON CONSTRAINT clause to this INSERT statement. */ @NotNull @CheckReturnValue - @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, POSTGRES, YUGABYTEDB }) + @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, YUGABYTEDB }) InsertOnConflictDoUpdateStep onConflictOnConstraint(Name constraint); /** diff --git a/jOOQ/src/main/java/org/jooq/InsertQuery.java b/jOOQ/src/main/java/org/jooq/InsertQuery.java index 2d5121e9f7..320f082c3b 100644 --- a/jOOQ/src/main/java/org/jooq/InsertQuery.java +++ b/jOOQ/src/main/java/org/jooq/InsertQuery.java @@ -143,7 +143,7 @@ public interface InsertQuery extends StoreQuery, Insert, * ON CONFLICT ON CONSTRAINT clause in this INSERT * statement. */ - @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, POSTGRES, YUGABYTEDB }) + @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, YUGABYTEDB }) void onConflictOnConstraint(Name constraint); /** @@ -151,7 +151,7 @@ public interface InsertQuery extends StoreQuery, Insert, * ON CONFLICT ON CONSTRAINT clause in this INSERT * statement. */ - @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, POSTGRES, YUGABYTEDB }) + @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, YUGABYTEDB }) void onConflictOnConstraint(Constraint constraint); /** diff --git a/jOOQ/src/main/java/org/jooq/JSONObjectAggNullStep.java b/jOOQ/src/main/java/org/jooq/JSONObjectAggNullStep.java index c036ab29ee..8286bfcb00 100644 --- a/jOOQ/src/main/java/org/jooq/JSONObjectAggNullStep.java +++ b/jOOQ/src/main/java/org/jooq/JSONObjectAggNullStep.java @@ -48,6 +48,7 @@ import static org.jooq.SQLDialect.MARIADB; import static org.jooq.SQLDialect.MYSQL; // ... import static org.jooq.SQLDialect.POSTGRES; +// ... import static org.jooq.SQLDialect.SQLITE; import static org.jooq.SQLDialect.YUGABYTEDB; diff --git a/jOOQ/src/main/java/org/jooq/SelectJoinStep.java b/jOOQ/src/main/java/org/jooq/SelectJoinStep.java index 2a68b35175..66e7c4d590 100644 --- a/jOOQ/src/main/java/org/jooq/SelectJoinStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectJoinStep.java @@ -1907,7 +1907,7 @@ public interface SelectJoinStep extends SelectWhereStep { * @see Table#straightJoin(TableLike) */ @NotNull @CheckReturnValue - @Support({ MYSQL }) + @Support({ MARIADB, MYSQL }) SelectOnStep straightJoin(TableLike table); /** @@ -1922,7 +1922,7 @@ public interface SelectJoinStep extends SelectWhereStep { * @see Table#straightJoin(SQL) */ @NotNull @CheckReturnValue - @Support({ MYSQL }) + @Support({ MARIADB, MYSQL }) @PlainSQL SelectOnStep straightJoin(SQL sql); @@ -1938,7 +1938,7 @@ public interface SelectJoinStep extends SelectWhereStep { * @see Table#straightJoin(String) */ @NotNull @CheckReturnValue - @Support({ MYSQL }) + @Support({ MARIADB, MYSQL }) @PlainSQL SelectOnStep straightJoin(String sql); @@ -1955,7 +1955,7 @@ public interface SelectJoinStep extends SelectWhereStep { * @see Table#straightJoin(String, Object...) */ @NotNull @CheckReturnValue - @Support({ MYSQL }) + @Support({ MARIADB, MYSQL }) @PlainSQL SelectOnStep straightJoin(String sql, Object... bindings); @@ -1972,7 +1972,7 @@ public interface SelectJoinStep extends SelectWhereStep { * @see Table#straightJoin(String, QueryPart...) */ @NotNull @CheckReturnValue - @Support({ MYSQL }) + @Support({ MARIADB, MYSQL }) @PlainSQL SelectOnStep straightJoin(String sql, QueryPart... parts); @@ -1983,6 +1983,6 @@ public interface SelectJoinStep extends SelectWhereStep { * @see Table#straightJoin(Name) */ @NotNull @CheckReturnValue - @Support({ MYSQL }) + @Support({ MARIADB, MYSQL }) SelectOnStep straightJoin(Name name); } diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java index 3e595a20ef..2bfc5fe4c1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java @@ -49,6 +49,7 @@ import static org.jooq.SQLDialect.FIREBIRD; import static org.jooq.SQLDialect.POSTGRES; // ... // ... +// ... import static org.jooq.SQLDialect.YUGABYTEDB; import static org.jooq.XMLFormat.RecordFormat.COLUMN_NAME_ELEMENTS; import static org.jooq.conf.ThrowExceptions.THROW_NONE; @@ -388,6 +389,17 @@ implements return executeSelectFromPOSTGRES(); } + + + + + + + + + + + // Procedures (no return value) are always executed as CallableStatement else if (type == null) { return executeCallableStatement(); @@ -475,6 +487,14 @@ implements + + + + + + + + @@ -887,6 +907,7 @@ implements + else @@ -1094,6 +1115,7 @@ implements + else @@ -1521,6 +1543,7 @@ implements + { context.sql("? = "); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 1070fe3c6c..6d5b4b6d72 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -10013,7 +10013,7 @@ public class DSL { * @see DSLContext#set(Name, Param) */ @NotNull @CheckReturnValue - @Support({ MYSQL, POSTGRES, YUGABYTEDB }) + @Support({ MARIADB, MYSQL, POSTGRES, YUGABYTEDB }) public static org.jooq.RowCountQuery set(Name name, Param value) { return dsl().set(name, value); } @@ -23785,7 +23785,7 @@ public class DSL { } /** - * Get the REGEXP_REPLACE_ALL function. + * Get the REGEXP_REPLACE_FIRST function. */ @NotNull @Support({ MYSQL, POSTGRES, YUGABYTEDB }) @@ -23794,7 +23794,7 @@ public class DSL { } /** - * Get the REGEXP_REPLACE_ALL function. + * Get the REGEXP_REPLACE_FIRST function. */ @NotNull @Support({ MYSQL, POSTGRES, YUGABYTEDB }) diff --git a/jOOQ/src/main/java/org/jooq/impl/IsJson.java b/jOOQ/src/main/java/org/jooq/impl/IsJson.java index 0a9be1d6d8..6409dc3ed1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/IsJson.java +++ b/jOOQ/src/main/java/org/jooq/impl/IsJson.java @@ -85,6 +85,24 @@ implements // XXX: QueryPart API // ------------------------------------------------------------------------- + @Override + final boolean parenthesised(Context ctx) { + switch (ctx.family()) { + case MARIADB: + case MYSQL: + return true; + + + + + + + + default: + return false; + } + } + @Override public final void accept(Context ctx) { switch (ctx.family()) { @@ -94,6 +112,7 @@ implements + case MARIADB: case MYSQL: ctx.visit(function(N_JSON_VALID, BOOLEAN, field)); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/IsNotJson.java b/jOOQ/src/main/java/org/jooq/impl/IsNotJson.java index 3b15e2a35e..8a2b38cc3d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/IsNotJson.java +++ b/jOOQ/src/main/java/org/jooq/impl/IsNotJson.java @@ -94,6 +94,7 @@ implements + case MARIADB: case MYSQL: ctx.visit(condition(function(N_JSON_VALID, BOOLEAN, field)).not()); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java b/jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java index f1e61496e3..7d3ea94b9e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONBKeys.java @@ -91,6 +91,31 @@ implements // XXX: QueryPart API // ------------------------------------------------------------------------- + @Override + final boolean parenthesised(Context ctx) { + switch (ctx.family()) { + + + case POSTGRES: + case YUGABYTEDB: + return false; + + + + + + + + + + case SQLITE: + return false; + + default: + return false; + } + } + @Override public final void accept(Context ctx) { switch (ctx.family()) { @@ -119,6 +144,10 @@ implements + + + + case SQLITE: ctx.visit(DSL.field(select(jsonbArrayAgg(DSL.field(name("key")))).from("json_each({0})", field))); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONKeys.java b/jOOQ/src/main/java/org/jooq/impl/JSONKeys.java index 9f97d2e13b..45ae8c7ffd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONKeys.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONKeys.java @@ -103,6 +103,9 @@ implements + + + case SQLITE: return false; @@ -135,6 +138,10 @@ implements + + + + case SQLITE: ctx.visit(DSL.field(select(jsonArrayAgg(DSL.field(name("key")))).from("json_each({0})", field))); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONObjectAgg.java b/jOOQ/src/main/java/org/jooq/impl/JSONObjectAgg.java index d17e7c6a79..49c2737e86 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONObjectAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONObjectAgg.java @@ -48,6 +48,7 @@ import static org.jooq.impl.Names.N_JSONB_OBJECT_AGG; import static org.jooq.impl.Names.N_JSON_GROUP_OBJECT; import static org.jooq.impl.Names.N_JSON_OBJECTAGG; import static org.jooq.impl.Names.N_JSON_OBJECT_AGG; +import static org.jooq.impl.Names.N_OBJECT_AGG; import static org.jooq.impl.QOM.JSONOnNull.ABSENT_ON_NULL; import static org.jooq.impl.QOM.JSONOnNull.NULL_ON_NULL; import static org.jooq.impl.SQLDataType.BLOB; @@ -105,6 +106,10 @@ implements + + + + case POSTGRES: case YUGABYTEDB: acceptPostgres(ctx); @@ -162,6 +167,23 @@ implements acceptOverClause(ctx); } + + + + + + + + + + + + + + + + + private final void acceptGroupConcat(Context ctx) { ctx.sql('(').visit(groupConcatEmulation(ctx)).sql(')'); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index 2f0424bab3..0cd8e03e30 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -170,7 +170,6 @@ final class Names { static final Name N_JSON_TRANSFORM = systemName("json_transform"); static final Name N_JSON_TYPE = systemName("json_type"); static final Name N_JSON_UNQUOTE = systemName("json_unquote"); - static final Name N_JSON_VALID = systemName("json_valid"); static final Name N_JSON_VALUE = systemName("json_value"); static final Name N_LAG = systemName("lag"); static final Name N_LAST_VALUE = systemName("last_value"); @@ -200,6 +199,7 @@ final class Names { static final Name N_NTILE = systemName("ntile"); static final Name N_NULL = systemName("null"); static final Name N_NVL2 = systemName("nvl2"); + static final Name N_OBJECT_AGG = systemName("object_agg"); static final Name N_OBJECT_CONSTRUCT = systemName("object_construct"); static final Name N_OBJECT_CONSTRUCT_KEEP_NULL = systemName("object_construct_keep_null"); static final Name N_OFFSET = systemName("offset"); @@ -420,6 +420,7 @@ final class Names { static final Name N_JSON_REMOVE = systemName("json_remove"); static final Name N_JSON_REPLACE = systemName("json_replace"); static final Name N_JSON_SET = systemName("json_set"); + static final Name N_JSON_VALID = systemName("json_valid"); static final Name N_LCASE = systemName("lcase"); static final Name N_LEFT = systemName("left"); static final Name N_LEN = systemName("len"); @@ -443,6 +444,7 @@ final class Names { static final Name N_NEWID = systemName("newid"); static final Name N_NULLIF = systemName("nullif"); static final Name N_NVL = systemName("nvl"); + static final Name N_OBJECT_KEYS = systemName("object_keys"); static final Name N_OCTET_LENGTH = systemName("octet_length"); static final Name N_OTRANSLATE = systemName("otranslate"); static final Name N_OVERLAY = systemName("overlay"); diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 3a8b54e51d..f9fdf068a5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -8876,6 +8876,8 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return octetLength((Field) parseFieldParenthesised()); else if ((field = parseFieldObjectConstructIf()) != null) return field; + else if (parseFunctionNameIf("OBJECT_KEYS")) + return parseFunctionArgs1(DSL::jsonKeys); break;