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