[jOOQ/jOOQ#10400] Use DataType.identity() information in the absence of Table.getIdentity() in INSERT .. RETURNING emulation

This commit is contained in:
Lukas Eder 2020-07-15 13:12:56 +02:00
parent 59088d30c8
commit 719aae0a73

View File

@ -1197,18 +1197,17 @@ abstract class AbstractDMLQuery<R extends Record> extends AbstractRowCountQuery
Object... values
) {
if (values != null && values.length > 0) {
final Field<Object> returnIdentity = (Field<Object>) returnedIdentity();
// This shouldn't be null, as relevant dialects should
// return empty generated keys ResultSet
if (table.getIdentity() != null) {
final Field<Object> field = (Field<Object>) 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<R extends Record> 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<R extends Record> 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;
}
}