diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/CRUDTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/CRUDTests.java index da9453fa11..2b933a9708 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/CRUDTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/CRUDTests.java @@ -293,6 +293,32 @@ extends BaseTest(authorNames)); } + @Test + public void testUpdatablesCopy() throws Exception { + if (TTriggers() == null) { + log.info("SKIPPING", "UpdatableRecord.copy() tests"); + return; + } + + jOOQAbstractTest.reset = false; + + T r1 = create().newRecord(TTriggers()); + r1.setValue(TTriggers_COUNTER(), 1); + assertEquals(1, r1.store()); + + T r2 = r1.copy(); + T r3 = create().fetchOne(TTriggers()); + T r4 = r3.copy(); + + // [#1874] Be sure that copies use "default" values for primary keys + // in order to have sequence values generated. + assertEquals(1, r2.store()); + assertEquals(0, r3.store()); + assertEquals(1, r4.store()); + + assertEquals(3, (int) create().selectCount().from(TTriggers()).fetchOne(0, int.class)); + } + @Test public void testUpdatablesPK() throws Exception { jOOQAbstractTest.reset = false; diff --git a/jOOQ-test/src/org/jooq/test/ase/reset.sql b/jOOQ-test/src/org/jooq/test/ase/reset.sql index c2796fd79f..8deeb7d45f 100644 --- a/jOOQ-test/src/org/jooq/test/ase/reset.sql +++ b/jOOQ-test/src/org/jooq/test/ase/reset.sql @@ -15,6 +15,7 @@ DELETE FROM t_booleans/ DELETE FROM t_dates/ DELETE FROM t_identity/ DELETE FROM t_identity_pk/ +DELETE FROM t_triggers/ INSERT INTO t_language (id, cd, description, description_english) VALUES (1, 'en', 'English', 'English')/ INSERT INTO t_language (id, cd, description, description_english) VALUES (2, 'de', 'Deutsch', 'German')/ diff --git a/jOOQ-test/src/org/jooq/test/cubrid/reset.sql b/jOOQ-test/src/org/jooq/test/cubrid/reset.sql index 8801141266..e6e8f3603b 100644 --- a/jOOQ-test/src/org/jooq/test/cubrid/reset.sql +++ b/jOOQ-test/src/org/jooq/test/cubrid/reset.sql @@ -16,6 +16,7 @@ DELETE FROM t_booleans/ DELETE FROM t_dates/ DELETE FROM t_identity/ DELETE FROM t_identity_pk/ +DELETE FROM t_triggers/ DROP SERIAL s_author_id/ CREATE SERIAL s_author_id MAXVALUE 2000000000/ diff --git a/jOOQ-test/src/org/jooq/test/db2/reset.sql b/jOOQ-test/src/org/jooq/test/db2/reset.sql index a14eb3c8f8..e0d4fec5b4 100644 --- a/jOOQ-test/src/org/jooq/test/db2/reset.sql +++ b/jOOQ-test/src/org/jooq/test/db2/reset.sql @@ -16,6 +16,7 @@ DELETE FROM t_booleans/ DELETE FROM t_dates/ DELETE FROM t_identity/ DELETE FROM t_identity_pk/ +DELETE FROM t_triggers/ DROP SEQUENCE s_author_id/ CREATE SEQUENCE s_author_id/ diff --git a/jOOQ-test/src/org/jooq/test/derby/reset.sql b/jOOQ-test/src/org/jooq/test/derby/reset.sql index 20d3914ad8..4d92d9138f 100644 --- a/jOOQ-test/src/org/jooq/test/derby/reset.sql +++ b/jOOQ-test/src/org/jooq/test/derby/reset.sql @@ -16,6 +16,7 @@ DELETE FROM t_booleans/ DELETE FROM t_dates/ DELETE FROM t_identity/ DELETE FROM t_identity_pk/ +DELETE FROM t_triggers/ DROP SEQUENCE s_author_id RESTRICT/ CREATE SEQUENCE s_author_id START WITH 1/ diff --git a/jOOQ-test/src/org/jooq/test/firebird/reset.sql b/jOOQ-test/src/org/jooq/test/firebird/reset.sql index d792a6bf42..daeb55e29c 100644 --- a/jOOQ-test/src/org/jooq/test/firebird/reset.sql +++ b/jOOQ-test/src/org/jooq/test/firebird/reset.sql @@ -13,6 +13,7 @@ DELETE FROM t_author/ DELETE FROM t_language/ DELETE FROM t_booleans/ DELETE FROM t_dates/ +DELETE FROM t_triggers/ DROP SEQUENCE s_author_id;/ CREATE SEQUENCE s_author_id;/ diff --git a/jOOQ-test/src/org/jooq/test/h2/reset.sql b/jOOQ-test/src/org/jooq/test/h2/reset.sql index b595afbe77..155b59f7d1 100644 --- a/jOOQ-test/src/org/jooq/test/h2/reset.sql +++ b/jOOQ-test/src/org/jooq/test/h2/reset.sql @@ -16,6 +16,7 @@ DELETE FROM t_booleans/ DELETE FROM t_dates/ DELETE FROM t_identity/ DELETE FROM t_identity_pk/ +DELETE FROM t_triggers/ DROP SEQUENCE IF EXISTS s_author_id;/ CREATE SEQUENCE s_author_id START WITH 1;/ diff --git a/jOOQ-test/src/org/jooq/test/hsqldb/reset.sql b/jOOQ-test/src/org/jooq/test/hsqldb/reset.sql index 638aee9a0f..b27b26c795 100644 --- a/jOOQ-test/src/org/jooq/test/hsqldb/reset.sql +++ b/jOOQ-test/src/org/jooq/test/hsqldb/reset.sql @@ -16,6 +16,7 @@ DELETE FROM t_booleans/ DELETE FROM t_dates/ DELETE FROM t_identity/ DELETE FROM t_identity_pk/ +DELETE FROM t_triggers/ DROP SEQUENCE IF EXISTS s_author_id;/ CREATE SEQUENCE s_author_id START WITH 1;/ diff --git a/jOOQ-test/src/org/jooq/test/ingres/reset.sql b/jOOQ-test/src/org/jooq/test/ingres/reset.sql index e7ceb1a885..195a70974d 100644 --- a/jOOQ-test/src/org/jooq/test/ingres/reset.sql +++ b/jOOQ-test/src/org/jooq/test/ingres/reset.sql @@ -15,6 +15,7 @@ DELETE FROM t_booleans/ DELETE FROM t_dates/ DELETE FROM t_identity/ DELETE FROM t_identity_pk/ +DELETE FROM t_triggers/ DROP SEQUENCE s_author_id/ CREATE SEQUENCE s_author_id/ diff --git a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java index 55dd6ff5ff..39aedd9ad7 100644 --- a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java @@ -1289,6 +1289,11 @@ public abstract class jOOQAbstractTest< new CRUDTests(this).testRelations(); } + @Test + public void testUpdatablesCopy() throws Exception { + new CRUDTests(this).testUpdatablesCopy(); + } + @Test public void testUpdatablesPK() throws Exception { new CRUDTests(this).testUpdatablesPK(); diff --git a/jOOQ-test/src/org/jooq/test/mysql/reset.sql b/jOOQ-test/src/org/jooq/test/mysql/reset.sql index d3efb11848..b3ae9290d1 100644 --- a/jOOQ-test/src/org/jooq/test/mysql/reset.sql +++ b/jOOQ-test/src/org/jooq/test/mysql/reset.sql @@ -14,6 +14,7 @@ DELETE FROM t_language/ DELETE FROM t_booleans/ DELETE FROM t_dates/ DELETE FROM t_identity_pk/ +DELETE FROM t_triggers/ INSERT INTO t_language (id, cd, description, description_english) VALUES (1, 'en', 'English', 'English')/ INSERT INTO t_language (id, cd, description, description_english) VALUES (2, 'de', 'Deutsch', 'German')/ diff --git a/jOOQ-test/src/org/jooq/test/postgres/reset.sql b/jOOQ-test/src/org/jooq/test/postgres/reset.sql index 81c86db19e..7037bee777 100644 --- a/jOOQ-test/src/org/jooq/test/postgres/reset.sql +++ b/jOOQ-test/src/org/jooq/test/postgres/reset.sql @@ -16,6 +16,7 @@ DELETE FROM t_booleans/ DELETE FROM t_dates/ DELETE FROM t_identity/ DELETE FROM t_identity_pk/ +DELETE FROM t_triggers/ DROP SEQUENCE IF EXISTS s_author_id/ CREATE SEQUENCE s_author_id/ diff --git a/jOOQ-test/src/org/jooq/test/sqlite/reset.sql b/jOOQ-test/src/org/jooq/test/sqlite/reset.sql index 24782d3ab4..ca048c1815 100644 --- a/jOOQ-test/src/org/jooq/test/sqlite/reset.sql +++ b/jOOQ-test/src/org/jooq/test/sqlite/reset.sql @@ -13,6 +13,7 @@ DELETE FROM t_author/ DELETE FROM t_language/ DELETE FROM t_booleans/ DELETE FROM t_dates/ +DELETE FROM t_triggers/ INSERT INTO t_language (id, cd, description, description_english) VALUES (1, 'en', 'English', 'English')/ INSERT INTO t_language (id, cd, description, description_english) VALUES (2, 'de', 'Deutsch', 'German')/ diff --git a/jOOQ-test/src/org/jooq/test/sqlserver/reset.sql b/jOOQ-test/src/org/jooq/test/sqlserver/reset.sql index a2c3c9e11f..92566319a0 100644 --- a/jOOQ-test/src/org/jooq/test/sqlserver/reset.sql +++ b/jOOQ-test/src/org/jooq/test/sqlserver/reset.sql @@ -15,6 +15,7 @@ DELETE FROM t_booleans/ DELETE FROM t_dates/ DELETE FROM t_identity/ DELETE FROM t_identity_pk/ +DELETE FROM t_triggers/ INSERT INTO t_language (id, cd, description, description_english) VALUES (1, 'en', 'English', 'English')/ INSERT INTO t_language (id, cd, description, description_english) VALUES (2, 'de', 'Deutsch', 'German')/ diff --git a/jOOQ-test/src/org/jooq/test/sybase/reset.sql b/jOOQ-test/src/org/jooq/test/sybase/reset.sql index 103aad6ee3..195f85d8aa 100644 --- a/jOOQ-test/src/org/jooq/test/sybase/reset.sql +++ b/jOOQ-test/src/org/jooq/test/sybase/reset.sql @@ -15,6 +15,7 @@ DELETE FROM t_booleans/ DELETE FROM t_dates/ DELETE FROM t_identity/ DELETE FROM t_identity_pk/ +DELETE FROM t_triggers/ DROP SEQUENCE s_author_id/ CREATE SEQUENCE s_author_id/ diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java index 6e036f5c0f..64ca6da000 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java @@ -36,9 +36,11 @@ package org.jooq.impl; import java.util.Collection; +import java.util.List; import org.jooq.Field; import org.jooq.Record; +import org.jooq.TableField; import org.jooq.UniqueKey; import org.jooq.UpdatableRecord; import org.jooq.UpdatableTable; @@ -98,13 +100,13 @@ public class UpdatableRecordImpl> extends TableReco R copy = create().newRecord(getTable()); // Copy all fields. This marks them all as isChanged, which is important + List> key = getMainKey().getFields(); for (Field field : getFields()) { - setValue(copy, field); - } - // Remove key values again - for (Field field : getMainKey().getFields()) { - copy.setValue(field, null); + // Don't copy key values + if (!key.contains(field)) { + setValue(copy, field); + } } return copy;