diff --git a/jOOQ/src/main/java/org/jooq/SelectForStep.java b/jOOQ/src/main/java/org/jooq/SelectForStep.java index 93a0082947..c024cf69b8 100644 --- a/jOOQ/src/main/java/org/jooq/SelectForStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectForStep.java @@ -40,10 +40,12 @@ package org.jooq; // ... // ... // ... +// ... import static org.jooq.SQLDialect.H2; import static org.jooq.SQLDialect.MARIADB; import static org.jooq.SQLDialect.MYSQL; // ... +// ... import static org.jooq.SQLDialect.POSTGRES; // ... diff --git a/jOOQ/src/main/java/org/jooq/SelectForXMLCommonDirectivesStep.java b/jOOQ/src/main/java/org/jooq/SelectForXMLCommonDirectivesStep.java index 3c15437be3..2dea1cd4c4 100644 --- a/jOOQ/src/main/java/org/jooq/SelectForXMLCommonDirectivesStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectForXMLCommonDirectivesStep.java @@ -116,6 +116,9 @@ package org.jooq; + + + diff --git a/jOOQ/src/main/java/org/jooq/SelectForXMLPathDirectivesStep.java b/jOOQ/src/main/java/org/jooq/SelectForXMLPathDirectivesStep.java index 851fa6b315..22fceecc89 100644 --- a/jOOQ/src/main/java/org/jooq/SelectForXMLPathDirectivesStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectForXMLPathDirectivesStep.java @@ -110,6 +110,9 @@ package org.jooq; + + + diff --git a/jOOQ/src/main/java/org/jooq/SelectForXMLRawDirectivesStep.java b/jOOQ/src/main/java/org/jooq/SelectForXMLRawDirectivesStep.java index 851fa6b315..22fceecc89 100644 --- a/jOOQ/src/main/java/org/jooq/SelectForXMLRawDirectivesStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectForXMLRawDirectivesStep.java @@ -110,6 +110,9 @@ package org.jooq; + + + diff --git a/jOOQ/src/main/java/org/jooq/SelectForXMLStep.java b/jOOQ/src/main/java/org/jooq/SelectForXMLStep.java index df09e89084..42d7783437 100644 --- a/jOOQ/src/main/java/org/jooq/SelectForXMLStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectForXMLStep.java @@ -138,6 +138,9 @@ package org.jooq; + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONTable.java b/jOOQ/src/main/java/org/jooq/impl/JSONTable.java index e0314b7e49..f6fb30223a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONTable.java @@ -43,7 +43,6 @@ import static org.jooq.SQLDialect.MYSQL; import static org.jooq.conf.ParamType.INLINED; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.keyword; -import static org.jooq.impl.DSL.rowNumber; import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.val; import static org.jooq.impl.Keywords.K_COLUMNS; @@ -209,23 +208,30 @@ implements private final void acceptPostgres(Context ctx) { List> cols = new ArrayList<>(); - for (JSONTableColumn col : columns) - if (col.forOrdinality) - cols.add(rowNumber().over().as(col.field)); - else + boolean requireOrdinality = false; + for (JSONTableColumn col : columns) { + if (col.forOrdinality) { + requireOrdinality = true; + cols.add(DSL.field("o").as(col.field)); + } + else { cols.add( DSL.field("(jsonb_path_query_first(j, {0}::jsonpath)->>0)::{1}", col.path != null ? val(col.path) : inline("$." + col.field.getName()), keyword(col.type.getCastTypeName(ctx.configuration())) ).as(col.field) ); + } + } ctx.sql('(') .formatIndentStart() .formatNewLine() .subquery(true) .visit( - select(cols).from("jsonb_path_query({0}, {1}::jsonpath) as t(j)", + select(cols).from(requireOrdinality + ? "jsonb_path_query({0}, {1}::jsonpath) {with} {ordinality} {as} t(j, o)" + : "jsonb_path_query({0}, {1}::jsonpath) {as} t(j)", json.getType() == JSONB.class ? json : json.cast(JSONB), path )