diff --git a/jOOQ/src/main/java/org/jooq/impl/Function.java b/jOOQ/src/main/java/org/jooq/impl/Function.java index 1b167e5123..a5cf7eb523 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Function.java +++ b/jOOQ/src/main/java/org/jooq/impl/Function.java @@ -52,6 +52,7 @@ import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.POSTGRES_9_4; import static org.jooq.SQLDialect.SQLITE; // ... +import static org.jooq.impl.DSL.choose; import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.mode; @@ -76,6 +77,7 @@ import static org.jooq.impl.Keywords.K_RESPECT_NULLS; import static org.jooq.impl.Keywords.K_SEPARATOR; import static org.jooq.impl.Keywords.K_WHERE; import static org.jooq.impl.Keywords.K_WITHIN_GROUP; +import static org.jooq.impl.SQLDataType.NUMERIC; import static org.jooq.impl.SelectQueryImpl.SUPPORT_WINDOW_CLAUSE; import static org.jooq.impl.Term.ARRAY_AGG; import static org.jooq.impl.Term.LIST_AGG; @@ -247,7 +249,7 @@ class Function extends AbstractField implements Field negatives = DSL.when(f.lt(zero()), inline(-1)); @SuppressWarnings("serial") - Field negativesSum = new CustomField("sum", SQLDataType.NUMERIC) { + Field negativesSum = new CustomField("sum", NUMERIC) { @Override public void accept(Context c) { c.visit(distinct @@ -260,10 +262,25 @@ class Function extends AbstractField implements }; @SuppressWarnings("serial") - Field logarithmsSum = new CustomField("sum", SQLDataType.NUMERIC) { + Field zerosSum = new CustomField("sum", NUMERIC) { @Override public void accept(Context c) { - c.visit(DSL.sum(DSL.ln(DSL.abs(f)))); + c.visit(DSL.sum(choose(f).when(zero(), one()))); + + toSQLFilterClause(c); + toSQLOverClause(c); + } + }; + + @SuppressWarnings("serial") + Field logarithmsSum = new CustomField("sum", NUMERIC) { + @Override + public void accept(Context c) { + Field ln = DSL.ln(DSL.abs(DSL.nullif(f, zero()))); + + c.visit(distinct + ? DSL.sumDistinct(ln) + : DSL.sum(ln)); toSQLFilterClause(c); toSQLOverClause(c); @@ -271,7 +288,8 @@ class Function extends AbstractField implements }; ctx.visit( - when(negativesSum.mod(inline(2)).lt(inline(BigDecimal.ZERO)), inline(-1)) + when(zerosSum.gt(inline(BigDecimal.ZERO)), zero()) + .when(negativesSum.mod(inline(2)).lt(inline(BigDecimal.ZERO)), inline(-1)) .otherwise(one()).mul(DSL.exp(logarithmsSum)) ); }