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]