From 94e97b229ae94e3e9167e6d3c8ca8f2c73a69139 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 19 Aug 2024 11:44:14 +0200 Subject: [PATCH] [jOOQ/jOOQ#12605] Add support for Firebird 4 TIME[STAMP] WITH TIME ZONE data types --- .../jooq/meta/firebird/FirebirdDatabase.java | 2 + jOOQ/src/main/java/org/jooq/impl/DSL.java | 18 +++---- .../java/org/jooq/impl/DefaultBinding.java | 8 +++ .../jooq/util/firebird/FirebirdDataType.java | 50 +++++++++++-------- 4 files changed, 47 insertions(+), 31 deletions(-) diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdDatabase.java index ba41df5fab..dee3f95d7f 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdDatabase.java @@ -749,6 +749,8 @@ public class FirebirdDatabase extends AbstractDatabase implements ResultQueryDat .when((short) 24, "DECFLOAT(16)") .when((short) 25, "DECFLOAT(34)") .when((short) 27, "DOUBLE") + .when((short) 28, "TIME WITH TIME ZONE") + .when((short) 29, "TIMESTAMP WITH TIME ZONE") .when((short) 35, "TIMESTAMP") .when((short) 37, "VARCHAR") .when((short) 40, "CSTRING") diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 21de9d13d8..8f101d3622 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -29458,7 +29458,7 @@ public class DSL { * {@link Instant} (in UTC) as the input. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, SQLITE }) + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE }) public static Field offsetTime(String value) { return Tools.field(Convert.convert(value, OffsetTime.class)); } @@ -29473,7 +29473,7 @@ public class DSL { * {@link Instant} (in UTC) as the input. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, SQLITE }) + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE }) public static Field offsetTime(OffsetTime value) { return Tools.field(value); } @@ -29488,7 +29488,7 @@ public class DSL { * {@link Instant} (in UTC) as the input. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, SQLITE }) + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE }) public static Field offsetTime(Field field) { return new DateOrTime<>(field, SQLDataType.OFFSETTIME); } @@ -29503,7 +29503,7 @@ public class DSL { * {@link Instant} (in UTC) as the input. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, SQLITE }) + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE }) public static Field offsetDateTime(String value) { return Tools.field(Convert.convert(value, OffsetDateTime.class)); } @@ -29518,7 +29518,7 @@ public class DSL { * {@link Instant} (in UTC) as the input. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, SQLITE }) + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE }) public static Field offsetDateTime(OffsetDateTime value) { return Tools.field(value); } @@ -29533,7 +29533,7 @@ public class DSL { * {@link Instant} (in UTC) as the input. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, SQLITE }) + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE }) public static Field offsetDateTime(Field field) { return new DateOrTime<>(field, SQLDataType.OFFSETDATETIME); } @@ -29548,7 +29548,7 @@ public class DSL { * {@link Instant} (in UTC) as the input. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, SQLITE }) + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE }) public static Field instant(String value) { return Tools.field(Convert.convert(value, Instant.class)); } @@ -29563,7 +29563,7 @@ public class DSL { * {@link Instant} (in UTC) as the input. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, SQLITE }) + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE }) public static Field instant(Instant value) { return Tools.field(value); } @@ -29578,7 +29578,7 @@ public class DSL { * {@link Instant} (in UTC) as the input. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, SQLITE }) + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE }) public static Field instant(Field field) { return new DateOrTime<>(field, SQLDataType.INSTANT); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index 3ffdced8c7..26e250c07c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -3611,6 +3611,7 @@ public class DefaultBinding implements Binding { // [#5895] HSQLDB derives the specific data type from the literal + case FIREBIRD: case HSQLDB: case TRINO: ctx.render().visit(K_TIMESTAMP).sql(" '").sql(escape(format(value, family), ctx.render())).sql('\''); @@ -3672,6 +3673,9 @@ public class DefaultBinding implements Binding { + else if (family == FIREBIRD) + ctx.statement().setString(ctx.index(), value.toString()); + else ctx.statement().setString(ctx.index(), format(value, family)); } @@ -3845,6 +3849,7 @@ public class DefaultBinding implements Binding { switch (ctx.family()) { // [#5895] HSQLDB derives the specific data type from the literal + case FIREBIRD: case HSQLDB: case TRINO: ctx.render().visit(K_TIME).sql(" '").sql(escape(format(value), ctx.render())).sql('\''); @@ -3881,6 +3886,9 @@ public class DefaultBinding implements Binding { ctx.statement().setString(ctx.index(), string); } + + else if (ctx.family() == FIREBIRD) + ctx.statement().setString(ctx.index(), value.toString()); else ctx.statement().setObject(ctx.index(), value); } diff --git a/jOOQ/src/main/java/org/jooq/util/firebird/FirebirdDataType.java b/jOOQ/src/main/java/org/jooq/util/firebird/FirebirdDataType.java index 63f17d2e02..d93a852cf7 100644 --- a/jOOQ/src/main/java/org/jooq/util/firebird/FirebirdDataType.java +++ b/jOOQ/src/main/java/org/jooq/util/firebird/FirebirdDataType.java @@ -43,6 +43,9 @@ import java.math.BigInteger; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; +import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.OffsetTime; import java.time.Year; import java.util.UUID; @@ -83,28 +86,31 @@ public class FirebirdDataType { // Default SQL data types and synonyms thereof // ------------------------------------------------------------------------- - public static final DataType SMALLINT = new BuiltInDataType<>(FAMILY, SQLDataType.SMALLINT, "smallint"); - public static final DataType INTEGER = new BuiltInDataType<>(FAMILY, SQLDataType.INTEGER, "integer"); - public static final DataType INT = new BuiltInDataType<>(FAMILY, SQLDataType.INTEGER, "int"); - public static final DataType BIGINT = new BuiltInDataType<>(FAMILY, SQLDataType.BIGINT, "bigint"); - public static final DataType INT64 = new BuiltInDataType<>(FAMILY, SQLDataType.BIGINT, "int64"); - public static final DataType DOUBLEPRECISION = new BuiltInDataType<>(FAMILY, SQLDataType.DOUBLE, "double precision"); - public static final DataType DOUBLE = new BuiltInDataType<>(FAMILY, SQLDataType.DOUBLE, "double"); - public static final DataType D_FLOAT = new BuiltInDataType<>(FAMILY, SQLDataType.DOUBLE, "d_float"); - public static final DataType FLOAT = new BuiltInDataType<>(FAMILY, SQLDataType.REAL, "float"); - public static final DataType BOOLEAN = new BuiltInDataType<>(FAMILY, SQLDataType.BOOLEAN, "boolean"); - public static final DataType DECIMAL = new BuiltInDataType<>(FAMILY, SQLDataType.DECIMAL, "decimal"); - public static final DataType NUMERIC = new BuiltInDataType<>(FAMILY, SQLDataType.NUMERIC, "numeric"); - public static final DataType VARCHAR = new BuiltInDataType<>(FAMILY, SQLDataType.VARCHAR, "varchar", "varchar(4000)"); - public static final DataType CHARACTERVARYING = new BuiltInDataType<>(FAMILY, SQLDataType.VARCHAR, "character varying", "varchar(4000)"); - public static final DataType CHAR = new BuiltInDataType<>(FAMILY, SQLDataType.CHAR, "char"); - public static final DataType CHARACTER = new BuiltInDataType<>(FAMILY, SQLDataType.CHAR, "character"); - public static final DataType CLOB = new BuiltInDataType<>(FAMILY, SQLDataType.CLOB, "blob sub_type text"); - public static final DataType DATE = new BuiltInDataType<>(FAMILY, SQLDataType.DATE, "date"); - public static final DataType