Re: setObject(...) with native Java arrays like String[] ?

From: Craig Ringer <ringerc(at)ringerc(dot)id(dot)au>
To: PostgreSQL JDBC <pgsql-jdbc(at)postgresql(dot)org>
Subject: Re: setObject(...) with native Java arrays like String[] ?
Date: 2012-08-22 03:31:11
Message-ID: 5034527F.5040609@ringerc.id.au
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Here's a proposed patch to the tests to make the current behaviour explicit:

Add tests for String[] arrays

Shows that Connection.createArrayOf works, and that passing a raw
Java String[] to PreparedStatement.setObject() isn't accepted.
---
org/postgresql/test/jdbc2/ArrayTest.java | 31
+++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)

diff --git a/org/postgresql/test/jdbc2/ArrayTest.java
b/org/postgresql/test/jdbc2/ArrayTest.java
index 16b0823..7b796be 100644
--- a/org/postgresql/test/jdbc2/ArrayTest.java
+++ b/org/postgresql/test/jdbc2/ArrayTest.java
@@ -186,6 +186,37 @@ public class ArrayTest extends TestCase
assertEquals(3, resultCount);
}

+ public void testSetObjectFromJavaArray() throws SQLException {
+ String[] strArray = new String[]{"a","b","c"};
+
+ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO
arrtest(strarr) VALUES (?)");
+
+ // Incorrect, but commonly attempted by many ORMs:
+ try {
+ pstmt.setObject(1, strArray, Types.ARRAY);
+ pstmt.executeUpdate();
+ fail("setObject() with a Java array parameter and
Types.ARRAY shouldn't succeed");
+ } catch (org.postgresql.util.PSQLException ex) {
+ // Expected failure.
+ }
+
+ // Also incorrect, but commonly attempted by many ORMs:
+ try {
+ pstmt.setObject(1, strArray);
+ pstmt.executeUpdate();
+ fail("setObject() with a Java array parameter and no Types
argument shouldn't succeed");
+ } catch (org.postgresql.util.PSQLException ex) {
+ // Expected failure.
+ }
+
+ // Correct way, though the use of "text" as a type is non-portable.
+ Array sqlArray = conn.createArrayOf("text", strArray);
+ pstmt.setArray(1, sqlArray);
+ pstmt.executeUpdate();
+
+ pstmt.close();
+ }
+
/**
* Starting with 8.0 non-standard (beginning index isn't 1) bounds
* the dimensions are returned in the data. The following should
--
1.7.11.2

In response to

Browse pgsql-jdbc by date

  From Date Subject
Next Message Craig Ringer 2012-08-22 03:32:50 Re: setObject(...) with native Java arrays like String[] ?
Previous Message Craig Ringer 2012-08-22 03:09:12 setObject(...) with native Java arrays like String[] ?