diff --git a/jOOQ/src/main/java/org/jooq/InsertOnDuplicateStep.java b/jOOQ/src/main/java/org/jooq/InsertOnDuplicateStep.java index 8883db4849..f73a6c8c94 100644 --- a/jOOQ/src/main/java/org/jooq/InsertOnDuplicateStep.java +++ b/jOOQ/src/main/java/org/jooq/InsertOnDuplicateStep.java @@ -39,6 +39,7 @@ package org.jooq; import static org.jooq.SQLDialect.CUBRID; // ... +import static org.jooq.SQLDialect.H2; import static org.jooq.SQLDialect.HSQLDB; // ... import static org.jooq.SQLDialect.MARIADB; @@ -123,9 +124,9 @@ public interface InsertOnDuplicateStep extends InsertReturning * {@link DSLContext#mergeInto(Table)}). * *

- * These are the dialects that fulfill the above requirements: + * H2 supports this clause in MySQL mode. */ - @Support({ CUBRID, HSQLDB, MARIADB, MYSQL, POSTGRES_9_5 }) + @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES_9_5 }) InsertOnDuplicateSetStep onDuplicateKeyUpdate(); /** diff --git a/jOOQ/src/main/java/org/jooq/InsertQuery.java b/jOOQ/src/main/java/org/jooq/InsertQuery.java index 3c9fe2fe32..73612049fa 100644 --- a/jOOQ/src/main/java/org/jooq/InsertQuery.java +++ b/jOOQ/src/main/java/org/jooq/InsertQuery.java @@ -154,7 +154,7 @@ public interface InsertQuery extends StoreQuery, Insert * * @see InsertOnDuplicateStep#onDuplicateKeyUpdate() */ - @Support({ CUBRID, HSQLDB, MARIADB, MYSQL, POSTGRES_9_5 }) + @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES_9_5 }) void onDuplicateKeyUpdate(boolean flag); /** @@ -218,7 +218,7 @@ public interface InsertQuery extends StoreQuery, Insert * * @see InsertOnDuplicateStep#onDuplicateKeyUpdate() */ - @Support({ CUBRID, HSQLDB, MARIADB, MYSQL, POSTGRES_9_5 }) + @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES_9_5 }) void addValueForUpdate(Field field, T value); /** @@ -227,7 +227,7 @@ public interface InsertQuery extends StoreQuery, Insert * * @see InsertOnDuplicateStep#onDuplicateKeyUpdate() */ - @Support({ CUBRID, HSQLDB, MARIADB, MYSQL, POSTGRES_9_5 }) + @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES_9_5 }) void addValueForUpdate(Field field, Field value); /** @@ -240,7 +240,7 @@ public interface InsertQuery extends StoreQuery, Insert * * @see InsertOnDuplicateStep#onDuplicateKeyUpdate() */ - @Support({ CUBRID, HSQLDB, MARIADB, MYSQL, POSTGRES_9_5 }) + @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES_9_5 }) void addValuesForUpdate(Map map); /** diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index 0d836038e6..cb1e6f8d6c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -44,6 +44,7 @@ import static org.jooq.Clause.INSERT_ON_DUPLICATE_KEY_UPDATE; import static org.jooq.Clause.INSERT_ON_DUPLICATE_KEY_UPDATE_ASSIGNMENT; import static org.jooq.Clause.INSERT_RETURNING; import static org.jooq.Clause.INSERT_SELECT; +import static org.jooq.SQLDialect.H2; import static org.jooq.SQLDialect.MARIADB; import static org.jooq.SQLDialect.MYSQL; // ... @@ -256,15 +257,26 @@ final class InsertQueryImpl extends AbstractStoreQuery impl // MySQL has a nice syntax for this case CUBRID: + case H2: case MARIADB: case MYSQL: { + + // [#2508] In H2, this syntax is supported in MySQL MODE (we're assuming users will + // set this mode in order to profit from this functionality). Up until + // H2 1.4.197, qualification of columns in the ON DUPLICATE KEY UPDATE clause + // wasn't supported (see https://github.com/h2database/h2database/issues/1027) + boolean oldQualify = ctx.qualify(); + boolean newQualify = ctx.family() == H2 ? false : oldQualify; + toSQLInsert(ctx); ctx.formatSeparator() .start(INSERT_ON_DUPLICATE_KEY_UPDATE) .visit(K_ON_DUPLICATE_KEY_UPDATE) .formatIndentStart() .formatSeparator() + .qualify(newQualify) .visit(updateMap) + .qualify(oldQualify) .formatIndentEnd() .end(INSERT_ON_DUPLICATE_KEY_UPDATE); @@ -330,11 +342,6 @@ final class InsertQueryImpl extends AbstractStoreQuery impl break; } - // Some dialects can't really handle this clause. Emulation should be done in two steps - case H2: { - throw new SQLDialectNotSupportedException("The ON DUPLICATE KEY UPDATE clause cannot be emulated for " + ctx.dialect()); - } - // Some databases allow for emulating this clause using a MERGE statement