From 42ee53b027284b281058d4b58318cd6d5df0c330 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Fri, 9 Mar 2018 11:53:56 +0100 Subject: [PATCH] [#7171] Support parsing Oracle DECODE function --- .../resources/org/jooq/web/grammar-3.11.txt | 2 ++ .../main/java/org/jooq/impl/ParserImpl.java | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.11.txt b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.11.txt index 9d5f851fae..13169fd058 100644 --- a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.11.txt +++ b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.11.txt @@ -555,6 +555,7 @@ term = | dateLiteral | 'DATE_TRUNC' '(' stringLiteral ',' field ')' | 'DAY' '(' field ')' +| 'DECODE' '(' field ',' field ',' field { ',' field } ')' | 'DENSE_RANK' ( '(' ')' over | '(' fields ')' withinGroup ) | ( 'DEG' | 'DEGREE' ) '(' sum ')' | 'EXTRACT' '(' datePart 'FROM' field ')' @@ -562,6 +563,7 @@ term = | 'EVERY' '(' field ')' [ filter ] [ over ] | 'FLOOR' '(' sum ')' | 'FIRST_VALUE' '(' field ')' over +| 'GETDATE' '(' ')' | 'GREATEST' '(' fields ')' | 'GROUP_CONCAT' '(' [ 'DISTINCT' ] field [ 'ORDER BY' sortFields ] [ 'SEPARATOR' stringLiteral ] ')' | 'GROUP_ID' '(' ')' diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 4226d6318e..c370551c19 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -3835,6 +3835,9 @@ final class ParserImpl implements Parser { else if (parseFunctionNameIf(ctx, "DEGREE") || parseFunctionNameIf(ctx, "DEG")) return deg((Field) parseFieldSumParenthesised(ctx)); + if ((field = parseFieldDecodeIf(ctx)) != null) + return field; + break; case 'e': @@ -4923,6 +4926,27 @@ final class ParserImpl implements Parser { return null; } + private static final Field parseFieldDecodeIf(ParserContext ctx) { + if (parseFunctionNameIf(ctx, "DECODE")) { + parse(ctx, '('); + List> fields = parseFields(ctx); + int size = fields.size(); + if (size < 3) + throw ctx.expected("At least three arguments to DECODE()"); + + parse(ctx, ')'); + return DSL.decode( + (Field) fields.get(0), + (Field) fields.get(1), + (Field) fields.get(2), + (Field[]) (size == 3 ? EMPTY_FIELD : fields.subList(3, size).toArray(EMPTY_FIELD)) + ); + + } + + return null; + } + private static final Field parseFieldYearIf(ParserContext ctx) { if (parseFunctionNameIf(ctx, "YEAR")) { parse(ctx, '(');