postgresql-jdbc.git / summary / log / commit / refs
commit 6287c9547880b5cdfc596cf932354511a4e310cb
Author: Dave Cramer <davecramer@gmail.com>
Commit: Vladimir Sitnikov <sitnikov.vladimir@gmail.com>
Date: Sat Jul 14 11:01:07 2018 +0000
fix: setNull for types not in java.sql.Types (e.g. uuid) (#1160)
Fix PreparedStatement.setNull(pos, type, pgtype)
This enables to pass nulls for uuids like
"where ? is null"; setNull(1, Types.OTHER, "uuid");
fixes #1159
CHANGELOG.md | 2 ++
.../org/postgresql/jdbc/PgPreparedStatement.java | 20 ++++++++++++++++++--
.../postgresql/test/jdbc2/PreparedStatementTest.java | 16 ++++++++++++++++
.../java/org/postgresql/test/jdbc4/ArrayTest.java | 2 +-
4 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index abcf61e7..11f25904 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
## [Unreleased]
### Changed
+- PreparedStatement.setNull(int parameterIndex, int t, String typeName) no longer ignores the typeName
+argument if it is not null [PR 1160](https://github.com/pgjdbc/pgjdbc/pull/1160)
### Added
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgPreparedStatement.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgPreparedStatement.java
index d0563beb..9a698c92 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgPreparedStatement.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgPreparedStatement.java
@@ -1232,9 +1232,25 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
setLong(i, oid);
}
- public void setNull(int i, int t, String s) throws SQLException {
+ public void setNull(int parameterIndex, int t, String typeName) throws SQLException {
+
+ if (typeName == null) {
+ setNull(parameterIndex, t);
+ return;
+ }
+
checkClosed();
- setNull(i, t);
+
+ TypeInfo typeInfo = connection.getTypeInfo();
+
+ int oid = typeInfo.getPGType(typeName);
+
+ if (adjustIndex) {
+ parameterIndex--;
+ }
+
+ preparedParameters.setNull(parameterIndex, oid);
+
}
public void setRef(int i, Ref x) throws SQLException {
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PreparedStatementTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PreparedStatementTest.java
index 15cf6ce3..eeabb4e7 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PreparedStatementTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PreparedStatementTest.java
@@ -12,6 +12,7 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.postgresql.PGStatement;
+import org.postgresql.core.ServerVersion;
import org.postgresql.jdbc.PgStatement;
import org.postgresql.jdbc.PreferQueryMode;
import org.postgresql.test.TestUtil;
@@ -39,6 +40,7 @@ import java.sql.Timestamp;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.logging.Handler;
@@ -285,6 +287,20 @@ public class PreparedStatementTest extends BaseTest4 {
pstmt.executeUpdate();
pstmt.close();
+
+ assumeMinimumServerVersion(ServerVersion.v8_3);
+ pstmt = con.prepareStatement("select 'ok' where ?=? or (? is null) ");
+ pstmt.setObject(1, UUID.randomUUID(), Types.OTHER);
+ pstmt.setNull(2, Types.OTHER, "uuid");
+ pstmt.setNull(3, Types.OTHER, "uuid");
+ ResultSet rs = pstmt.executeQuery();
+
+ assertTrue(rs.next());
+ assertEquals("ok",rs.getObject(1));
+
+ rs.close();
+ pstmt.close();
+
}
@Test
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/ArrayTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/ArrayTest.java
index dba8f899..7e3c1707 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/ArrayTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/ArrayTest.java
@@ -560,7 +560,7 @@ public class ArrayTest extends BaseTest4 {
public void nullArray() throws SQLException {
PreparedStatement ps = con.prepareStatement("INSERT INTO arrtest(floatarr) VALUES (?)");
- ps.setNull(1, Types.ARRAY, "float8");
+ ps.setNull(1, Types.ARRAY, "float8[]");
ps.execute();
ps.close();
[parent: 776e1717cfe3]