[jOOQ/jOOQ#10523] Emulate UPDATE .. SET row = (SELECT ...) for dialects

with no native support
This commit is contained in:
Lukas Eder 2022-03-23 16:20:08 +01:00
parent 0a1181b460
commit 2ffd6f4246
7 changed files with 195 additions and 93 deletions

View File

@ -220,139 +220,139 @@ public interface UpdateQuery<R extends Record> extends StoreQuery<R>, ConditionP
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
void addValues(RowN row, Select<? extends Record> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1> void addValues(Row1<T1> row, Select<? extends Record1<T1>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2> void addValues(Row2<T1, T2> row, Select<? extends Record2<T1, T2>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3> void addValues(Row3<T1, T2, T3> row, Select<? extends Record3<T1, T2, T3>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4> void addValues(Row4<T1, T2, T3, T4> row, Select<? extends Record4<T1, T2, T3, T4>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5> void addValues(Row5<T1, T2, T3, T4, T5> row, Select<? extends Record5<T1, T2, T3, T4, T5>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6> void addValues(Row6<T1, T2, T3, T4, T5, T6> row, Select<? extends Record6<T1, T2, T3, T4, T5, T6>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7> void addValues(Row7<T1, T2, T3, T4, T5, T6, T7> row, Select<? extends Record7<T1, T2, T3, T4, T5, T6, T7>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8> void addValues(Row8<T1, T2, T3, T4, T5, T6, T7, T8> row, Select<? extends Record8<T1, T2, T3, T4, T5, T6, T7, T8>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9> void addValues(Row9<T1, T2, T3, T4, T5, T6, T7, T8, T9> row, Select<? extends Record9<T1, T2, T3, T4, T5, T6, T7, T8, T9>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> void addValues(Row10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> row, Select<? extends Record10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> void addValues(Row11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> row, Select<? extends Record11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> void addValues(Row12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> row, Select<? extends Record12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> void addValues(Row13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> row, Select<? extends Record13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> void addValues(Row14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> row, Select<? extends Record14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> void addValues(Row15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> row, Select<? extends Record15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> void addValues(Row16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> row, Select<? extends Record16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> void addValues(Row17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> row, Select<? extends Record17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> void addValues(Row18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> row, Select<? extends Record18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> void addValues(Row19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> row, Select<? extends Record19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> void addValues(Row20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> row, Select<? extends Record20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> void addValues(Row21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> row, Select<? extends Record21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> void addValues(Row22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> row, Select<? extends Record22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>> select);

View File

@ -337,161 +337,161 @@ public interface UpdateSetFirstStep<R extends Record> extends UpdateSetStep<R> {
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
UpdateFromStep<R> set(RowN row, Select<? extends Record> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1> UpdateFromStep<R> set(Row1<T1> row, Select<? extends Record1<T1>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2> UpdateFromStep<R> set(Row2<T1, T2> row, Select<? extends Record2<T1, T2>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3> UpdateFromStep<R> set(Row3<T1, T2, T3> row, Select<? extends Record3<T1, T2, T3>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4> UpdateFromStep<R> set(Row4<T1, T2, T3, T4> row, Select<? extends Record4<T1, T2, T3, T4>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5> UpdateFromStep<R> set(Row5<T1, T2, T3, T4, T5> row, Select<? extends Record5<T1, T2, T3, T4, T5>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6> UpdateFromStep<R> set(Row6<T1, T2, T3, T4, T5, T6> row, Select<? extends Record6<T1, T2, T3, T4, T5, T6>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7> UpdateFromStep<R> set(Row7<T1, T2, T3, T4, T5, T6, T7> row, Select<? extends Record7<T1, T2, T3, T4, T5, T6, T7>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8> UpdateFromStep<R> set(Row8<T1, T2, T3, T4, T5, T6, T7, T8> row, Select<? extends Record8<T1, T2, T3, T4, T5, T6, T7, T8>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9> UpdateFromStep<R> set(Row9<T1, T2, T3, T4, T5, T6, T7, T8, T9> row, Select<? extends Record9<T1, T2, T3, T4, T5, T6, T7, T8, T9>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> UpdateFromStep<R> set(Row10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> row, Select<? extends Record10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> UpdateFromStep<R> set(Row11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> row, Select<? extends Record11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> UpdateFromStep<R> set(Row12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> row, Select<? extends Record12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> UpdateFromStep<R> set(Row13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> row, Select<? extends Record13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> UpdateFromStep<R> set(Row14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> row, Select<? extends Record14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> UpdateFromStep<R> set(Row15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> row, Select<? extends Record15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> UpdateFromStep<R> set(Row16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> row, Select<? extends Record16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> UpdateFromStep<R> set(Row17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> row, Select<? extends Record17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> UpdateFromStep<R> set(Row18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> row, Select<? extends Record18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> UpdateFromStep<R> set(Row19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> row, Select<? extends Record19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> UpdateFromStep<R> set(Row20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> row, Select<? extends Record20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> UpdateFromStep<R> set(Row21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> row, Select<? extends Record21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>> select);
/**
* Specify a multi-column set clause for the <code>UPDATE</code> statement.
*/
@NotNull @CheckReturnValue
@Support({ H2, HSQLDB, POSTGRES, YUGABYTEDB })
@Support
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> UpdateFromStep<R> set(Row22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> row, Select<? extends Record22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>> select);
}

View File

@ -37,22 +37,33 @@
*/
package org.jooq.impl;
import static org.jooq.Clause.UPDATE_SET_ASSIGNMENT;
// ...
// ...
// ...
// ...
// ...
// ...
import static org.jooq.SQLDialect.CUBRID;
// ...
import static org.jooq.SQLDialect.DERBY;
// ...
import static org.jooq.SQLDialect.FIREBIRD;
import static org.jooq.SQLDialect.H2;
// ...
import static org.jooq.SQLDialect.HSQLDB;
import static org.jooq.SQLDialect.IGNITE;
// ...
// ...
import static org.jooq.SQLDialect.MARIADB;
// ...
import static org.jooq.SQLDialect.MYSQL;
// ...
import static org.jooq.SQLDialect.POSTGRES;
// ...
// ...
// ...
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...
@ -61,10 +72,13 @@ import static org.jooq.SQLDialect.SQLITE;
import static org.jooq.SQLDialect.YUGABYTEDB;
import static org.jooq.conf.WriteIfReadonly.IGNORE;
import static org.jooq.conf.WriteIfReadonly.THROW;
import static org.jooq.impl.DSL.field;
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.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;
@ -101,22 +115,25 @@ import org.jooq.impl.QOM.UNotYetImplemented;
*/
final class FieldMapForUpdate extends AbstractQueryPartMap<FieldOrRow, FieldOrRowOrSelect> implements UNotYetImplemented {
static final Set<SQLDialect> CASTS_NEEDED = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_QUALIFY = SQLDialect.supportedBy(POSTGRES, SQLITE, YUGABYTEDB);
static final Set<SQLDialect> CASTS_NEEDED = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_QUALIFY = SQLDialect.supportedBy(POSTGRES, SQLITE, YUGABYTEDB);
static final Set<SQLDialect> EMULATE_RVE_SET_QUERY = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, IGNITE, MARIADB, MYSQL, SQLITE);
static final Set<SQLDialect> SUPPORT_RVE_SET = SQLDialect.supportedBy(H2, HSQLDB, POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> REQUIRE_RVE_ROW_CLAUSE = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> SUPPORT_RVE_SET = SQLDialect.supportedBy(H2, HSQLDB, POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> REQUIRE_RVE_ROW_CLAUSE = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
private final Table<?> table;
private final Clause assignmentClause;
final Table<?> table;
final SetClause setClause;
final Clause assignmentClause;
FieldMapForUpdate(Table<?> table, Clause assignmentClause) {
FieldMapForUpdate(Table<?> table, SetClause setClause, Clause assignmentClause) {
this.table = table;
this.setClause = setClause;
this.assignmentClause = assignmentClause;
}
@ -157,12 +174,7 @@ final class FieldMapForUpdate extends AbstractQueryPartMap<FieldOrRow, FieldOrRo
if (!"".equals(separator))
ctx.sql(separator)
.formatSeparator();
acceptAssignmentClause(ctx, supportsQualify, key, value);
separator = ",";
separator = acceptAssignmentClause(ctx, supportsQualify, key, value, separator);
}
if (!CASTS_NEEDED.contains(ctx.dialect()))
@ -173,12 +185,17 @@ final class FieldMapForUpdate extends AbstractQueryPartMap<FieldOrRow, FieldOrRo
}
@SuppressWarnings("unchecked")
private final void acceptAssignmentClause(
private final String acceptAssignmentClause(
Context<?> ctx,
boolean supportsQualify,
FieldOrRow key,
FieldOrRowOrSelect value
FieldOrRowOrSelect value,
String separator
) {
if (!"".equals(separator))
ctx.sql(separator)
.formatSeparator();
if (assignmentClause != null)
ctx.start(assignmentClause);
@ -189,7 +206,7 @@ final class FieldMapForUpdate extends AbstractQueryPartMap<FieldOrRow, FieldOrRo
// [#6884] This syntax can be emulated trivially, if the RHS is not a SELECT subquery
if (multiValue != null && !SUPPORT_RVE_SET.contains(ctx.dialect())) {
FieldMapForUpdate map = new FieldMapForUpdate(table(), null);
FieldMapForUpdate map = new FieldMapForUpdate(table(), setClause, null);
for (int i = 0; i < multiRow.size(); i++) {
Field<?> k = multiRow.field(i);
@ -198,7 +215,7 @@ final class FieldMapForUpdate extends AbstractQueryPartMap<FieldOrRow, FieldOrRo
map.put(k, Tools.field(v, k));
}
toSQLUpdateMap(ctx, map);
ctx.visit(map);
}
@ -215,6 +232,42 @@ final class FieldMapForUpdate extends AbstractQueryPartMap<FieldOrRow, FieldOrRo
// [#10523] Generic SET ROW = (SELECT ..) emulation that works
// everywhere, but inefficiently duplicates the subquery
else if (multiSelect != null && EMULATE_RVE_SET_QUERY.contains(ctx.dialect())) {
Row row = removeReadonly(ctx, multiRow);
int size = row.size();
Select<?> select;
select = multiSelect;
// [#10523] Simplify special case
if (size == 1) {
ctx.qualify(false, c -> c.visit(row.field(0)))
.sql(" = ");
visitSubquery(ctx, select, false, false, false);
}
else {
Field<?>[] f = Tools.fields(size);
for (int i = 0; i < size; i++) {
FieldMapForUpdate mu = new FieldMapForUpdate(table, setClause, null);
separator = mu.acceptAssignmentClause(ctx,
supportsQualify,
row.field(i),
field(select(f[i]).from(select.asTable(table(name("t")), f))),
separator
);
}
}
}
else {
Row row = removeReadonly(ctx, multiRow);
@ -270,13 +323,8 @@ final class FieldMapForUpdate extends AbstractQueryPartMap<FieldOrRow, FieldOrRo
if (assignmentClause != null)
ctx.end(assignmentClause);
}
static final void toSQLUpdateMap(Context<?> ctx, FieldMapForUpdate updateMap) {
ctx.formatIndentStart()
.formatSeparator()
.visit(updateMap)
.formatIndentEnd();
return ",";
}
static final Row removeReadonly(Context<?> ctx, Row row) {
@ -293,8 +341,13 @@ final class FieldMapForUpdate extends AbstractQueryPartMap<FieldOrRow, FieldOrRo
final void set(Map<?, ?> map) {
map.forEach((k, v) -> {
Field<?> field = Tools.tableField(table, k);
put(field, Tools.field(v, field));
if (k instanceof Row) { Row r = (Row) k;
put(r, (FieldOrRowOrSelect) v);
}
else {
Field<?> field = Tools.tableField(table, k);
put(field, Tools.field(v, field));
}
});
}
@ -315,4 +368,27 @@ final class FieldMapForUpdate extends AbstractQueryPartMap<FieldOrRow, FieldOrRo
enum SetClause {
UPDATE,
INSERT,
MERGE
}
}

View File

@ -66,6 +66,7 @@ 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;
@ -97,6 +98,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@ -124,6 +126,7 @@ import org.jooq.Table;
import org.jooq.TableField;
import org.jooq.UniqueKey;
import org.jooq.conf.WriteIfReadonly;
import org.jooq.impl.FieldMapForUpdate.SetClause;
import org.jooq.impl.QOM.UNotYetImplemented;
import org.jooq.impl.Tools.DataExtendedKey;
import org.jooq.tools.StringUtils;
@ -160,7 +163,7 @@ implements
InsertQueryImpl(Configuration configuration, WithImpl with, Table<R> into) {
super(configuration, with, into);
this.updateMap = new FieldMapForUpdate(into, INSERT_ON_DUPLICATE_KEY_UPDATE_ASSIGNMENT);
this.updateMap = new FieldMapForUpdate(into, SetClause.INSERT, INSERT_ON_DUPLICATE_KEY_UPDATE_ASSIGNMENT);
this.insertMaps = new FieldMapsForInsert(into);
this.onConflictWhere = new ConditionProviderImpl();
this.condition = new ConditionProviderImpl();
@ -224,7 +227,7 @@ implements
onConflictOnConstraint0(constraint(constraint));
}
private void onConflictOnConstraint0(Constraint constraint) {
private final void onConflictOnConstraint0(Constraint constraint) {
this.onConstraint = constraint;
if (onConstraintUniqueKey == null)
@ -554,7 +557,7 @@ implements
// CUBRID can emulate this using ON DUPLICATE KEY UPDATE
case CUBRID: {
FieldMapForUpdate update = new FieldMapForUpdate(table(), INSERT_ON_DUPLICATE_KEY_UPDATE_ASSIGNMENT);
FieldMapForUpdate update = new FieldMapForUpdate(table(), SetClause.INSERT, INSERT_ON_DUPLICATE_KEY_UPDATE_ASSIGNMENT);
Field<?> field = table().field(0);
update.put(field, field);
@ -876,6 +879,15 @@ implements
if (s == null)
s = select(map(f, x -> x.getDataType().defaulted() ? x.getDataType().default_() : DSL.NULL(x)));
// [#6375] INSERT .. VALUES and INSERT .. SELECT distinction also in MERGE
t = s.asTable("t", map(f, Field::getName, String[]::new));
@ -894,10 +906,23 @@ implements
// [#1295] Use UPDATE clause only when with ON DUPLICATE KEY UPDATE,
// not with ON DUPLICATE KEY IGNORE
MergeNotMatchedStep<R> notMatched = on;
if (onDuplicateKeyUpdate)
if (onDuplicateKeyUpdate) {
final FieldMapForUpdate um;
um = updateMap;
notMatched = condition.hasWhere()
? on.whenMatchedAnd(condition.getWhere()).thenUpdate().set(updateMap)
: on.whenMatchedThenUpdate().set(updateMap);
? on.whenMatchedAnd(condition.getWhere()).thenUpdate().set(um)
: on.whenMatchedThenUpdate().set(um);
}
return t != null
? notMatched.whenNotMatchedThenInsert(f).values(t.fields())

View File

@ -175,6 +175,7 @@ import org.jooq.Table;
import org.jooq.TableLike;
import org.jooq.UniqueKey;
import org.jooq.exception.DataTypeException;
import org.jooq.impl.FieldMapForUpdate.SetClause;
import org.jooq.impl.QOM.UNotYetImplemented;
import org.jooq.impl.Tools.DataExtendedKey;
import org.jooq.tools.StringUtils;
@ -1796,7 +1797,7 @@ implements
}
MatchedClause(Condition condition, boolean delete) {
this(condition, delete, new FieldMapForUpdate(table, MERGE_SET_ASSIGNMENT));
this(condition, delete, new FieldMapForUpdate(table, SetClause.MERGE, MERGE_SET_ASSIGNMENT));
}
MatchedClause(Condition condition, boolean delete, FieldMapForUpdate updateMap) {

View File

@ -185,6 +185,7 @@ import static org.jooq.impl.SQLDataType.OTHER;
import static org.jooq.impl.SQLDataType.SMALLINT;
import static org.jooq.impl.SQLDataType.VARCHAR;
import static org.jooq.impl.SQLDataType.XML;
import static org.jooq.impl.Tools.anyMatch;
import static org.jooq.impl.Tools.DataKey.DATA_BLOCK_NESTING;
import static org.jooq.tools.StringUtils.defaultIfNull;
@ -5301,6 +5302,11 @@ final class Tools {

View File

@ -157,6 +157,7 @@ import org.jooq.Select;
import org.jooq.Table;
import org.jooq.TableLike;
import org.jooq.UpdateQuery;
import org.jooq.impl.FieldMapForUpdate.SetClause;
import org.jooq.impl.QOM.UNotYetImplemented;
/**
@ -193,7 +194,7 @@ implements
UpdateQueryImpl(Configuration configuration, WithImpl with, Table<R> table) {
super(configuration, with, table);
this.updateMap = new FieldMapForUpdate(table, UPDATE_SET_ASSIGNMENT);
this.updateMap = new FieldMapForUpdate(table, SetClause.UPDATE, UPDATE_SET_ASSIGNMENT);
this.from = new TableList();
this.condition = new ConditionProviderImpl();
this.orderBy = new SortFieldList();
@ -542,15 +543,6 @@ implements
accept1(ctx);
}
@ -598,10 +590,12 @@ implements
ctx.formatSeparator()
.start(UPDATE_SET)
.visit(K_SET)
.separatorRequired(true);
FieldMapForUpdate.toSQLUpdateMap(ctx, updateMap);
ctx.end(UPDATE_SET);
.separatorRequired(true)
.formatIndentStart()
.formatSeparator()
.visit(updateMap)
.formatIndentEnd()
.end(UPDATE_SET);