From 9f588ae05feb6864ca90cc0a74fc629cf946036d Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 4 Sep 2023 17:27:27 +0200 Subject: [PATCH] [jOOQ/jOOQ#13786] Parser should support TIMESTAMP 'YYYY-MM-DD' and TIME 'HH:MM' literals --- jOOQ/src/main/java/org/jooq/impl/Convert.java | 11 +++++++--- .../main/java/org/jooq/impl/ParserImpl.java | 20 +++++++++---------- .../src/main/java/org/jooq/tools/Convert.java | 13 ++++++++---- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Convert.java b/jOOQ/src/main/java/org/jooq/impl/Convert.java index 6802412fb4..2723ae5e17 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Convert.java +++ b/jOOQ/src/main/java/org/jooq/impl/Convert.java @@ -1614,9 +1614,10 @@ final class Convert { } static final String patchIso8601Time(String string) { - - // [#12158] Support Db2's 15.30.45 format - return string.length() == 8 + return string.length() == 5 + ? (string + ":00") + // [#12158] Support Db2's 15.30.45 format + : string.length() == 8 ? string.replace('.', ':') : string; } @@ -1627,6 +1628,10 @@ final class Convert { if (string.endsWith(" UTC")) string = string.replace(" UTC", "Z"); + // [#13786] Be lenient with PostgreSQL style abbreviated time stamp literals + if (string.length() == 10) + return string + (t ? "T" : " ") + "00:00:00"; + if (string.length() > 11) if (t && string.charAt(10) == ' ') return string.substring(0, 10) + "T" + string.substring(11); diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 8dde1912e7..023b18c4f4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -10477,12 +10477,12 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } private final Timestamp parseTimestampLiteral() { - try { - return Timestamp.valueOf(parseStringLiteral()); - } - catch (IllegalArgumentException e) { + Timestamp timestamp = Convert.convert(parseStringLiteral(), Timestamp.class); + + if (timestamp == null) throw exception("Illegal timestamp literal"); - } + + return timestamp; } private final Field parseFieldTimeLiteralIf() { @@ -10510,12 +10510,12 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } private final Time parseTimeLiteral() { - try { - return Time.valueOf(parseStringLiteral()); - } - catch (IllegalArgumentException e) { + Time time = Convert.convert(parseStringLiteral(), Time.class); + + if (time == null) throw exception("Illegal time literal"); - } + + return time; } private final Field parseFieldIntervalLiteralIf() { diff --git a/jOOQ/src/main/java/org/jooq/tools/Convert.java b/jOOQ/src/main/java/org/jooq/tools/Convert.java index 522efc8a42..a8152eb20e 100644 --- a/jOOQ/src/main/java/org/jooq/tools/Convert.java +++ b/jOOQ/src/main/java/org/jooq/tools/Convert.java @@ -1334,10 +1334,11 @@ public final class Convert { : string; } - private static final String patchIso8601Time(String string) { - - // [#12158] Support Db2's 15.30.45 format - return string.length() == 8 + static final String patchIso8601Time(String string) { + return string.length() == 5 + ? (string + ":00") + // [#12158] Support Db2's 15.30.45 format + : string.length() == 8 ? string.replace('.', ':') : string; } @@ -1348,6 +1349,10 @@ public final class Convert { if (string.endsWith(" UTC")) string = string.replace(" UTC", "Z"); + // [#13786] Be lenient with PostgreSQL style abbreviated time stamp literals + if (string.length() == 10) + return string + (t ? "T" : " ") + "00:00:00"; + if (string.length() > 11) if (t && string.charAt(10) == ' ') return string.substring(0, 10) + "T" + string.substring(11);