From 570bc41f0375ccb1e6884f1c255f2e8cbb740cf2 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Tue, 29 Jan 2019 11:26:25 +0100 Subject: [PATCH] [#8261] [#7518] Added parser support for additional TRIM syntax --- .../resources/org/jooq/web/grammar-3.12.txt | 7 +-- .../main/java/org/jooq/impl/ParserImpl.java | 43 +++++++++++++++++-- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt index cb3b07cd64..fca2775b82 100644 --- a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt +++ b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt @@ -766,7 +766,7 @@ term = | 'ISNULL' '(' field ',' field ')' | ( 'LOWER' | 'LCASE' ) '(' field ')' | 'LPAD' '(' field ',' field [ ',' field ] ')' -| 'LTRIM' '(' field ')' +| 'LTRIM' '(' field [ ',' field ] ')' | 'LEFT' '(' field ',' field ')' | 'LEN' '(' field ')' | 'LENGTH' '(' field ')' @@ -820,7 +820,7 @@ term = | 'REPEAT' '(' field ',' field ')' | 'REVERSE' '(' field ')' | 'RPAD' '(' field ',' field [ ',' field ] ')' -| 'RTRIM' '(' field ')' +| 'RTRIM' '(' field [ ',' field ] ')' | 'RIGHT' '(' field ',' field ')' | 'ROW_NUMBER' '(' ')' over | 'RANK' ( '(' ')' over | '(' fields ')' withinGroup ) @@ -854,7 +854,8 @@ term = | 'TO_NUMBER' '(' field ')' | 'TO_TIMESTAMP' '(' field ',' field ')' | ( 'TRANSLATE' | 'OTRANSLATE' ) '(' field ',' field ',' field ')' -| 'TRIM' '(' field ')' +| 'TRIM' '(' field [ ',' field ] ')' +| 'TRIM' '(' ( 'LEADING' | 'L' | 'TRAILING' | 'T' | 'BOTH' | 'B' ) [ field ] 'FROM' field ')' | 'TRUNC' '(' field ',' stringLiteral ')' | 'TRUNC' '(' numericOp ',' numericOp ')' | truthValue diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 30703faaae..73dc19f1e3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -6606,9 +6606,40 @@ final class ParserImpl implements Parser { private static final Field parseFieldTrimIf(ParserContext ctx) { if (parseFunctionNameIf(ctx, "TRIM")) { parse(ctx, '('); + int position = ctx.position(); + + boolean leading = parseKeywordIf(ctx, "LEADING") || parseKeywordIf(ctx, "L"); + boolean trailing = !leading && (parseKeywordIf(ctx, "TRAILING") || parseKeywordIf(ctx, "T")); + boolean both = !leading && !trailing && (parseKeywordIf(ctx, "BOTH") || parseKeywordIf(ctx, "B")); + + if ((leading || trailing || both) && parseIf(ctx, ',')) { + ctx.position(position); + } + else if ((leading || trailing || both) && parseKeywordIf(ctx, "FROM")) { + Field f = (Field) parseField(ctx, S); + parse(ctx, ')'); + + return leading ? ltrim(f) + : trailing ? rtrim(f) + : trim(f); + } + Field f1 = (Field) parseField(ctx, S); - parse(ctx, ')'); - return trim(f1); + + if (parseKeywordIf(ctx, "FROM")) { + Field f2 = (Field) parseField(ctx, S); + parse(ctx, ')'); + + return leading ? ltrim(f2, f1) + : trailing ? rtrim(f2, f1) + : trim(f2, f1); + } + else { + Field f2 = parseIf(ctx, ',') ? (Field) parseField(ctx, S) : null; + parse(ctx, ')'); + + return f2 == null ? trim(f1) : trim(f1, f2); + } } return null; @@ -6683,8 +6714,10 @@ final class ParserImpl implements Parser { if (parseFunctionNameIf(ctx, "RTRIM")) { parse(ctx, '('); Field f1 = (Field) parseField(ctx, S); + Field f2 = parseIf(ctx, ',') ? (Field) parseField(ctx, S) : null; parse(ctx, ')'); - return rtrim(f1); + + return f2 == null ? rtrim(f1) : rtrim(f1, f2); } return null; @@ -6694,8 +6727,10 @@ final class ParserImpl implements Parser { if (parseFunctionNameIf(ctx, "LTRIM")) { parse(ctx, '('); Field f1 = (Field) parseField(ctx, S); + Field f2 = parseIf(ctx, ',') ? (Field) parseField(ctx, S) : null; parse(ctx, ')'); - return ltrim(f1); + + return f2 == null ? ltrim(f1) : ltrim(f1, f2); } return null;