From e99e209e7b97669cec253307a5168d843840cf33 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 18 Jan 2024 11:12:06 +0100 Subject: [PATCH] [jOOQ/jOOQ#16101] Add parser support for binary trim functions --- .../main/java/org/jooq/impl/ParserImpl.java | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index cfaf2f81c6..e5359d56c4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -95,6 +95,9 @@ import static org.jooq.impl.DSL.atanh; import static org.jooq.impl.DSL.avg; import static org.jooq.impl.DSL.avgDistinct; import static org.jooq.impl.DSL.begin; +import static org.jooq.impl.DSL.binaryLtrim; +import static org.jooq.impl.DSL.binaryRtrim; +import static org.jooq.impl.DSL.binaryTrim; import static org.jooq.impl.DSL.bitAnd; import static org.jooq.impl.DSL.bitAndAgg; import static org.jooq.impl.DSL.bitCount; @@ -8967,7 +8970,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { else if (parseFunctionNameIf("LPAD")) return parseFunctionArgs3(DSL::lpad, DSL::lpad); else if (parseFunctionNameIf("LTRIM")) - return parseFunctionArgs2(DSL::ltrim, DSL::ltrim); + return parseFunctionArgs2(DSL::ltrim, (f1, f2) -> f1.getDataType().isBinary() ? binaryLtrim(f1, f2) : ltrim(f1, f2)); else if (parseFunctionNameIf("LEFT")) return parseFunctionArgs2(DSL::left); else if (parseFunctionNameIf("LENGTH", "LEN")) @@ -9124,7 +9127,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { else if (parseFunctionNameIf("RPAD")) return parseFunctionArgs3(DSL::rpad, DSL::rpad); else if (parseFunctionNameIf("RTRIM")) - return parseFunctionArgs2(DSL::rtrim, DSL::rtrim); + return parseFunctionArgs2(DSL::rtrim, (f1, f2) -> f1.getDataType().isBinary() ? binaryRtrim(f1, f2) : rtrim(f1, f2)); else if (parseFunctionNameIf("RIGHT")) return parseFunctionArgs2(DSL::right); else if (parseFunctionNameIf("RANDOM_UUID") && parseEmptyParens()) @@ -11524,6 +11527,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { boolean leading = parseKeywordIf("LEADING", "L"); boolean trailing = !leading && parseKeywordIf("TRAILING", "T"); boolean both = !leading && !trailing && parseKeywordIf("BOTH", "B"); + boolean binary = false; if (leading || trailing || both) { if (parseIf(',') || parseIf(')')) { @@ -11533,8 +11537,10 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { Field f = (Field) parseField(); parse(')'); - return leading ? ltrim(f) - : trailing ? rtrim(f) + return leading + ? ltrim(f) + : trailing + ? rtrim(f) : trim(f); } } @@ -11550,21 +11556,35 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } } - Field f1 = (Field) parseField(); + Field f1 = parseField(); if (parseKeywordIf("FROM")) { - Field f2 = (Field) parseField(); + Field f2 = parseField(); + binary = f2.getDataType().isBinary(); parse(')'); - return leading ? ltrim(f2, f1) - : trailing ? rtrim(f2, f1) - : trim(f2, f1); + return leading + ? binary + ? binaryLtrim(f2, f1) + : ltrim(f2, f1) + : trailing + ? binary + ? binaryRtrim(f2, f1) + : rtrim(f2, f1) + : binary + ? binaryTrim(f2, f1) + : trim(f2, f1); } else { - Field f2 = parseIf(',') ? (Field) parseField() : null; + Field f2 = parseIf(',') ? parseField() : null; + binary = f1.getDataType().isBinary(); parse(')'); - return f2 == null ? trim(f1) : trim(f1, f2); + return f2 == null + ? trim(f1) + : binary + ? binaryTrim(f1, f2) + : trim(f1, f2); } }