From ca0427d10d93ee902f0b8dcccc84ddf13a50032d Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 25 Mar 2022 11:23:43 +0100 Subject: [PATCH] [jOOQ/jOOQ#9879] Support SET ROW = (SELECT ..) for single selects --- .../java/org/jooq/impl/FieldMapForUpdate.java | 6 +++++- .../org/jooq/impl/FieldMapsForInsert.java | 14 ++++++++----- .../java/org/jooq/impl/InsertQueryImpl.java | 2 -- jOOQ/src/main/java/org/jooq/impl/Tools.java | 21 ++++++++++++------- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java index 0ca3a555d6..105c55fb01 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java @@ -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 Set keysAndComputedOnClient(Set 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> fields = keysAndComputedOnClient(keysFlattened(ctx), table); + Set> fields = keysFlattened(ctx); + + + + + if (!fields.isEmpty()) ctx.sql(" (").visit(wrap(fields).qualify(false)).sql(')'); diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index 3c73aed6e9..6dfcc34e48 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -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; diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 7cb7d339d6..45ac62fc68 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -5683,13 +5683,6 @@ final class Tools { return map(orderFields, (OrderField f) -> field(f)); } - static final List> fields(FieldOrRow fr) { - if (fr instanceof Field) - return singletonList((Field) fr); - else - return asList(((Row) fr).fields()); - } - static final Field unalias(Field field) { Field result = aliased(field); return result != null ? result : field; @@ -6050,6 +6043,20 @@ final class Tools { return filter(asList(array), predicate); } + static final List> flattenFieldOrRow(FieldOrRow fr) { + if (fr instanceof Field) + return singletonList((Field) fr); + else + return asList(((Row) fr).fields()); + } + + static final >> C flattenFieldOrRows(Collection frs, C c) { + for (FieldOrRow fr : frs) + c.addAll(flattenFieldOrRow(fr)); + + return c; + } + /** * Flatten out an {@link EmbeddableTableField}. */