From 5cd9254af0302f75eebfb9da06c22258754636f9 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 17 Sep 2020 15:12:23 +0200 Subject: [PATCH] [jOOQ/jOOQ#9775] Support parsing single-argument TRUNC() function --- .../main/java/org/jooq/impl/ParserImpl.java | 60 +++++++++++-------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 82c9219224..fd68cec5ff 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -7877,36 +7877,44 @@ final class ParserImpl implements Parser { if (parseFunctionNameIf(ctx, "TRUNC")) { parse(ctx, '('); Field arg1 = parseField(ctx); - parse(ctx, ','); - String part; - if ((part = parseStringLiteralIf(ctx)) != null) { - part = part.toUpperCase(); + if (parseIf(ctx, ',')) { - DatePart p; - if ("YY".equals(part) || "YYYY".equals(part) || "YEAR".equals(part)) - p = DatePart.YEAR; - else if ("MM".equals(part) || "MONTH".equals(part)) - p = DatePart.MONTH; - else if ("DD".equals(part)) - p = DatePart.DAY; - else if ("HH".equals(part)) - p = DatePart.HOUR; - else if ("MI".equals(part)) - p = DatePart.MINUTE; - else if ("SS".equals(part)) - p = DatePart.SECOND; - else - throw ctx.exception("Unsupported date part"); + String part; + if ((part = parseStringLiteralIf(ctx)) != null) { + part = part.toUpperCase(); - parse(ctx, ')'); - return DSL.trunc((Field) arg1, p); - } - else { - Field arg2 = toField(ctx, parseNumericOp(ctx, N)); - parse(ctx, ')'); - return DSL.trunc((Field) arg1, (Field) arg2); + DatePart p; + if ("YY".equals(part) || "YYYY".equals(part) || "YEAR".equals(part)) + p = DatePart.YEAR; + else if ("MM".equals(part) || "MONTH".equals(part)) + p = DatePart.MONTH; + else if ("DD".equals(part)) + p = DatePart.DAY; + else if ("HH".equals(part)) + p = DatePart.HOUR; + else if ("MI".equals(part)) + p = DatePart.MINUTE; + else if ("SS".equals(part)) + p = DatePart.SECOND; + else + throw ctx.exception("Unsupported date part"); + + parse(ctx, ')'); + return DSL.trunc((Field) arg1, p); + } + else { + Field arg2 = toField(ctx, parseNumericOp(ctx, N)); + parse(ctx, ')'); + return DSL.trunc((Field) arg1, (Field) arg2); + } } + + parse(ctx, ')'); + if (arg1.getDataType().isDateTime()) + return DSL.trunc((Field) arg1, DatePart.DAY); + else + return DSL.trunc((Field) arg1); } return null;