diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java
index 1b569a71dc..351e406ae6 100644
--- a/jOOQ/src/main/java/org/jooq/impl/DSL.java
+++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java
@@ -13490,6 +13490,26 @@ public class DSL {
// XXX Global Field and Function factory
// -------------------------------------------------------------------------
+ /**
+ * Get the MySQL FIELD(expr, expr1, expr2, ...) function.
+ */
+ @NotNull
+ @Support
+ @SafeVarargs
+ public static Field field(Field field, T... list) {
+ return field(field, Tools.fieldsArray(list, field.getDataType()));
+ }
+
+ /**
+ * Get the MySQL FIELD(expr, expr1, expr2, ...) function.
+ */
+ @NotNull
+ @Support
+ @SafeVarargs
+ public static Field field(Field field, Field... list) {
+ return new FieldFunction<>(field, list);
+ }
+
/**
* Wrap a {@link SelectField} in a general-purpose {@link Field}
*/
diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java
index 2c967b33a8..23ba503af6 100644
--- a/jOOQ/src/main/java/org/jooq/impl/Names.java
+++ b/jOOQ/src/main/java/org/jooq/impl/Names.java
@@ -114,6 +114,7 @@ final class Names {
static final Name N_EXP = unquotedName("exp");
static final Name N_EXTRACT = unquotedName("extract");
static final Name N_EXTRACT_DURATION = unquotedName("extract_duration");
+ static final Name N_FIELD = unquotedName("field");
static final Name N_FLASHBACK = unquotedName("flashback");
static final Name N_FLOOR = unquotedName("floor");
static final Name N_FUNCTION = unquotedName("function");
diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java
index 1279693dd0..8d82c60f0c 100644
--- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java
+++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java
@@ -9347,31 +9347,15 @@ final class ParserImpl implements Parser {
return null;
}
- private static final Field> parseFieldFieldIf(ParserContext ctx) {
+ private static final Field> parseFieldFieldIf(ParserContext ctx) {
if (parseFunctionNameIf(ctx, "FIELD")) {
parse(ctx, '(');
-
- List> args = new ArrayList<>();
-
- args.add(parseField(ctx));
+ Field> f1 = parseField(ctx);
parse(ctx, ',');
-
- int i = 1;
- do {
- args.add(parseField(ctx));
- args.add(inline(i++));
- }
- while (parseIf(ctx, ','));
-
- args.add(inline(0));
+ List> f2 = parseFields(ctx);
parse(ctx, ')');
- return DSL.decode(
- (Field) args.get(0),
- (Field) args.get(1),
- (Field) args.get(2),
- args.subList(3, args.size()).toArray(EMPTY_FIELD)
- );
+ return DSL.field((Field) f1, (Field[]) f2.toArray(EMPTY_FIELD));
}
return null;
diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java
index 01f4199328..80d0461256 100644
--- a/jOOQ/src/main/java/org/jooq/impl/Tools.java
+++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java
@@ -1968,6 +1968,18 @@ final class Tools {
return result;
}
+ @SuppressWarnings("unchecked")
+ static final Field[] fieldsArray(Object[] values, DataType type) {
+ if (values == null)
+ return (Field[]) EMPTY_FIELD;
+
+ Field[] result = new Field[values.length];
+ for (int i = 0; i < result.length; i++)
+ result[i] = field(values[i], type);
+
+ return result;
+ }
+
static final Field>[] fieldsArray(Object[] values, DataType>[] types) {
if (values == null || types == null)
return EMPTY_FIELD;