From b56e93585b6522773a4cd6a898510cdec2cf297c Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 5 Jun 2020 15:06:25 +0200 Subject: [PATCH] [jOOQ/jOOQ#7900] Added parser support --- .../main/java/org/jooq/impl/ParserImpl.java | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index a3d4354d66..8c1773643e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -8270,12 +8270,29 @@ final class ParserImpl implements Parser { private static final Field parseFieldDateDiffIf(ParserContext ctx) { if (parseFunctionNameIf(ctx, "DATEDIFF")) { parse(ctx, '('); + DatePart datePart = parseDatePartIf(ctx); + + if (datePart != null) + parse(ctx, ','); + Field d1 = (Field) parseField(ctx, Type.D); - parse(ctx, ','); - Field d2 = (Field) parseField(ctx, Type.D); + + if (parseIf(ctx, ',')) { + Field d2 = (Field) parseField(ctx, Type.D); + parse(ctx, ')'); + + if (datePart != null) + return DSL.dateDiff(datePart, d1, d2); + else + return DSL.dateDiff(d1, d2); + } + parse(ctx, ')'); - return DSL.dateDiff(d1, d2); + if (datePart != null) + return DSL.dateDiff((Field) field(datePart.toName()), d1); + else + throw ctx.unsupportedClause(); } return null; @@ -8319,6 +8336,15 @@ final class ParserImpl implements Parser { } private static final DatePart parseDatePart(ParserContext ctx) { + DatePart result = parseDatePartIf(ctx); + + if (result == null) + throw ctx.expected("DatePart"); + + return result; + } + + private static final DatePart parseDatePartIf(ParserContext ctx) { char character = ctx.characterUpper(); switch (character) { @@ -8441,7 +8467,7 @@ final class ParserImpl implements Parser { break; } - throw ctx.expected("DatePart"); + return null; } private static final DatePart parseIntervalDatePart(ParserContext ctx) {