diff --git a/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/DB2Engine.java b/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/DB2Engine.java index 79149adf..81fbb368 100644 --- a/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/DB2Engine.java +++ b/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/DB2Engine.java @@ -56,6 +56,7 @@ import static com.feedzai.commons.sql.abstraction.util.StringUtils.md5; import static com.feedzai.commons.sql.abstraction.util.StringUtils.quotize; import static java.lang.String.format; +import static java.util.Objects.isNull; import static org.apache.commons.lang3.StringUtils.join; /** @@ -124,6 +125,11 @@ protected void setPreparedStatementValue(final PreparedStatement ps, case JSON: case CLOB: case BLOB: + if (isNull(value)) { + ps.setBytes(index, null); + break; + } + ps.setBytes(index, objectToArray(value)); break; diff --git a/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/MySqlEngine.java b/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/MySqlEngine.java index 5b712802..83d438dd 100644 --- a/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/MySqlEngine.java +++ b/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/MySqlEngine.java @@ -52,6 +52,7 @@ import static com.feedzai.commons.sql.abstraction.util.StringUtils.md5; import static com.feedzai.commons.sql.abstraction.util.StringUtils.quotize; import static java.lang.String.format; +import static java.util.Objects.isNull; import static org.apache.commons.lang3.StringUtils.join; /** @@ -122,6 +123,11 @@ protected void setPreparedStatementValue(final PreparedStatement ps, final boolean fromBatch) throws Exception { switch (dbColumn.getDbColumnType()) { case BLOB: + if (isNull(value)) { + ps.setBytes(index, null); + break; + } + ps.setBytes(index, objectToArray(value)); break; diff --git a/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/OracleEngine.java b/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/OracleEngine.java index d558f368..88dd00cd 100644 --- a/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/OracleEngine.java +++ b/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/OracleEngine.java @@ -63,6 +63,7 @@ import static com.feedzai.commons.sql.abstraction.util.StringUtils.md5; import static com.feedzai.commons.sql.abstraction.util.StringUtils.quotize; import static java.lang.String.format; +import static java.util.Objects.isNull; import static java.util.stream.Collectors.joining; import static org.apache.commons.lang3.StringUtils.join; @@ -235,6 +236,11 @@ protected void setPreparedStatementValue(final PreparedStatement ps, final boolean fromBatch) throws Exception { switch (dbColumn.getDbColumnType()) { case BLOB: + if (isNull(value)) { + ps.setBytes(index, null); + break; + } + final byte[] valArray = objectToArray(value); if (fromBatch && valArray.length > MIN_SIZE_FOR_BLOB) { // Use a blob for columns greater than 4K when inside a batch diff --git a/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/PostgreSqlEngine.java b/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/PostgreSqlEngine.java index c2e638e4..49420598 100644 --- a/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/PostgreSqlEngine.java +++ b/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/PostgreSqlEngine.java @@ -58,6 +58,7 @@ import static com.feedzai.commons.sql.abstraction.util.StringUtils.md5; import static com.feedzai.commons.sql.abstraction.util.StringUtils.quotize; import static java.lang.String.format; +import static java.util.Objects.isNull; import static org.apache.commons.lang3.StringUtils.join; /** @@ -143,6 +144,11 @@ protected void setPreparedStatementValue(final PreparedStatement ps, final boolean fromBatch) throws Exception { switch (dbColumn.getDbColumnType()) { case BLOB: + if (isNull(value)) { + ps.setBytes(index, null); + break; + } + ps.setBytes(index, objectToArray(value)); break; diff --git a/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/SqlServerEngine.java b/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/SqlServerEngine.java index 2ee98fa7..b2190623 100644 --- a/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/SqlServerEngine.java +++ b/src/main/java/com/feedzai/commons/sql/abstraction/engine/impl/SqlServerEngine.java @@ -51,6 +51,7 @@ import static com.feedzai.commons.sql.abstraction.util.StringUtils.md5; import static com.feedzai.commons.sql.abstraction.util.StringUtils.quotize; import static java.lang.String.format; +import static java.util.Objects.isNull; import static org.apache.commons.lang3.StringUtils.join; /** @@ -149,6 +150,11 @@ protected void setPreparedStatementValue(final PreparedStatement ps, final boolean fromBatch) throws Exception { switch (dbColumn.getDbColumnType()) { case BLOB: + if (isNull(value)) { + ps.setBytes(index, null); + break; + } + ps.setBytes(index, objectToArray(value)); break; diff --git a/src/test/java/com/feedzai/commons/sql/abstraction/engine/impl/abs/AbstractEngineSchemaTest.java b/src/test/java/com/feedzai/commons/sql/abstraction/engine/impl/abs/AbstractEngineSchemaTest.java index 8c09c432..323fdb74 100644 --- a/src/test/java/com/feedzai/commons/sql/abstraction/engine/impl/abs/AbstractEngineSchemaTest.java +++ b/src/test/java/com/feedzai/commons/sql/abstraction/engine/impl/abs/AbstractEngineSchemaTest.java @@ -15,6 +15,7 @@ */ package com.feedzai.commons.sql.abstraction.engine.impl.abs; +import com.feedzai.commons.sql.abstraction.ddl.DbColumn; import com.feedzai.commons.sql.abstraction.ddl.DbColumnType; import com.feedzai.commons.sql.abstraction.ddl.DbEntity; import com.feedzai.commons.sql.abstraction.ddl.DbEntityType; @@ -32,6 +33,7 @@ import com.feedzai.commons.sql.abstraction.engine.testconfig.DatabaseConfiguration; import com.feedzai.commons.sql.abstraction.entry.EntityEntry; import com.google.common.collect.Sets; +import java.sql.PreparedStatement; import org.assertj.core.api.MapAssert; import org.assertj.core.data.MapEntry; import org.junit.Before; diff --git a/src/test/java/com/feedzai/commons/sql/abstraction/engine/impl/abs/EngineGeneralTest.java b/src/test/java/com/feedzai/commons/sql/abstraction/engine/impl/abs/EngineGeneralTest.java index ba2c82e9..faa2bb90 100644 --- a/src/test/java/com/feedzai/commons/sql/abstraction/engine/impl/abs/EngineGeneralTest.java +++ b/src/test/java/com/feedzai/commons/sql/abstraction/engine/impl/abs/EngineGeneralTest.java @@ -2788,6 +2788,27 @@ public void testBlob() throws Exception { assertEquals(updBlob, result.get(0).get("COL2").toBlob()); } + /** + * Tests that persisting a null value to a BLOB type column persists a null value. + * + * @throws Exception If anything goes wrong on engine-related operations, namely adding an entity, persisting an + * entry and querying an entry. + */ + @Test + public void testBlobPersistNull() throws Exception { + DbEntity entity = dbEntity().name("TEST").addColumn("COL1", STRING).addColumn("COL2", BLOB) + .build(); + engine.addEntity(entity); + EntityEntry entry = entry().set("COL1", "CENINHAS").set("COL2", null) + .build(); + + engine.persist("TEST", entry); + + List> result = engine.query(select(all()).from(table("TEST"))); + assertEquals("CENINHAS", result.get(0).get("COL1").toString()); + assertNull(result.get(0).get("COL2").toObject()); + } + @Test public void testBlobSettingWithIndexTest() throws Exception { DbEntity entity = dbEntity().name("TEST").addColumn("COL1", STRING).addColumn("COL2", BLOB)