From 33bfc6a7e027c74c284d01a6538b792e3c56cf4e Mon Sep 17 00:00:00 2001 From: Zemian Deng Date: Sat, 5 Aug 2017 15:26:06 -0400 Subject: [PATCH 1/3] fix: sort result set by sql type value in metadata typeinfo fixes #716 --- .../org/postgresql/jdbc/PgDatabaseMetaData.java | 17 +++++++++++++++++ .../test/jdbc4/DatabaseMetaDataTest.java | 14 ++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java index e7b5c4472f..4ef9977b5c 100644 --- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java +++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java @@ -14,6 +14,7 @@ import org.postgresql.util.PSQLException; import org.postgresql.util.PSQLState; +import java.io.IOException; import java.sql.Array; import java.sql.Connection; import java.sql.DatabaseMetaData; @@ -24,6 +25,8 @@ import java.sql.Types; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -2227,6 +2230,20 @@ public ResultSet getTypeInfo() throws SQLException { rs.close(); stmt.close(); + // Per JDBC API, we should sort result by SqlType value + Collections.sort(v, new Comparator() { + @Override + public int compare(byte[][] o1, byte[][] o2) { + try { + int i1 = Integer.parseInt(connection.getEncoding().decode(o1[1])); + int i2 = Integer.parseInt(connection.getEncoding().decode(o2[1])); + return Integer.compare(i1, i2); + } catch (IOException e) { + return -1; // Should not happen, but if we do, we should avoid breaking the operation. + } + } + }); + return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v); } diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java index 734ace443e..7ba9121ea0 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java +++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java @@ -80,4 +80,18 @@ public void testGetSchemas() throws SQLException { assertNull(rs.getString("TABLE_CATALOG")); assertTrue(!rs.next()); } + + @Test + public void testSortedDataTypes() throws SQLException { + // https://github.com/pgjdbc/pgjdbc/issues/716 + DatabaseMetaData dbmd = _conn.getMetaData(); + ResultSet rs = dbmd.getTypeInfo(); + int lastType = Integer.MIN_VALUE; + while(rs.next()) { + int type = rs.getInt("DATA_TYPE"); + assertTrue(lastType <= type); + lastType = type; + } + rs.close(); + } } From e540382f30f1956a9798b2fed336e4c67ac8b796 Mon Sep 17 00:00:00 2001 From: Zemian Deng Date: Sat, 5 Aug 2017 21:26:00 -0400 Subject: [PATCH 2/3] fix: add space around while keyword to conform checkstyle rule fixes #716 --- .../java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java index 7ba9121ea0..78ea5ded50 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java +++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java @@ -87,7 +87,7 @@ public void testSortedDataTypes() throws SQLException { DatabaseMetaData dbmd = _conn.getMetaData(); ResultSet rs = dbmd.getTypeInfo(); int lastType = Integer.MIN_VALUE; - while(rs.next()) { + while (rs.next()) { int type = rs.getInt("DATA_TYPE"); assertTrue(lastType <= type); lastType = type; From f4ec5866a9e19342e1e4e8b9581ecfae8acc83fa Mon Sep 17 00:00:00 2001 From: Zemian Deng Date: Sat, 5 Aug 2017 22:38:16 -0400 Subject: [PATCH 3/3] fix: made code compatible with jdk6 fixes #716 --- .../src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java index 4ef9977b5c..75f0a63c18 100644 --- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java +++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java @@ -2237,7 +2237,7 @@ public int compare(byte[][] o1, byte[][] o2) { try { int i1 = Integer.parseInt(connection.getEncoding().decode(o1[1])); int i2 = Integer.parseInt(connection.getEncoding().decode(o2[1])); - return Integer.compare(i1, i2); + return (i1 < i2) ? -1 : ((i1 == i2) ? 0 : 1); } catch (IOException e) { return -1; // Should not happen, but if we do, we should avoid breaking the operation. }