[jOOQ/jOOQ#10051] Added YUGABYTE support for UpdatableRecord.merge()

This commit is contained in:
Lukas Eder 2021-11-25 09:16:06 +01:00
parent 9437d43466
commit dd9acba28a
10 changed files with 40 additions and 12 deletions

View File

@ -48,6 +48,7 @@ import static org.jooq.SQLDialect.DERBY;
// ...
import static org.jooq.SQLDialect.FIREBIRD;
import static org.jooq.SQLDialect.H2;
// ...
import static org.jooq.SQLDialect.HSQLDB;
// ...
// ...

View File

@ -46,6 +46,7 @@ import static org.jooq.SQLDialect.CUBRID;
import static org.jooq.SQLDialect.DERBY;
// ...
import static org.jooq.SQLDialect.H2;
// ...
import static org.jooq.SQLDialect.MARIADB;
// ...
import static org.jooq.SQLDialect.POSTGRES;

View File

@ -46,6 +46,7 @@ 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.MARIADB;

View File

@ -46,6 +46,7 @@ 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.MARIADB;
@ -176,7 +177,7 @@ public interface InsertOnDuplicateStep<R extends Record> extends InsertReturning
* H2 supports this clause in MySQL mode.
*/
@NotNull @CheckReturnValue
@Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
InsertOnDuplicateSetStep<R> onDuplicateKeyUpdate();
/**

View File

@ -49,6 +49,7 @@ import static org.jooq.SQLDialect.DERBY;
import static org.jooq.SQLDialect.FIREBIRD;
// ...
import static org.jooq.SQLDialect.H2;
// ...
import static org.jooq.SQLDialect.HSQLDB;
// ...
// ...
@ -174,7 +175,7 @@ public interface InsertQuery<R extends Record> extends StoreQuery<R>, Insert<R>,
*
* @see InsertOnDuplicateStep#onDuplicateKeyUpdate()
*/
@Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
void onDuplicateKeyUpdate(boolean flag);
/**
@ -232,7 +233,7 @@ public interface InsertQuery<R extends Record> extends StoreQuery<R>, Insert<R>,
*
* @see InsertOnDuplicateStep#onDuplicateKeyUpdate()
*/
@Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
<T> void addValueForUpdate(Field<T> field, T value);
/**
@ -241,7 +242,7 @@ public interface InsertQuery<R extends Record> extends StoreQuery<R>, Insert<R>,
*
* @see InsertOnDuplicateStep#onDuplicateKeyUpdate()
*/
@Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
<T> void addValueForUpdate(Field<T> field, Field<T> value);
/**
@ -254,7 +255,7 @@ public interface InsertQuery<R extends Record> extends StoreQuery<R>, Insert<R>,
*
* @see InsertOnDuplicateStep#onDuplicateKeyUpdate()
*/
@Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
void addValuesForUpdate(Map<?, ?> map);
/**

View File

@ -43,7 +43,9 @@ package org.jooq;
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.MARIADB;
@ -55,6 +57,7 @@ import static org.jooq.SQLDialect.SQLITE;
// ...
// ...
// ...
import static org.jooq.SQLDialect.YUGABYTE;
import java.sql.Statement;
import java.util.Collection;
@ -409,7 +412,7 @@ public interface UpdatableRecord<R extends UpdatableRecord<R>> extends TableReco
* @see #store()
* @see InsertOnDuplicateStep#onDuplicateKeyUpdate()
*/
@Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
int merge() throws DataAccessException;
/**
@ -421,7 +424,7 @@ public interface UpdatableRecord<R extends UpdatableRecord<R>> extends TableReco
* @throws DataAccessException if something went wrong executing the query
* @see #merge()
*/
@Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
int merge(Field<?>... fields) throws DataAccessException;
/**
@ -433,7 +436,7 @@ public interface UpdatableRecord<R extends UpdatableRecord<R>> extends TableReco
* @throws DataAccessException if something went wrong executing the query
* @see #merge()
*/
@Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE })
int merge(Collection<? extends Field<?>> fields) throws DataAccessException;
/**

View File

@ -412,6 +412,7 @@ final class InsertQueryImpl<R extends Record> extends AbstractStoreQuery<R> impl
case DERBY:
case FIREBIRD:
case H2:

View File

@ -281,6 +281,7 @@ final class Names {
static final Name N_STRING_AGG = unquotedName("string_agg");
static final Name N_STRREVERSE = unquotedName("strreverse");
static final Name N_STR_REPLACE = unquotedName("str_replace");
static final Name N_ST_NUMINTERIORRINGS = unquotedName("st_numinteriorrings");
static final Name N_SUB = unquotedName("sub");
static final Name N_SUBSTR = unquotedName("substr");
static final Name N_SYSTEM_RANGE = unquotedName("system_range");

View File

@ -170,6 +170,10 @@ package org.jooq.impl;

View File

@ -40,7 +40,17 @@ package org.jooq.impl;
import static java.lang.Boolean.TRUE;
import static java.util.Arrays.asList;
// ...
// ...
// ...
// ...
import static org.jooq.SQLDialect.DERBY;
import static org.jooq.SQLDialect.IGNITE;
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...
// ...
import static org.jooq.conf.SettingsTools.updatablePrimaryKeys;
import static org.jooq.impl.RecordDelegate.delegate;
import static org.jooq.impl.RecordDelegate.RecordLifecycleType.DELETE;
@ -88,8 +98,9 @@ import org.jooq.tools.StringUtils;
*/
@org.jooq.Internal
public class UpdatableRecordImpl<R extends UpdatableRecord<R>> extends TableRecordImpl<R> implements UpdatableRecord<R> {
private static final JooqLogger log = JooqLogger.getLogger(UpdatableRecordImpl.class);
private static final Set<SQLDialect> NO_SUPPORT_FOR_UPDATE = SQLDialect.supportedBy(SQLITE);
private static final JooqLogger log = JooqLogger.getLogger(UpdatableRecordImpl.class);
private static final Set<SQLDialect> NO_SUPPORT_FOR_UPDATE = SQLDialect.supportedBy(SQLITE);
private static final Set<SQLDialect> NO_SUPPORT_MERGE_RETURNING = SQLDialect.supportedBy(DERBY, IGNITE);
public UpdatableRecordImpl(Table<R> table) {
super(table);
@ -332,8 +343,11 @@ public class UpdatableRecordImpl<R extends UpdatableRecord<R>> extends TableReco
// [#1596] Check if the record was really changed in the database
// [#1859] Specify the returning clause if needed
// [#10051] See if we can return keys also on MERGE
Collection<Field<?>> key = merge ? null : setReturningIfNeeded(query);
// [#10051] Not all dialects support RETURNING on MERGE
Collection<Field<?>> key = merge && NO_SUPPORT_MERGE_RETURNING.contains(create().dialect())
? null
: setReturningIfNeeded(query);
int result = query.execute();
checkIfChanged(result, version, timestamp);