| 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: | Whole Thread | Raw Message | 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
| 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[] ? |