From 719aae0a737d604bacd3db746f1b0ef26b6fcea7 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 15 Jul 2020 13:12:56 +0200 Subject: [PATCH] [jOOQ/jOOQ#10400] Use DataType.identity() information in the absence of Table.getIdentity() in INSERT .. RETURNING emulation --- .../java/org/jooq/impl/AbstractDMLQuery.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index 184cd7f2b2..b7d46c3000 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -1197,18 +1197,17 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery Object... values ) { if (values != null && values.length > 0) { + final Field returnIdentity = (Field) returnedIdentity(); - // This shouldn't be null, as relevant dialects should - // return empty generated keys ResultSet - if (table.getIdentity() != null) { - final Field field = (Field) table.getIdentity().getField(); + if (returnIdentity != null) { Object[] ids = new Object[values.length]; + for (int i = 0; i < values.length; i++) - ids[i] = field.getDataType().convert(values[i]); + ids[i] = returnIdentity.getDataType().convert(values[i]); // Only the IDENTITY value was requested. No need for an // additional query - if (returningResolvedAsterisks.size() == 1 && new Fields<>(returningResolvedAsterisks).field(field) != null) { + if (returningResolvedAsterisks.size() == 1 && new Fields<>(returningResolvedAsterisks).field(returnIdentity) != null) { for (final Object id : ids) { ((Result) getResult()).add( Tools.newRecord( @@ -1237,7 +1236,7 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery .from(table) // [#5050] [#9946] Table.getIdentity() doesn't produce aliased fields yet - .where(table.field(field).in(ids)) + .where(table.field(returnIdentity).in(ids)) .fetch(); returnedResult.attach(originalConfiguration); @@ -1245,4 +1244,15 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery } } } + + private Field returnedIdentity() { + if (table.getIdentity() != null) + return table.getIdentity().getField(); + else + for (Field field : returningResolvedAsterisks) + if (field.getDataType().identity()) + return field; + + return null; + } }