From a3b7b77f6722e17bcf382c6e142e48526d85f65f Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 4 Jun 2020 12:46:08 +0200 Subject: [PATCH] [jOOQ/jOOQ#7900] Added FIREBIRD and HSQLDB support --- jOOQ/src/main/java/org/jooq/impl/DSL.java | 16 +++---- .../src/main/java/org/jooq/impl/DateDiff.java | 42 +++++++++++++------ 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 105c690aad..3e6715b6bc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -15321,7 +15321,7 @@ public class DSL { * Get the date difference between date1 - date2 in terms of * part. */ - @Support({ H2 }) + @Support({ FIREBIRD, H2, HSQLDB }) public static Field dateDiff(DatePart part, Date date1, Date date2) { return dateDiff(part, Tools.field(date1), Tools.field(date2)); } @@ -15330,7 +15330,7 @@ public class DSL { * Get the date difference between date1 - date2 in terms of * part. */ - @Support({ H2 }) + @Support({ FIREBIRD, H2, HSQLDB }) public static Field dateDiff(DatePart part, Field date1, Date date2) { return dateDiff(part, nullSafe(date1), Tools.field(date2)); } @@ -15339,7 +15339,7 @@ public class DSL { * Get the date difference between date1 - date2 in terms of * part. */ - @Support({ H2 }) + @Support({ FIREBIRD, H2, HSQLDB }) public static Field dateDiff(DatePart part, Date date1, Field date2) { return dateDiff(part, Tools.field(date1), nullSafe(date2)); } @@ -15348,7 +15348,7 @@ public class DSL { * Get the date difference between date1 - date2 in terms of * part. */ - @Support({ H2 }) + @Support({ FIREBIRD, H2, HSQLDB }) public static Field dateDiff(DatePart part, Field date1, Field date2) { return new DateDiff<>(part, nullSafe(date1), nullSafe(date2)); } @@ -15711,7 +15711,7 @@ public class DSL { * Get the date difference between date1 - date2 in terms of * part. */ - @Support({ H2 }) + @Support({ FIREBIRD, H2, HSQLDB }) public static Field localDateDiff(DatePart part, LocalDate date1, LocalDate date2) { return localDateDiff(part, Tools.field(date1), Tools.field(date2)); } @@ -15720,7 +15720,7 @@ public class DSL { * Get the date difference between date1 - date2 in terms of * part. */ - @Support({ H2 }) + @Support({ FIREBIRD, H2, HSQLDB }) public static Field localDateDiff(DatePart part, Field date1, LocalDate date2) { return localDateDiff(part, nullSafe(date1), Tools.field(date2)); } @@ -15729,7 +15729,7 @@ public class DSL { * Get the date difference between date1 - date2 in terms of * part. */ - @Support({ H2 }) + @Support({ FIREBIRD, H2, HSQLDB }) public static Field localDateDiff(DatePart part, LocalDate date1, Field date2) { return localDateDiff(part, Tools.field(date1), nullSafe(date2)); } @@ -15738,7 +15738,7 @@ public class DSL { * Get the date difference between date1 - date2 in terms of * part. */ - @Support({ H2 }) + @Support({ FIREBIRD, H2, HSQLDB }) public static Field localDateDiff(DatePart part, Field date1, Field date2) { return new DateDiff<>(part, nullSafe(date1), nullSafe(date2)); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DateDiff.java b/jOOQ/src/main/java/org/jooq/impl/DateDiff.java index f1f41c369e..f5d3730ff5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DateDiff.java +++ b/jOOQ/src/main/java/org/jooq/impl/DateDiff.java @@ -38,13 +38,19 @@ package org.jooq.impl; import static org.jooq.DatePart.DAY; +import static org.jooq.DatePart.YEAR; +import static org.jooq.SQLDialect.FIREBIRD; +import static org.jooq.SQLDialect.HSQLDB; import static org.jooq.impl.DSL.function; +import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.keyword; +import static org.jooq.impl.DSL.quarter; import static org.jooq.impl.Keywords.K_DAY; import static org.jooq.impl.Names.N_DATEDIFF; import static org.jooq.impl.Names.N_DAYS_BETWEEN; import static org.jooq.impl.Names.N_STRFTIME; import static org.jooq.impl.Names.N_TIMESTAMPDIFF; +import static org.jooq.impl.SQLDataType.TIMESTAMP; import static org.jooq.impl.Tools.castIfNeeded; import org.jooq.Context; @@ -85,16 +91,13 @@ final class DateDiff extends AbstractField { case MARIADB: case MYSQL: ctx.visit(N_DATEDIFF).sql('(').visit(date1).sql(", ").visit(date2).sql(')'); - break; + return; case DERBY: ctx.sql("{fn ").visit(N_TIMESTAMPDIFF).sql('(').visit(keyword("sql_tsi_day")).sql(", ").visit(date2).sql(", ").visit(date1).sql(") }"); - break; + return; case FIREBIRD: - ctx.visit(N_DATEDIFF).sql('(').visit(K_DAY).sql(", ").visit(date2).sql(", ").visit(date1).sql(')'); - break; - case H2: case HSQLDB: switch (p) { @@ -102,14 +105,28 @@ final class DateDiff extends AbstractField { case CENTURY: case DECADE: ctx.visit(DSL.extract(date1, p).sub(DSL.extract(date2, p))); - break; + return; - default: - ctx.visit(N_DATEDIFF).sql('(').visit(p.toKeyword()).sql(", ").visit(date2).sql(", ").visit(date1).sql(')'); - break; + case QUARTER: + if (ctx.family() == FIREBIRD) { + ctx.visit(new DateDiff<>(YEAR, date1, date2).times(inline(4)).plus(quarter(date1).minus(quarter(date2)))); + return; + } + + case HOUR: + case MINUTE: + case SECOND: + case MILLISECOND: + case MICROSECOND: + case NANOSECOND: + if (ctx.family() == HSQLDB) { + ctx.visit(N_DATEDIFF).sql('(').visit(p.toKeyword()).sql(", ").visit(date2.cast(TIMESTAMP)).sql(", ").visit(date1.cast(TIMESTAMP)).sql(')'); + return; + } } - break; + ctx.visit(N_DATEDIFF).sql('(').visit(p.toKeyword()).sql(", ").visit(date2).sql(", ").visit(date1).sql(')'); + return; @@ -132,7 +149,7 @@ final class DateDiff extends AbstractField { // [#4481] Parentheses are important in case this expression is // placed in the context of other arithmetic ctx.sql('(').visit(date1).sql(" - ").visit(date2).sql(')'); - break; + return; @@ -159,9 +176,8 @@ final class DateDiff extends AbstractField { default: - // Default implementation for equals() and hashCode() ctx.visit(castIfNeeded(date1.sub(date2), Integer.class)); - break; + return; } } }