From 633d1a43a9a8cedb799ba5a33a787db22ec50727 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 6 Jul 2012 19:18:08 +0200 Subject: [PATCH] [#1537] Factory.batchStore() renders bad SQL for Postgres. The RETURNING clause is not allowed in batch INSERTs --- .../main/java/org/jooq/impl/BatchStore.java | 4 +++ .../java/org/jooq/impl/TableRecordImpl.java | 26 +++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/BatchStore.java b/jOOQ/src/main/java/org/jooq/impl/BatchStore.java index 8ef78bb15d..8ee846ab57 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BatchStore.java +++ b/jOOQ/src/main/java/org/jooq/impl/BatchStore.java @@ -93,6 +93,8 @@ class BatchStore implements Batch { Settings orig = SettingsTools.clone(work); try { + // [#1537] Communicate with TableRecordImpl + create.setData(TableRecordImpl.OMIT_RETURNING_CLAUSE, true); // Add the QueryCollector to intercept query execution after rendering work.setExecuteListeners(Arrays.asList(QueryCollector.class.getName())); @@ -131,6 +133,8 @@ class BatchStore implements Batch { // Restore the original factory finally { + create.getData().remove(TableRecordImpl.OMIT_RETURNING_CLAUSE); + work.setExecuteListeners(orig.getExecuteListeners()); work.setExecuteLogging(orig.isExecuteLogging()); } diff --git a/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java index 59c0a56489..c9fcadcb32 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java @@ -35,6 +35,7 @@ */ package org.jooq.impl; +import static java.lang.Boolean.TRUE; import static org.jooq.impl.Factory.val; import java.util.Collection; @@ -45,11 +46,13 @@ import org.jooq.DeleteQuery; import org.jooq.Field; import org.jooq.Identity; import org.jooq.InsertQuery; +import org.jooq.SQLDialect; import org.jooq.SimpleSelectQuery; import org.jooq.StoreQuery; import org.jooq.Table; import org.jooq.TableField; import org.jooq.TableRecord; +import org.jooq.UpdatableRecord; import org.jooq.UpdateQuery; import org.jooq.exception.InvalidResultException; @@ -65,7 +68,14 @@ public class TableRecordImpl> extends TypeRecord table) { super(table); @@ -112,7 +122,8 @@ public class TableRecordImpl> extends TypeRecord insert = create().insertQuery(getTable()); + Factory create = create(); + InsertQuery insert = create.insertQuery(getTable()); for (Field field : getFields()) { if (getValue0(field).isChanged()) { @@ -122,12 +133,17 @@ public class TableRecordImpl> extends TypeRecord> key = getReturning(); - insert.setReturning(key); + // [#1537] Avoid refreshing identity columns on batch inserts + Collection> key = null; + if (!TRUE.equals(create.getData(OMIT_RETURNING_CLAUSE))) { + key = getReturning(); + insert.setReturning(key); + } + int result = insert.execute(); // If an insert was successful try fetching the generated IDENTITY value - if (!key.isEmpty() && result > 0) { + if (key != null && !key.isEmpty() && result > 0) { if (insert.getReturnedRecord() != null) { for (Field field : key) { setValue0(field, new Value(insert.getReturnedRecord().getValue(field)));