diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index b1c5981bbc..47a9213c54 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -6905,7 +6905,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { if (type == Boolean.class) return condition((Field) part); - + // [#11631] [#12394] Numeric expressions are booleans in MySQL else if (dataType.isNumeric()) return ((Field) part).ne(zero()); @@ -7498,6 +7498,8 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return field; else if ((field = parseFieldJSONValueIf()) != null) return field; + else if ((field = parseFieldJSONLiteralIf()) != null) + return field; break; @@ -8491,6 +8493,60 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return parseKeywordIf("RETURNING") ? parseDataType() : null; } + private final Field parseFieldJSONLiteralIf() { + if (parseKeywordIf("JSON")) { + if (parseIf('{')) { + if (parseIf('}')) + return jsonObject(); + + List> entries = parseList(',', ctx -> { + String key = parseJSONIdentifier(); + parse(':'); + return key(key).value(parseField()); + }); + + parse('}'); + return jsonObject(entries); + } + else if (parseIf('[')) { + if (parseIf(']')) + return jsonArray(); + + List> fields = parseList(',', c -> parseField()); + parse(']'); + return jsonArray(fields); + } + else + throw expected("[", "{"); + } + + return null; + } + + private final String parseJSONIdentifier() { + parse('"'); + StringBuilder sb = new StringBuilder(); + + loop: + while (hasMore()) { + switch (character()) { + case '\\': + if (hasMore(1)) + positionInc(); + + break; + case '"': + break loop; + } + + sb.append(character()); + positionInc(); + } + + parse('"'); + return sb.toString(); + } + private final Field parseFieldJSONArrayConstructorIf() { boolean jsonb = false;