[libpostgresql-jdbc-java] 09/12: 8.2 servers support NULL array elements, so support them in the JDBC driver. Currently this patch is only applied to 8.2 as a more invasive patch is under discussion for 8.3 and we'll wait to see how that pans out first.

Emmanuel Bourg ebourg-guest at moszumanska.debian.org
Mon Jan 9 10:20:28 UTC 2017


This is an automated email from the git hooks/post-receive script.

ebourg-guest pushed a commit to tag REL8_2_507
in repository libpostgresql-jdbc-java.

commit cfb453ca06d8cb1b21c9073b975b02c4c35dd3b9
Author: Kris Jurka <books at ejurka.com>
Date:   Wed Nov 21 19:49:24 2007 +0000

    8.2 servers support NULL array elements, so support them in the JDBC
    driver.  Currently this patch is only applied to 8.2 as a more
    invasive patch is under discussion for 8.3 and we'll wait to see how
    that pans out first.
    
    Christian Schröder
---
 org/postgresql/jdbc2/AbstractJdbc2Array.java |  6 +-
 org/postgresql/test/jdbc2/ArrayTest.java     | 89 ++++++++++++++++++++++++++++
 2 files changed, 94 insertions(+), 1 deletion(-)

diff --git a/org/postgresql/jdbc2/AbstractJdbc2Array.java b/org/postgresql/jdbc2/AbstractJdbc2Array.java
index c74a14e..aa5868b 100644
--- a/org/postgresql/jdbc2/AbstractJdbc2Array.java
+++ b/org/postgresql/jdbc2/AbstractJdbc2Array.java
@@ -103,6 +103,8 @@ public class AbstractJdbc2Array
             StringBuffer sbuf = new StringBuffer();
             boolean foundOpen = false;
             boolean insideString = false;
+            boolean isQuoted = false;
+            boolean haveMinServerVersion82 = conn.haveMinimumServerVersion("8.2");
 
             /**
              * Starting with 8.0 non-standard (beginning index
@@ -142,6 +144,7 @@ public class AbstractJdbc2Array
                 else if (chars[i] == '"')
                 {
                     insideString = !insideString;
+                    isQuoted = true;
                     continue;
                 }
                 else if (!insideString && (chars[i] == ',' || chars[i] == '}') ||
@@ -149,8 +152,9 @@ public class AbstractJdbc2Array
                 {
                     if ( chars[i] != '"' && chars[i] != '}' && chars[i] != ',' )
                         sbuf.append(chars[i]);
-                    array.add( sbuf.toString() );
+                    array.add( sbuf.toString().equals("NULL") && !isQuoted && haveMinServerVersion82 ? null : sbuf.toString() );
                     sbuf = new StringBuffer();
+                    isQuoted = false;
                     continue;
                 }
                 sbuf.append( chars[i] );
diff --git a/org/postgresql/test/jdbc2/ArrayTest.java b/org/postgresql/test/jdbc2/ArrayTest.java
index caf73ad..d14941e 100644
--- a/org/postgresql/test/jdbc2/ArrayTest.java
+++ b/org/postgresql/test/jdbc2/ArrayTest.java
@@ -57,6 +57,95 @@ public class ArrayTest extends TestCase
         pstmt.close();
     }
 
+    public void testNullElementsPre82() throws SQLException {
+        if (TestUtil.haveMinimumServerVersion(conn, "8.2"))
+            return;
+
+        Statement stmt = conn.createStatement();
+
+        ResultSet rs = stmt.executeQuery("SELECT '{a,null,\"null\"}'::text[]");
+        assertTrue(rs.next());
+
+        Array arr = rs.getArray(1);
+        String s[] = (String[]) arr.getArray();
+        assertEquals(3, s.length);
+        assertEquals("a", s[0]);
+        assertEquals("null", s[1]);
+        assertEquals("null", s[2]);
+
+        rs.close();
+        stmt.close();
+    }
+
+    public void testWriteNullElements() throws SQLException {
+        if (!TestUtil.haveMinimumServerVersion(conn, "8.2"))
+            return;
+
+        Statement stmt = conn.createStatement();
+
+        ResultSet rs = stmt.executeQuery("SELECT ARRAY[1,NULL,2], ARRAY['a',NULL,'null']");
+        assertTrue(rs.next());
+
+        PreparedStatement pstmt = conn.prepareStatement("SELECT ?,?");
+        pstmt.setArray(1, rs.getArray(1));
+        pstmt.setArray(2, rs.getArray(2));
+        rs.close();
+        stmt.close();
+        rs = pstmt.executeQuery();
+
+        assertTrue(rs.next());
+
+        Array intArr = rs.getArray(1);
+        int[] ia = (int[]) intArr.getArray();
+        assertEquals(3, ia.length);
+        assertEquals(1, ia[0]);
+        assertEquals(0, ia[1]);
+        assertEquals(2, ia[2]);
+
+        Array strArr1 = rs.getArray(2);
+        String[] sa1 = (String[]) strArr1.getArray();
+        assertEquals(3, sa1.length);
+        assertEquals("a", sa1[0]);
+        assertNull(sa1[1]);
+        assertEquals("null", sa1[2]);
+
+        rs.close();
+        pstmt.close();
+    }
+
+    public void testReadNullElements() throws SQLException {
+        if (!TestUtil.haveMinimumServerVersion(conn, "8.2"))
+            return;
+
+        Statement stmt = conn.createStatement();
+
+        ResultSet rs = stmt.executeQuery("SELECT ARRAY[1,NULL,2], ARRAY['a',NULL,'null'], '{a,\"NULL\",b}'::text[]");
+        assertTrue(rs.next());
+
+        Array intArr = rs.getArray(1);
+        int[] ia = (int[]) intArr.getArray();
+        assertEquals(3, ia.length);
+        assertEquals(1, ia[0]);
+        assertEquals(0, ia[1]);
+        assertEquals(2, ia[2]);
+
+        Array strArr1 = rs.getArray(2);
+        String[] sa1 = (String[]) strArr1.getArray();
+        assertEquals(3, sa1.length);
+        assertEquals("a", sa1[0]);
+        assertNull(sa1[1]);
+        assertEquals("null", sa1[2]);
+
+        Array strArr2 = rs.getArray(3);
+        String[] sa2 = (String[]) strArr2.getArray();
+        assertEquals(3, sa2.length);
+        assertEquals("a", sa2[0]);
+        assertEquals("NULL", sa2[1]);
+        assertEquals("b", sa2[2]);
+
+        rs.close();
+        stmt.close();
+    }
 
     public void testRetrieveArrays() throws SQLException {
         Statement stmt = conn.createStatement();

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git



More information about the pkg-java-commits mailing list