From 39f57b928d63633f5649a3628bb2cb4df50a2b67 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 7 May 2021 17:40:02 +0200 Subject: [PATCH] [jOOQ/jOOQ#10522] Emulate UPDATE .. SET row = (SELECT ...) using UPDATE .. FROM --- jOOQ/src/main/java/org/jooq/UpdateQuery.java | 16 ++-- .../java/org/jooq/UpdateSetFirstStep.java | 38 ++++----- .../main/java/org/jooq/impl/UpdateImpl.java | 16 ++-- .../java/org/jooq/impl/UpdateQueryImpl.java | 77 +++++++++++++------ 4 files changed, 85 insertions(+), 62 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/UpdateQuery.java b/jOOQ/src/main/java/org/jooq/UpdateQuery.java index 6f4f920eaa..854c8e8056 100644 --- a/jOOQ/src/main/java/org/jooq/UpdateQuery.java +++ b/jOOQ/src/main/java/org/jooq/UpdateQuery.java @@ -76,6 +76,12 @@ public interface UpdateQuery extends StoreQuery, ConditionP + /** + * Specify a multi-column set clause for the UPDATE statement. + */ + @Support + void addValues(RowN row, RowN value); + /** * Specify a multi-column set clause for the UPDATE statement. */ @@ -211,8 +217,8 @@ public interface UpdateQuery extends StoreQuery, ConditionP /** * Specify a multi-column set clause for the UPDATE statement. */ - @Support - void addValues(RowN row, RowN value); + @Support({ H2, HSQLDB, POSTGRES }) + void addValues(RowN row, Select select); /** * Specify a multi-column set clause for the UPDATE statement. @@ -346,12 +352,6 @@ public interface UpdateQuery extends StoreQuery, ConditionP @Support({ H2, HSQLDB, POSTGRES }) void addValues(Row22 row, Select> select); - /** - * Specify a multi-column set clause for the UPDATE statement. - */ - @Support({ H2, HSQLDB, POSTGRES }) - void addValues(RowN row, Select select); - /** diff --git a/jOOQ/src/main/java/org/jooq/UpdateSetFirstStep.java b/jOOQ/src/main/java/org/jooq/UpdateSetFirstStep.java index bc2db8c075..0b2014fff5 100644 --- a/jOOQ/src/main/java/org/jooq/UpdateSetFirstStep.java +++ b/jOOQ/src/main/java/org/jooq/UpdateSetFirstStep.java @@ -37,15 +37,7 @@ */ package org.jooq; -// ... -// ... -// ... -import static org.jooq.SQLDialect.H2; -// ... -import static org.jooq.SQLDialect.HSQLDB; -// ... -// ... -import static org.jooq.SQLDialect.POSTGRES; +import static org.jooq.SQLDialect.*; import org.jetbrains.annotations.NotNull; @@ -65,6 +57,18 @@ import org.jetbrains.annotations.NotNull; */ public interface UpdateSetFirstStep extends UpdateSetStep { + /** + * Specify a multi-column set clause for the UPDATE statement. + *

+ * This is emulated using a subquery for the value, where row + * value expressions on the right hand side aren't supported, or with an + * ordinary SET clause, where row value expressions on the left hand side + * aren't supported. + */ + @NotNull @CheckReturnValue + @Support + UpdateFromStep set(RowN row, RowN value); + /** * Specify a multi-column set clause for the UPDATE statement. *

@@ -331,15 +335,10 @@ public interface UpdateSetFirstStep extends UpdateSetStep { /** * Specify a multi-column set clause for the UPDATE statement. - *

- * This is emulated using a subquery for the value, where row - * value expressions on the right hand side aren't supported, or with an - * ordinary SET clause, where row value expressions on the left hand side - * aren't supported. */ @NotNull @CheckReturnValue - @Support - UpdateFromStep set(RowN row, RowN value); + @Support({ H2, HSQLDB, POSTGRES }) + UpdateFromStep set(RowN row, Select select); /** * Specify a multi-column set clause for the UPDATE statement. @@ -495,11 +494,4 @@ public interface UpdateSetFirstStep extends UpdateSetStep { @Support({ H2, HSQLDB, POSTGRES }) UpdateFromStep set(Row22 row, Select> select); - /** - * Specify a multi-column set clause for the UPDATE statement. - */ - @NotNull @CheckReturnValue - @Support({ H2, HSQLDB, POSTGRES }) - UpdateFromStep set(RowN row, Select select); - } diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java index 937120af58..2ff4e535d3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java @@ -172,6 +172,12 @@ final class UpdateImpl + @Override + public final UpdateFromStep set(RowN row, RowN value) { + getDelegate().addValues(row, value); + return this; + } + @Override public final UpdateFromStep set(Row1 row, Row1 value) { getDelegate().addValues(row, value); @@ -305,8 +311,8 @@ final class UpdateImpl } @Override - public final UpdateFromStep set(RowN row, RowN value) { - getDelegate().addValues(row, value); + public final UpdateFromStep set(RowN row, Select select) { + getDelegate().addValues(row, select); return this; } @@ -442,12 +448,6 @@ final class UpdateImpl return this; } - @Override - public final UpdateFromStep set(RowN row, Select select) { - getDelegate().addValues(row, select); - return this; - } - @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java index c963c5dcc9..a198c092c5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java @@ -68,12 +68,14 @@ import static org.jooq.SQLDialect.POSTGRES; // ... // ... // ... +// ... import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... // ... import static org.jooq.conf.SettingsTools.getExecuteUpdateWithoutWhere; +import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.row; import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.trueCondition; @@ -84,10 +86,12 @@ import static org.jooq.impl.Keywords.K_ROW; import static org.jooq.impl.Keywords.K_SET; import static org.jooq.impl.Keywords.K_UPDATE; import static org.jooq.impl.Keywords.K_WHERE; +import static org.jooq.impl.Tools.fieldName; import static org.jooq.impl.Tools.visitSubquery; import java.util.Arrays; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Set; @@ -166,6 +170,8 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl + + private static final Set SUPPORT_RVE_SET = SQLDialect.supportedBy(H2, HSQLDB, POSTGRES); private static final Set REQUIRE_RVE_ROW_CLAUSE = SQLDialect.supportedBy(POSTGRES); @@ -200,6 +206,11 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl + @Override + public final void addValues(RowN row, RowN value) { + addValues0(row, value); + } + @Override public final void addValues(Row1 row, Row1 value) { addValues0(row, value); @@ -311,8 +322,8 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl } @Override - public final void addValues(RowN row, RowN value) { - addValues0(row, value); + public final void addValues(RowN row, Select select) { + addValues0(row, select); } @Override @@ -425,11 +436,6 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl addValues0(row, select); } - @Override - public final void addValues(RowN row, Select select) { - addValues0(row, select); - } - final void addValues0(Row row, Row value) { @@ -552,14 +558,6 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl - - - - - - - - ctx.formatSeparator() .start(UPDATE_SET) .visit(K_SET) @@ -584,6 +582,24 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl .visit(map) .formatIndentEnd(); } + + + + + + + + + + + + + + + + + + else { ctx.start(UPDATE_SET_ASSIGNMENT) .formatIndentStart() @@ -645,14 +661,7 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl default: - ctx.start(UPDATE_FROM); - - if (!from.isEmpty()) - ctx.formatSeparator() - .visit(K_FROM).sql(' ') - .declareTables(true, c -> c.visit(from)); - - ctx.end(UPDATE_FROM); + acceptFrom(ctx); break; } @@ -707,6 +716,28 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl ctx.end(UPDATE_RETURNING); } + private final void acceptFrom(Context ctx) { + ctx.start(UPDATE_FROM); + + TableList f; + + + + + + + + + f = from; + + if (!f.isEmpty()) + ctx.formatSeparator() + .visit(K_FROM).sql(' ') + .declareTables(true, c -> c.visit(f)); + + ctx.end(UPDATE_FROM); + } + @Override public final Clause[] clauses(Context ctx) { return CLAUSES;