From 3f58268f7782c6cc345e31ec0885ee2bb4a06bc9 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 20 May 2014 15:51:12 +0200 Subject: [PATCH] [#3237] UpdatableRecord.store() executes INSERT instead of UPDATE when nullable primary keys are NULL --- .../src/test/java/org/jooq/test/BaseTest.java | 4 ++++ .../test/java/org/jooq/test/SQLServerTest.java | 18 ++++++++++++++++++ .../java/org/jooq/test/jOOQAbstractTest.java | 16 ++++++++++++++++ .../main/java/org/jooq/UpdatableRecord.java | 5 +++-- .../org/jooq/impl/UpdatableRecordImpl.java | 7 +++++-- 5 files changed, 46 insertions(+), 4 deletions(-) diff --git a/jOOQ-test/src/test/java/org/jooq/test/BaseTest.java b/jOOQ-test/src/test/java/org/jooq/test/BaseTest.java index bc8bfc3ece..c3da22d65e 100644 --- a/jOOQ-test/src/test/java/org/jooq/test/BaseTest.java +++ b/jOOQ-test/src/test/java/org/jooq/test/BaseTest.java @@ -879,6 +879,10 @@ public abstract class BaseTest< return new Timestamp(0).toString(); } + protected final void clean(Table... tables) { + delegate.clean(tables); + } + protected final void assertCountAuthors(int count) { assertEquals(count, (int) create().selectCount().from(TAuthor()).fetchOne(0, Integer.class)); } diff --git a/jOOQ-test/src/test/java/org/jooq/test/SQLServerTest.java b/jOOQ-test/src/test/java/org/jooq/test/SQLServerTest.java index b0373335c5..963c50a0d9 100644 --- a/jOOQ-test/src/test/java/org/jooq/test/SQLServerTest.java +++ b/jOOQ-test/src/test/java/org/jooq/test/SQLServerTest.java @@ -955,11 +955,14 @@ xxxxxx xxxxx xxxxxxxxxxxxx xxxxxxx xxxxxxxxxxxxxxxxx xxxxx xxxxxx xxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x + xxxxxxxxxxxxxxxx + xxxxxxxxxxxxx xxxxxx x xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xx xxxxxxxxx xxxxxxxxxxxxxxxxxx @@ -967,12 +970,22 @@ xxxxxx xxxxx xxxxxxxxxxxxx xxxxxxx xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxx xxxxx xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxx xxxxx xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + xx xxxxxxx + xxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxx xxxxx xxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxx xxxxx xxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xx xxxxxxxx xxxxxxxxxxxxxxxxxx @@ -980,18 +993,23 @@ xxxxxx xxxxx xxxxxxxxxxxxx xxxxxxx xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxx xxxxx xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxx xxxxx xxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xx xxxxxxxx xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x xxxxx xxxxxx xxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x + xxxxxxxxxxxxxx + xxxxxxxxxxxx xx x xxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxx xx x xxxxxxxxxxxxxxxxxxxxxxxxxxx xx xxxxxxx xxxxx xxxxxxx xx xxxxx + xxxxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxxxx diff --git a/jOOQ-test/src/test/java/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/test/java/org/jooq/test/jOOQAbstractTest.java index b0ec659f9e..477d971dc4 100644 --- a/jOOQ-test/src/test/java/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/test/java/org/jooq/test/jOOQAbstractTest.java @@ -270,6 +270,7 @@ public abstract class jOOQAbstractTest< public static String jdbcURL; public static String jdbcSchema; public static Map scripts = new HashMap(); + public static Table[] clean; protected void execute(String script) throws Exception { Statement stmt = null; @@ -457,6 +458,17 @@ public abstract class jOOQAbstractTest< reset = true; execute(getResetScript()); } + + if (clean != null && clean.length > 0) { + for (Table table : clean) { + try { + create().delete(table); + } + catch (Exception e) { + e.printStackTrace(); + } + } + } } @After @@ -464,6 +476,10 @@ public abstract class jOOQAbstractTest< connection.setAutoCommit(autocommit); } + public void clean(Table... tables) { + this.clean = tables; + } + @BeforeClass public static void testStart() throws Exception { log.info("STARTING"); diff --git a/jOOQ/src/main/java/org/jooq/UpdatableRecord.java b/jOOQ/src/main/java/org/jooq/UpdatableRecord.java index 61322b2e64..dab3162a0b 100644 --- a/jOOQ/src/main/java/org/jooq/UpdatableRecord.java +++ b/jOOQ/src/main/java/org/jooq/UpdatableRecord.java @@ -107,8 +107,9 @@ public interface UpdatableRecord> extends TableReco *
    *
  • If this record was created by client code, an INSERT * statement is executed
  • - *
  • If this record was loaded by jOOQ, but the primary key value was - * changed, an INSERT statement is executed. jOOQ expects that + *
  • If this record was loaded by jOOQ and the primary key value was + * changed, an INSERT statement is executed (unless + * {@link Settings#isUpdatablePrimaryKeys()} is set). jOOQ expects that * primary key values will never change due to the principle of * normalisation in RDBMS. So if client code changes primary key values, * this is interpreted by jOOQ as client code wanting to duplicate this diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java index 362dbe6011..ad98bff276 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java @@ -155,8 +155,11 @@ public class UpdatableRecordImpl> extends TableReco // [#2764] Primary key value changes are interpreted as record copies else { - // If any primary key value is null or changed, execute an insert - if (getValue(field) == null || getValue0(field).isChanged()) { + // If any primary key value is null or changed + if (getValue0(field).isChanged() || + + // [#3237] or if a NOT NULL primary key value is null, then execute an INSERT + (field.getDataType().nullable() == false && getValue(field) == null)) { executeUpdate = false; break; }