diff --git a/jOOQ/src/main/java/org/jooq/impl/Greatest.java b/jOOQ/src/main/java/org/jooq/impl/Greatest.java index 8ea2180c53..b02aeabaff 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Greatest.java +++ b/jOOQ/src/main/java/org/jooq/impl/Greatest.java @@ -39,6 +39,7 @@ package org.jooq.impl; import static org.jooq.impl.DSL.function; import static org.jooq.impl.Names.N_GREATEST; +import static org.jooq.impl.Names.N_MAX; import static org.jooq.impl.Names.N_MAXVALUE; import org.jooq.Context; @@ -111,7 +112,7 @@ final class Greatest extends AbstractField { return; case SQLITE: - ctx.visit(function("max", getDataType(), args)); + ctx.visit(function(N_MAX, getDataType(), args)); return; default: diff --git a/jOOQ/src/main/java/org/jooq/impl/Least.java b/jOOQ/src/main/java/org/jooq/impl/Least.java index b61400f929..2db9566879 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Least.java +++ b/jOOQ/src/main/java/org/jooq/impl/Least.java @@ -39,6 +39,7 @@ package org.jooq.impl; import static org.jooq.impl.DSL.function; import static org.jooq.impl.Names.N_LEAST; +import static org.jooq.impl.Names.N_MIN; import static org.jooq.impl.Names.N_MINVALUE; import org.jooq.Context; @@ -110,7 +111,7 @@ final class Least extends AbstractField { return; case SQLITE: - ctx.visit(function("min", getDataType(), args)); + ctx.visit(function(N_MIN, getDataType(), args)); return; default: diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index db280d4818..a6400719f2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -190,10 +190,12 @@ final class Names { static final Name N_LOWER = unquotedName("lower"); static final Name N_LPAD = unquotedName("lpad"); static final Name N_LTRIM = unquotedName("ltrim"); + static final Name N_MAX = unquotedName("max"); static final Name N_MAXVALUE = unquotedName("maxvalue"); static final Name N_MD5 = unquotedName("md5"); static final Name N_MEDIAN = unquotedName("median"); static final Name N_MID = unquotedName("mid"); + static final Name N_MIN = unquotedName("min"); static final Name N_MINVALUE = unquotedName("minvalue"); static final Name N_MOD = unquotedName("mod"); static final Name N_MODE = unquotedName("mode"); diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index fcde20c821..3d851d1560 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -10297,8 +10297,15 @@ final class ParserContext { Condition condition = null; keep = over = filter = agg = parseCountIf(); - if (filter == null) - keep = over = filter = agg = parseGeneralSetFunctionIf(); + if (filter == null) { + Field field = parseGeneralSetFunctionIf(); + + if (field != null && !(field instanceof AggregateFunction)) + return field; + + keep = over = filter = agg = (AggregateFunction) field; + } + if (filter == null && !basic) over = filter = agg = parseBinarySetFunctionIf(); if (filter == null && !basic) @@ -10835,7 +10842,7 @@ final class ParserContext { return ordered; } - private final AggregateFunction parseGeneralSetFunctionIf() { + private final Field parseGeneralSetFunctionIf() { boolean distinct; Field arg; Field arg2; @@ -10861,6 +10868,18 @@ final class ParserContext { arg = parseField(); + switch (operation) { + case MAX: + case MIN: { + if (!distinct && parseIf(',')) { + List> fields = parseFields(); + parse(')'); + + return operation == ComputationalOperation.MAX ? greatest(arg, fields.toArray(EMPTY_FIELD)) : least(arg, fields.toArray(EMPTY_FIELD)); + } + } + } + parse(')'); switch (operation) {