diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java
index a28040a4d6..61a541adc5 100644
--- a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java
+++ b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java
@@ -282,4 +282,35 @@ implements
return this;
}
+
+ /**
+ * Apply this aggregate function's FILTER and OVER
+ * clauses to an argument aggregate function.
+ */
+ final Field fo(AggregateFunction function) {
+ WindowBeforeOverStep s1 = filter != null ? function.filterWhere(filter) : function;
+
+ if (windowSpecification != null)
+ return s1.over(windowSpecification);
+ else if (windowDefinition != null)
+ return s1.over(windowDefinition);
+ else if (windowName != null)
+ return s1.over(windowName);
+ else
+ return s1;
+ }
+
+ /**
+ * Type safe NVL2(y, x, null) for REGR emulations.
+ */
+ final Field x(Field x, Field extends Number> y) {
+ return DSL.nvl2(y, x, DSL.NULL(x.getDataType()));
+ }
+
+ /**
+ * Type safe NVL2(x, y, null) for REGR emulations.
+ */
+ final Field y(Field extends Number> x, Field y) {
+ return DSL.nvl2(x, y, DSL.NULL(y.getDataType()));
+ }
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/CovarPop.java b/jOOQ/src/main/java/org/jooq/impl/CovarPop.java
index c4f37ea199..a6dfa392b5 100644
--- a/jOOQ/src/main/java/org/jooq/impl/CovarPop.java
+++ b/jOOQ/src/main/java/org/jooq/impl/CovarPop.java
@@ -87,4 +87,20 @@ extends
+ private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void accept(Context> ctx) {
+ if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) {
+ Field extends Number> x = (Field) getArguments().get(0);
+ Field extends Number> y = (Field) getArguments().get(1);
+
+ ctx.visit(fo(DSL.sum(x.times(y))).minus(fo(DSL.sum(x(x, y))).times(fo(DSL.sum(y(x, y)))).div(fo(DSL.count(x.plus(y))).cast(NUMERIC))).div(fo(DSL.count(x.plus(y))).cast(NUMERIC)));
+ }
+ else
+ super.accept(ctx);
+ }
+
+
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java b/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java
index f95d75637c..88d0e4e14c 100644
--- a/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java
+++ b/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java
@@ -87,4 +87,20 @@ extends
+ private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void accept(Context> ctx) {
+ if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) {
+ Field extends Number> x = (Field) getArguments().get(0);
+ Field extends Number> y = (Field) getArguments().get(1);
+
+ ctx.visit(fo(DSL.sum(x.times(y))).minus(fo(DSL.sum(x(x, y))).times(fo(DSL.sum(y(x, y)))).div(fo(DSL.count(x.plus(y))).cast(NUMERIC))).div(fo(DSL.count(x.plus(y))).cast(NUMERIC).minus(DSL.inline(1))));
+ }
+ else
+ super.accept(ctx);
+ }
+
+
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java
index 1b509cff02..e2612e3c10 100644
--- a/jOOQ/src/main/java/org/jooq/impl/DSL.java
+++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java
@@ -18718,11 +18718,20 @@ public class DSL {
// Aggregate functions
// -------------------------------------------------------------------------
+ /**
+ * The CORR function.
+ */
+ @NotNull
+ @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES })
+ public static AggregateFunction corr(Field extends Number> y, Field extends Number> x) {
+ return new Corr(y, x);
+ }
+
/**
* The COVAR_SAMP function.
*/
@NotNull
- @Support({ FIREBIRD, POSTGRES })
+ @Support
public static AggregateFunction covarSamp(Field extends Number> y, Field extends Number> x) {
return new CovarSamp(y, x);
}
@@ -18731,7 +18740,7 @@ public class DSL {
* The COVAR_POP function.
*/
@NotNull
- @Support({ FIREBIRD, POSTGRES })
+ @Support
public static AggregateFunction covarPop(Field extends Number> y, Field extends Number> x) {
return new CovarPop(y, x);
}
@@ -18749,7 +18758,7 @@ public class DSL {
* The REGR_AVG_X function.
*/
@NotNull
- @Support({ POSTGRES })
+ @Support
public static AggregateFunction regrAvgX(Field extends Number> y, Field extends Number> x) {
return new RegrAvgx(y, x);
}
@@ -18758,7 +18767,7 @@ public class DSL {
* The REGR_AVG_Y function.
*/
@NotNull
- @Support({ POSTGRES })
+ @Support
public static AggregateFunction regrAvgY(Field extends Number> y, Field extends Number> x) {
return new RegrAvgy(y, x);
}
@@ -18767,7 +18776,7 @@ public class DSL {
* The REGR_COUNT function.
*/
@NotNull
- @Support({ POSTGRES })
+ @Support
public static AggregateFunction regrCount(Field extends Number> y, Field extends Number> x) {
return new RegrCount(y, x);
}
@@ -18776,7 +18785,7 @@ public class DSL {
* The REGR_INTERCEPT function.
*/
@NotNull
- @Support({ POSTGRES })
+ @Support
public static AggregateFunction regrIntercept(Field extends Number> y, Field extends Number> x) {
return new RegrIntercept(y, x);
}
@@ -18785,7 +18794,7 @@ public class DSL {
* The REGR_R2 function.
*/
@NotNull
- @Support({ POSTGRES })
+ @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES })
public static AggregateFunction regrR2(Field extends Number> y, Field extends Number> x) {
return new RegrR2(y, x);
}
@@ -18794,7 +18803,7 @@ public class DSL {
* The REGR_SLOPE function.
*/
@NotNull
- @Support({ POSTGRES })
+ @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES })
public static AggregateFunction regrSlope(Field extends Number> y, Field extends Number> x) {
return new RegrSlope(y, x);
}
@@ -18803,7 +18812,7 @@ public class DSL {
* The REGR_SXX function.
*/
@NotNull
- @Support({ POSTGRES })
+ @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES })
public static AggregateFunction regrSXX(Field extends Number> y, Field extends Number> x) {
return new RegrSxx(y, x);
}
@@ -18812,7 +18821,7 @@ public class DSL {
* The REGR_SXY function.
*/
@NotNull
- @Support({ POSTGRES })
+ @Support
public static AggregateFunction regrSXY(Field extends Number> y, Field extends Number> x) {
return new RegrSxy(y, x);
}
@@ -18821,7 +18830,7 @@ public class DSL {
* The REGR_SYY function.
*/
@NotNull
- @Support({ POSTGRES })
+ @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES })
public static AggregateFunction regrSYY(Field extends Number> y, Field extends Number> x) {
return new RegrSyy(y, x);
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java
index f4999128fe..bb557a1175 100644
--- a/jOOQ/src/main/java/org/jooq/impl/Names.java
+++ b/jOOQ/src/main/java/org/jooq/impl/Names.java
@@ -97,6 +97,7 @@ final class Names {
static final Name N_CONNECT_BY_IS_LEAF = unquotedName("connect_by_isleaf");
static final Name N_CONNECT_BY_ROOT = unquotedName("connect_by_root");
static final Name N_CONVERT = unquotedName("convert");
+ static final Name N_CORR = unquotedName("corr");
static final Name N_COS = unquotedName("cos");
static final Name N_COSH = unquotedName("cosh");
static final Name N_COT = unquotedName("cot");
diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java
index b6bb8b7541..4c04b2fad5 100644
--- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java
+++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java
@@ -107,6 +107,7 @@ import static org.jooq.impl.DSL.condition;
import static org.jooq.impl.DSL.constraint;
// ...
// ...
+import static org.jooq.impl.DSL.corr;
import static org.jooq.impl.DSL.cos;
import static org.jooq.impl.DSL.cosh;
import static org.jooq.impl.DSL.cot;
@@ -346,12 +347,6 @@ import static org.jooq.impl.DSL.xmlquery;
import static org.jooq.impl.DSL.xmltable;
import static org.jooq.impl.DSL.year;
import static org.jooq.impl.DSL.zero;
-import static org.jooq.impl.JSONOnNull.ABSENT_ON_NULL;
-import static org.jooq.impl.JSONOnNull.NULL_ON_NULL;
-import static org.jooq.impl.Keywords.K_DELETE;
-import static org.jooq.impl.Keywords.K_INSERT;
-import static org.jooq.impl.Keywords.K_SELECT;
-import static org.jooq.impl.Keywords.K_UPDATE;
import static org.jooq.impl.DefaultParseContext.Type.A;
import static org.jooq.impl.DefaultParseContext.Type.B;
import static org.jooq.impl.DefaultParseContext.Type.D;
@@ -360,6 +355,12 @@ import static org.jooq.impl.DefaultParseContext.Type.N;
import static org.jooq.impl.DefaultParseContext.Type.S;
import static org.jooq.impl.DefaultParseContext.Type.X;
import static org.jooq.impl.DefaultParseContext.Type.Y;
+import static org.jooq.impl.JSONOnNull.ABSENT_ON_NULL;
+import static org.jooq.impl.JSONOnNull.NULL_ON_NULL;
+import static org.jooq.impl.Keywords.K_DELETE;
+import static org.jooq.impl.Keywords.K_INSERT;
+import static org.jooq.impl.Keywords.K_SELECT;
+import static org.jooq.impl.Keywords.K_UPDATE;
import static org.jooq.impl.SQLDataType.BIGINT;
import static org.jooq.impl.SQLDataType.INTEGER;
import static org.jooq.impl.SQLDataType.NVARCHAR;
@@ -401,7 +402,6 @@ import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
-import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -430,7 +430,6 @@ import org.jooq.Catalog;
import org.jooq.CharacterSet;
import org.jooq.Collation;
import org.jooq.Comment;
-import org.jooq.CommentOnFinalStep;
import org.jooq.CommentOnIsStep;
import org.jooq.CommonTableExpression;
import org.jooq.Comparator;
@@ -508,7 +507,6 @@ import org.jooq.InsertOnDuplicateStep;
import org.jooq.InsertReturningStep;
import org.jooq.InsertSetStep;
import org.jooq.InsertValuesStepN;
-import org.jooq.JSON;
import org.jooq.JSONArrayAggNullStep;
import org.jooq.JSONArrayAggOrderByStep;
import org.jooq.JSONArrayAggReturningStep;
@@ -589,8 +587,6 @@ import org.jooq.UpdateWhereStep;
import org.jooq.User;
// ...
// ...
-import org.jooq.VisitContext;
-import org.jooq.VisitListener;
import org.jooq.WindowBeforeOverStep;
import org.jooq.WindowDefinition;
import org.jooq.WindowFromFirstLastStep;
@@ -614,7 +610,6 @@ import org.jooq.conf.ParseWithMetaLookups;
import org.jooq.conf.RenderKeywordCase;
import org.jooq.conf.RenderNameCase;
import org.jooq.conf.RenderQuotedNames;
-import org.jooq.conf.Settings;
import org.jooq.conf.SettingsTools;
import org.jooq.impl.ScopeStack.Value;
import org.jooq.impl.XMLParse.DocumentOrContent;
@@ -625,8 +620,6 @@ import org.jooq.types.Interval;
import org.jooq.types.YearToMonth;
import org.jooq.types.YearToSecond;
-import org.jetbrains.annotations.NotNull;
-
/**
* @author Lukas Eder
*/
@@ -10717,6 +10710,8 @@ final class DefaultParseContext extends AbstractScope implements ParseContext {
parse(')');
switch (type) {
+ case CORR:
+ return corr(arg1, arg2);
case COVAR_POP:
return covarPop(arg1, arg2);
case COVAR_SAMP:
@@ -13020,9 +13015,9 @@ final class DefaultParseContext extends AbstractScope implements ParseContext {
}
private static enum BinarySetFunctionType {
+ CORR,
COVAR_POP,
COVAR_SAMP,
-// CORR,
REGR_SLOPE,
REGR_INTERCEPT,
REGR_COUNT,
diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrAvgx.java b/jOOQ/src/main/java/org/jooq/impl/RegrAvgx.java
index 1df4337327..0cfb5de3a2 100644
--- a/jOOQ/src/main/java/org/jooq/impl/RegrAvgx.java
+++ b/jOOQ/src/main/java/org/jooq/impl/RegrAvgx.java
@@ -87,4 +87,20 @@ extends
+ private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void accept(Context> ctx) {
+ if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) {
+ Field extends Number> x = (Field) getArguments().get(0);
+ Field extends Number> y = (Field) getArguments().get(1);
+
+ ctx.visit(fo(DSL.avg(DSL.nvl2(x, y, DSL.NULL(NUMERIC)).cast(NUMERIC))));
+ }
+ else
+ super.accept(ctx);
+ }
+
+
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrAvgy.java b/jOOQ/src/main/java/org/jooq/impl/RegrAvgy.java
index a892490a90..b09b38befe 100644
--- a/jOOQ/src/main/java/org/jooq/impl/RegrAvgy.java
+++ b/jOOQ/src/main/java/org/jooq/impl/RegrAvgy.java
@@ -87,4 +87,20 @@ extends
+ private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void accept(Context> ctx) {
+ if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) {
+ Field extends Number> x = (Field) getArguments().get(0);
+ Field extends Number> y = (Field) getArguments().get(1);
+
+ ctx.visit(fo(DSL.avg(DSL.nvl2(y, x, DSL.NULL(NUMERIC)).cast(NUMERIC))));
+ }
+ else
+ super.accept(ctx);
+ }
+
+
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrCount.java b/jOOQ/src/main/java/org/jooq/impl/RegrCount.java
index 7fcdd79196..772419949a 100644
--- a/jOOQ/src/main/java/org/jooq/impl/RegrCount.java
+++ b/jOOQ/src/main/java/org/jooq/impl/RegrCount.java
@@ -87,4 +87,15 @@ extends
+ private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
+
+ @Override
+ public void accept(Context> ctx) {
+ if (NO_SUPPORT_NATIVE.contains(ctx.dialect()))
+ ctx.visit(fo(DSL.count(getArguments().get(0).plus(getArguments().get(1)))));
+ else
+ super.accept(ctx);
+ }
+
+
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java b/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java
index 88cf26014e..47f95da4d4 100644
--- a/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java
+++ b/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java
@@ -87,4 +87,20 @@ extends
+ private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void accept(Context> ctx) {
+ if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) {
+ Field extends Number> x = (Field) getArguments().get(0);
+ Field extends Number> y = (Field) getArguments().get(1);
+
+ ctx.visit(fo(DSL.avg(x(x, y).cast(NUMERIC))).minus(fo(DSL.regrSlope(x, y)).times(fo(DSL.avg(y(x, y).cast(NUMERIC))))));
+ }
+ else
+ super.accept(ctx);
+ }
+
+
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrR2.java b/jOOQ/src/main/java/org/jooq/impl/RegrR2.java
index 0431b28651..9010514add 100644
--- a/jOOQ/src/main/java/org/jooq/impl/RegrR2.java
+++ b/jOOQ/src/main/java/org/jooq/impl/RegrR2.java
@@ -87,4 +87,24 @@ extends
+ private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void accept(Context> ctx) {
+ if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) {
+ Field extends Number> x = (Field) getArguments().get(0);
+ Field extends Number> y = (Field) getArguments().get(1);
+
+ ctx.visit(DSL
+ .when(fo(DSL.varPop(y(x, y))).eq(inline(BigDecimal.ZERO)), DSL.NULL(NUMERIC))
+ .when(fo(DSL.varPop(x(x, y))).eq(inline(BigDecimal.ZERO)), inline(BigDecimal.ONE))
+ .else_(DSL.square(fo(DSL.corr(x, y))))
+ );
+ }
+ else
+ super.accept(ctx);
+ }
+
+
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java b/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java
index ec3a6ccbc0..da0af181ad 100644
--- a/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java
+++ b/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java
@@ -87,4 +87,20 @@ extends
+ private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void accept(Context> ctx) {
+ if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) {
+ Field extends Number> x = (Field) getArguments().get(0);
+ Field extends Number> y = (Field) getArguments().get(1);
+
+ ctx.visit(fo(DSL.covarPop(x, y)).div(fo(DSL.varPop(y(x, y)))));
+ }
+ else
+ super.accept(ctx);
+ }
+
+
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java b/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java
index 0918bf2a46..1320eb3bbe 100644
--- a/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java
+++ b/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java
@@ -87,4 +87,20 @@ extends
+ private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void accept(Context> ctx) {
+ if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) {
+ Field extends Number> x = (Field) getArguments().get(0);
+ Field extends Number> y = (Field) getArguments().get(1);
+
+ ctx.visit(fo(DSL.regrCount(x, y)).times(fo(DSL.varPop(y(x, y)))));
+ }
+ else
+ super.accept(ctx);
+ }
+
+
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java b/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java
index 3280b82fbc..107db4ae50 100644
--- a/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java
+++ b/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java
@@ -87,4 +87,20 @@ extends
+ private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void accept(Context> ctx) {
+ if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) {
+ Field extends Number> x = (Field) getArguments().get(0);
+ Field extends Number> y = (Field) getArguments().get(1);
+
+ ctx.visit(fo(DSL.regrCount(x, y)).times(fo(DSL.covarPop(x, y))));
+ }
+ else
+ super.accept(ctx);
+ }
+
+
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java b/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java
index 5aa34b12c0..5cec8d9468 100644
--- a/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java
+++ b/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java
@@ -87,4 +87,19 @@ extends
+ private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void accept(Context> ctx) {
+ if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) {
+ Field extends Number> x = (Field) getArguments().get(0);
+ Field extends Number> y = (Field) getArguments().get(1);
+
+ ctx.visit(fo(DSL.regrCount(x, y)).times(fo(DSL.varPop(x(x, y)))));
+ }
+ else
+ super.accept(ctx);
+ }
+
}