[jOOQ/jOOQ#13928] Emulate UPDATE .. RETURNING in MariaDB 10.5+ using INSERT .. SELECT .. ON DUPLICATE KEY UPDATE .. RETURNING

This commit is contained in:
Lukas Eder 2022-08-29 16:32:35 +02:00
parent d558c4ba9f
commit 69f62e6b69
3 changed files with 59 additions and 33 deletions

View File

@ -45,6 +45,7 @@ import org.jetbrains.annotations.*;
// ...
import static org.jooq.SQLDialect.FIREBIRD;
import static org.jooq.SQLDialect.H2;
import static org.jooq.SQLDialect.MARIADB;
// ...
import static org.jooq.SQLDialect.POSTGRES;
// ...
@ -106,7 +107,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
UpdateResultStep<R> returning();
/**
@ -126,7 +127,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
UpdateResultStep<R> returning(SelectFieldOrAsterisk... fields);
/**
@ -146,7 +147,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
UpdateResultStep<R> returning(Collection<? extends SelectFieldOrAsterisk> fields);
/**
@ -160,7 +161,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
UpdateResultStep<Record> returningResult(SelectFieldOrAsterisk... fields);
/**
@ -174,7 +175,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
UpdateResultStep<Record> returningResult(Collection<? extends SelectFieldOrAsterisk> fields);
@ -189,7 +190,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1> UpdateResultStep<Record1<T1>> returningResult(SelectField<T1> field1);
/**
@ -202,7 +203,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2> UpdateResultStep<Record2<T1, T2>> returningResult(SelectField<T1> field1, SelectField<T2> field2);
/**
@ -215,7 +216,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3> UpdateResultStep<Record3<T1, T2, T3>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3);
/**
@ -228,7 +229,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4> UpdateResultStep<Record4<T1, T2, T3, T4>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4);
/**
@ -241,7 +242,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5> UpdateResultStep<Record5<T1, T2, T3, T4, T5>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5);
/**
@ -254,7 +255,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6> UpdateResultStep<Record6<T1, T2, T3, T4, T5, T6>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6);
/**
@ -267,7 +268,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7> UpdateResultStep<Record7<T1, T2, T3, T4, T5, T6, T7>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7);
/**
@ -280,7 +281,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8> UpdateResultStep<Record8<T1, T2, T3, T4, T5, T6, T7, T8>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8);
/**
@ -293,7 +294,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9> UpdateResultStep<Record9<T1, T2, T3, T4, T5, T6, T7, T8, T9>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9);
/**
@ -306,7 +307,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> UpdateResultStep<Record10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10);
/**
@ -319,7 +320,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> UpdateResultStep<Record11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10, SelectField<T11> field11);
/**
@ -332,7 +333,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> UpdateResultStep<Record12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10, SelectField<T11> field11, SelectField<T12> field12);
/**
@ -345,7 +346,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> UpdateResultStep<Record13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10, SelectField<T11> field11, SelectField<T12> field12, SelectField<T13> field13);
/**
@ -358,7 +359,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> UpdateResultStep<Record14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10, SelectField<T11> field11, SelectField<T12> field12, SelectField<T13> field13, SelectField<T14> field14);
/**
@ -371,7 +372,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> UpdateResultStep<Record15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10, SelectField<T11> field11, SelectField<T12> field12, SelectField<T13> field13, SelectField<T14> field14, SelectField<T15> field15);
/**
@ -384,7 +385,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> UpdateResultStep<Record16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10, SelectField<T11> field11, SelectField<T12> field12, SelectField<T13> field13, SelectField<T14> field14, SelectField<T15> field15, SelectField<T16> field16);
/**
@ -397,7 +398,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> UpdateResultStep<Record17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10, SelectField<T11> field11, SelectField<T12> field12, SelectField<T13> field13, SelectField<T14> field14, SelectField<T15> field15, SelectField<T16> field16, SelectField<T17> field17);
/**
@ -410,7 +411,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> UpdateResultStep<Record18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10, SelectField<T11> field11, SelectField<T12> field12, SelectField<T13> field13, SelectField<T14> field14, SelectField<T15> field15, SelectField<T16> field16, SelectField<T17> field17, SelectField<T18> field18);
/**
@ -423,7 +424,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> UpdateResultStep<Record19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10, SelectField<T11> field11, SelectField<T12> field12, SelectField<T13> field13, SelectField<T14> field14, SelectField<T15> field15, SelectField<T16> field16, SelectField<T17> field17, SelectField<T18> field18, SelectField<T19> field19);
/**
@ -436,7 +437,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> UpdateResultStep<Record20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10, SelectField<T11> field11, SelectField<T12> field12, SelectField<T13> field13, SelectField<T14> field14, SelectField<T15> field15, SelectField<T16> field16, SelectField<T17> field17, SelectField<T18> field18, SelectField<T19> field19, SelectField<T20> field20);
/**
@ -449,7 +450,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> UpdateResultStep<Record21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10, SelectField<T11> field11, SelectField<T12> field12, SelectField<T13> field13, SelectField<T14> field14, SelectField<T15> field15, SelectField<T16> field16, SelectField<T17> field17, SelectField<T18> field18, SelectField<T19> field19, SelectField<T20> field20, SelectField<T21> field21);
/**
@ -462,7 +463,7 @@ public interface UpdateReturningStep<R extends Record> extends UpdateFinalStep<R
* @see UpdateResultStep
*/
@NotNull @CheckReturnValue
@Support({ FIREBIRD, H2, POSTGRES, YUGABYTEDB })
@Support({ FIREBIRD, H2, MARIADB, POSTGRES, YUGABYTEDB })
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> UpdateResultStep<Record22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>> returningResult(SelectField<T1> field1, SelectField<T2> field2, SelectField<T3> field3, SelectField<T4> field4, SelectField<T5> field5, SelectField<T6> field6, SelectField<T7> field7, SelectField<T8> field8, SelectField<T9> field9, SelectField<T10> field10, SelectField<T11> field11, SelectField<T12> field12, SelectField<T13> field13, SelectField<T14> field14, SelectField<T15> field15, SelectField<T16> field16, SelectField<T17> field17, SelectField<T18> field18, SelectField<T19> field19, SelectField<T20> field20, SelectField<T21> field21, SelectField<T22> field22);

View File

@ -179,7 +179,7 @@ abstract class AbstractDMLQuery<R extends Record> extends AbstractRowCountQuery
private static final Set<SQLDialect> NO_SUPPORT_INSERT_ALIASED_TABLE = SQLDialect.supportedBy(DERBY, FIREBIRD, H2, MARIADB, MYSQL);
private static final Set<SQLDialect> NATIVE_SUPPORT_INSERT_RETURNING = SQLDialect.supportedBy(FIREBIRD, MARIADB, POSTGRES, YUGABYTEDB);
private static final Set<SQLDialect> NATIVE_SUPPORT_UPDATE_RETURNING = SQLDialect.supportedBy(FIREBIRD, POSTGRES, YUGABYTEDB);
private static final Set<SQLDialect> NATIVE_SUPPORT_UPDATE_RETURNING = SQLDialect.supportedBy(FIREBIRD, MARIADB, POSTGRES, YUGABYTEDB);
private static final Set<SQLDialect> NATIVE_SUPPORT_DELETE_RETURNING = SQLDialect.supportedBy(FIREBIRD, MARIADB, POSTGRES, YUGABYTEDB);
private static final Set<SQLDialect> NATIVE_SUPPORT_DATA_CHANGE_DELTA_TABLE = SQLDialect.supportedBy(H2);
private static final Set<SQLDialect> NO_SUPPORT_FETCHING_KEYS = SQLDialect.supportedBy(IGNITE);

View File

@ -63,6 +63,7 @@ import static org.jooq.SQLDialect.HSQLDB;
import static org.jooq.SQLDialect.IGNITE;
// ...
// ...
import static org.jooq.SQLDialect.MARIADB;
// ...
// ...
import static org.jooq.SQLDialect.POSTGRES;
@ -76,10 +77,14 @@ import static org.jooq.SQLDialect.SQLITE;
// ...
import static org.jooq.SQLDialect.YUGABYTEDB;
import static org.jooq.conf.SettingsTools.getExecuteUpdateWithoutWhere;
import static org.jooq.impl.DSL.insertInto;
import static org.jooq.impl.DSL.mergeInto;
import static org.jooq.impl.DSL.name;
import static org.jooq.impl.DSL.noCondition;
import static org.jooq.impl.DSL.noField;
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.trueCondition;
import static org.jooq.impl.Keywords.K_FROM;
import static org.jooq.impl.Keywords.K_LIMIT;
@ -87,6 +92,7 @@ import static org.jooq.impl.Keywords.K_ORDER_BY;
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.SQLDataType.INTEGER;
import static org.jooq.impl.Tools.findAny;
import java.util.Arrays;
@ -176,7 +182,7 @@ implements
UNotYetImplemented
{
private static final Clause[] CLAUSES = { UPDATE };
private static final Clause[] CLAUSES = { UPDATE };
@ -184,14 +190,15 @@ implements
private static final Set<SQLDialect> EMULATE_FROM_WITH_MERGE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB);
private static final Set<SQLDialect> EMULATE_FROM_WITH_MERGE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB);
private static final Set<SQLDialect> EMULATE_RETURNING_WITH_UPSERT = SQLDialect.supportedBy(MARIADB);
// LIMIT is not supported at all
private static final Set<SQLDialect> NO_SUPPORT_LIMIT = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB);
private static final Set<SQLDialect> NO_SUPPORT_LIMIT = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB);
// LIMIT is supported but not ORDER BY
private static final Set<SQLDialect> NO_SUPPORT_ORDER_BY_LIMIT = SQLDialect.supportedBy(IGNITE);
static final Set<SQLDialect> NO_SUPPORT_UPDATE_JOIN = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, POSTGRES, SQLITE, YUGABYTEDB);
private static final Set<SQLDialect> NO_SUPPORT_ORDER_BY_LIMIT = SQLDialect.supportedBy(IGNITE);
static final Set<SQLDialect> NO_SUPPORT_UPDATE_JOIN = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, POSTGRES, SQLITE, YUGABYTEDB);
private final FieldMapForUpdate updateMap;
private final TableList from;
@ -547,6 +554,10 @@ implements
acceptFromAsMerge(ctx);
return;
}
else if (!returning.isEmpty() && EMULATE_RETURNING_WITH_UPSERT.contains(ctx.dialect())) {
acceptReturningAsUpsert(ctx);
return;
}
@ -562,6 +573,20 @@ implements
accept1(ctx);
}
private final void acceptReturningAsUpsert(Context<?> ctx) {
ctx.visit(
insertInto(table)
.select(
selectFrom(table)
.where(hasWhere() ? getWhere() : noCondition())
.orderBy(orderBy)
.limit(limit != null ? limit : noField(INTEGER)))
.onDuplicateKeyUpdate()
.set(updateMap)
.returning(returning)
);
}
private final void acceptFromAsMerge(Context<?> ctx) {
// TODO: What about RETURNING?
// TODO: What if there are multiple FROM tables?