diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 03010c6453..04d133ce01 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -2352,18 +2352,40 @@ class ParserImpl implements Parser { } private static final FieldOrRow parseExp(ParserContext ctx, Type type) { - FieldOrRow r = parseTerm(ctx, type); + FieldOrRow r = parseSigned(ctx, type); if (N.is(type) && r instanceof Field) for (;;) if (parseIf(ctx, '^')) - r = ((Field) r).pow(toField(ctx, parseTerm(ctx, type))); + r = ((Field) r).pow(toField(ctx, parseSigned(ctx, type))); else break; return r; } + private static final FieldOrRow parseSigned(ParserContext ctx, Type type) { + Integer sign = null; + FieldOrRow r; + + for (;;) + if (parseIf(ctx, '+')) + sign = 1; + else if (parseIf(ctx, '-')) + sign = sign == null ? -1 : -sign; + else + break; + + if (sign == null) + r = parseTerm(ctx, type); + else if (sign == 1) + r = toField(ctx, parseTerm(ctx, type)); + else if ((r = parseFieldUnsignedNumericLiteralIf(ctx, true)) == null) + r = toField(ctx, parseTerm(ctx, type)).neg(); + + return r; + } + private static final FieldOrRow parseTerm(ParserContext ctx, Type type) { parseWhitespaceIf(ctx); @@ -2717,25 +2739,6 @@ class ParserImpl implements Parser { break; - case '+': - parse(ctx, '+'); - - if (N.is(type)) - return parseTerm(ctx, type); - else - break; - - case '-': - parse(ctx, '-'); - - if (N.is(type)) - if ((field = parseFieldUnsignedNumericLiteralIf(ctx, true)) != null) - return field; - else - return toField(ctx, parseTerm(ctx, type)).neg(); - - break; - case '0': case '1': case '2':