[jOOQ/jOOQ#9879] Support SET ROW = (SELECT ..) for single selects

This commit is contained in:
Lukas Eder 2022-03-25 11:23:43 +01:00
parent 1e1723a06b
commit ca0427d10d
4 changed files with 28 additions and 15 deletions

View File

@ -78,7 +78,6 @@ import static org.jooq.impl.DSL.row;
import static org.jooq.impl.DSL.select;
import static org.jooq.impl.DSL.table;
import static org.jooq.impl.DSL.when;
import static org.jooq.impl.FieldMapsForInsert.keysAndComputedOnClient;
import static org.jooq.impl.Keywords.K_ROW;
import static org.jooq.impl.Tools.anyMatch;
import static org.jooq.impl.Tools.collect;
@ -91,6 +90,8 @@ import static org.jooq.impl.Tools.unqualified;
import static org.jooq.impl.Tools.visitSubquery;
import static org.jooq.impl.Tools.DataKey.DATA_ON_DUPLICATE_KEY_WHERE;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
@ -416,6 +417,9 @@ final class FieldMapForUpdate extends AbstractQueryPartMap<FieldOrRow, FieldOrRo

View File

@ -53,10 +53,10 @@ import static org.jooq.impl.DSL.select;
import static org.jooq.impl.Keywords.K_DEFAULT_VALUES;
import static org.jooq.impl.Keywords.K_VALUES;
import static org.jooq.impl.QueryPartCollectionView.wrap;
import static org.jooq.impl.Tools.EMPTY_FIELD;
import static org.jooq.impl.Tools.anyMatch;
import static org.jooq.impl.Tools.filter;
import static org.jooq.impl.Tools.flatten;
import static org.jooq.impl.Tools.flattenFieldOrRows;
import static org.jooq.impl.Tools.lazy;
import static org.jooq.impl.Tools.BooleanDataKey.DATA_EMULATE_BULK_INSERT_RETURNING;
@ -213,7 +213,6 @@ final class FieldMapsForInsert extends AbstractQueryPart implements UNotYetImple
.end(INSERT_SELECT);
}
static final <K extends FieldOrRow> Set<K> keysAndComputedOnClient(Set<K> keys, Table<?> table) {
@ -222,8 +221,8 @@ final class FieldMapsForInsert extends AbstractQueryPart implements UNotYetImple
return keys;
}
@ -577,7 +576,12 @@ final class FieldMapsForInsert extends AbstractQueryPart implements UNotYetImple
}
// [#989] Avoid qualifying fields in INSERT field declaration
Set<Field<?>> fields = keysAndComputedOnClient(keysFlattened(ctx), table);
Set<Field<?>> fields = keysFlattened(ctx);
if (!fields.isEmpty())
ctx.sql(" (").visit(wrap(fields).qualify(false)).sql(')');

View File

@ -66,7 +66,6 @@ import static org.jooq.impl.DSL.row;
import static org.jooq.impl.DSL.select;
import static org.jooq.impl.DSL.selectFrom;
import static org.jooq.impl.DSL.selectOne;
import static org.jooq.impl.FieldMapsForInsert.keysAndComputedOnClient;
import static org.jooq.impl.FieldMapsForInsert.toSQLInsertSelect;
import static org.jooq.impl.Keywords.K_DEFAULT;
import static org.jooq.impl.Keywords.K_DEFAULT_VALUES;
@ -82,7 +81,6 @@ import static org.jooq.impl.Keywords.K_SET;
import static org.jooq.impl.Keywords.K_VALUES;
import static org.jooq.impl.Keywords.K_WHERE;
import static org.jooq.impl.QueryPartListView.wrap;
import static org.jooq.impl.Tools.EMPTY_FIELD;
import static org.jooq.impl.Tools.aliasedFields;
import static org.jooq.impl.Tools.anyMatch;
import static org.jooq.impl.Tools.collect;

View File

@ -5683,13 +5683,6 @@ final class Tools {
return map(orderFields, (OrderField<?> f) -> field(f));
}
static final List<Field<?>> fields(FieldOrRow fr) {
if (fr instanceof Field)
return singletonList((Field<?>) fr);
else
return asList(((Row) fr).fields());
}
static final <T> Field<T> unalias(Field<T> field) {
Field<T> result = aliased(field);
return result != null ? result : field;
@ -6050,6 +6043,20 @@ final class Tools {
return filter(asList(array), predicate);
}
static final List<Field<?>> flattenFieldOrRow(FieldOrRow fr) {
if (fr instanceof Field)
return singletonList((Field<?>) fr);
else
return asList(((Row) fr).fields());
}
static final <C extends Collection<Field<?>>> C flattenFieldOrRows(Collection<? extends FieldOrRow> frs, C c) {
for (FieldOrRow fr : frs)
c.addAll(flattenFieldOrRow(fr));
return c;
}
/**
* Flatten out an {@link EmbeddableTableField}.
*/