From 7bf70bd54cc666247c4625975c847017fa20ab83 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 17 Apr 2020 11:34:56 +0200 Subject: [PATCH] [jOOQ/jOOQ#8950] Support parsing JSON_TABLE --- .../main/java/org/jooq/impl/ParserImpl.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 8d1b43ee2b..9a658b06b1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -155,6 +155,7 @@ import static org.jooq.impl.DSL.isnull; import static org.jooq.impl.DSL.isoDayOfWeek; import static org.jooq.impl.DSL.jsonEntry; import static org.jooq.impl.DSL.jsonExists; +import static org.jooq.impl.DSL.jsonTable; import static org.jooq.impl.DSL.jsonValue; import static org.jooq.impl.DSL.keyword; import static org.jooq.impl.DSL.lag; @@ -447,6 +448,8 @@ import org.jooq.JSONArrayNullStep; import org.jooq.JSONEntry; import org.jooq.JSONObjectAggNullStep; import org.jooq.JSONObjectNullStep; +import org.jooq.JSONTableColumnPathStep; +import org.jooq.JSONTableColumnsStep; import org.jooq.JSONValueDefaultStep; import org.jooq.JSONValueOnStep; import org.jooq.JoinType; @@ -5113,6 +5116,33 @@ final class ParserImpl implements Parser { ? generateSeries(from, to) : generateSeries(from, to, step); } + else if (parseFunctionNameIf(ctx, "JSON_TABLE")) { + parse(ctx, '('); + + Field json = parseField(ctx); + parse(ctx, ','); + Field path = toField(ctx, parseConcat(ctx, Type.S)); + JSONTableColumnsStep s1 = (JSONTableColumnsStep) jsonTable(json, path); + parseKeyword(ctx, "COLUMNS"); + parse(ctx, '('); + + do { + Name fieldName = parseIdentifier(ctx); + + if (parseKeywordIf(ctx, "FOR ORDINALITY")) { + s1 = s1.column(fieldName).forOrdinality(); + } + else { + JSONTableColumnPathStep s2 = s1.column(fieldName, parseDataType(ctx)); + s1 = parseKeywordIf(ctx, "PATH") ? s2.path(parseStringLiteral(ctx)) : s2; + } + } + while (parseIf(ctx, ',')); + + parse(ctx, ')'); + parse(ctx, ')'); + result = s1; + } else if (parseFunctionNameIf(ctx, "XMLTABLE")) { parse(ctx, '(');