[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