postgresql-jdbc.git / summary / log / commit / refs
commit 2f6633bd9e1e9d7f313ea4dfec37f9671fc07453
Author: Dave Cramer <davecramer@gmail.com>
Commit: GitHub <noreply@github.com>
Date: Tue Nov 07 12:23:00 2017 +0000
add test for identity, fix isAutoincrement in postgresql 10 fixes #130 (#1004)
* add test for identity, fix isAutoincrement in postgresql 10 fixes #130
.../org/postgresql/jdbc/PgResultSetMetaData.java | 12 +++++++++---
.../postgresql/test/jdbc2/ResultSetMetaDataTest.java | 20 ++++++++++++++++++++
2 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSetMetaData.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSetMetaData.java
index d075b236..cdf25f40 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSetMetaData.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSetMetaData.java
@@ -8,6 +8,7 @@ package org.postgresql.jdbc;
import org.postgresql.PGResultSetMetaData;
import org.postgresql.core.BaseConnection;
import org.postgresql.core.Field;
+import org.postgresql.core.ServerVersion;
import org.postgresql.util.GT;
import org.postgresql.util.JdbcBlackHole;
import org.postgresql.util.LruCache;
@@ -233,9 +234,14 @@ public class PgResultSetMetaData implements ResultSetMetaData, PGResultSetMetaDa
StringBuilder sql = new StringBuilder(
"SELECT c.oid, a.attnum, a.attname, c.relname, n.nspname, "
- + "a.attnotnull OR (t.typtype = 'd' AND t.typnotnull), "
- + "pg_catalog.pg_get_expr(d.adbin, d.adrelid) LIKE '%nextval(%' "
- + "FROM pg_catalog.pg_class c "
+ + "a.attnotnull OR (t.typtype = 'd' AND t.typnotnull), ");
+
+ if ( connection.haveMinimumServerVersion(ServerVersion.v10)) {
+ sql.append("a.attidentity != '' OR pg_catalog.pg_get_expr(d.adbin, d.adrelid) LIKE '%nextval(%' ");
+ } else {
+ sql.append("pg_catalog.pg_get_expr(d.adbin, d.adrelid) LIKE '%nextval(%' ");
+ }
+ sql.append( "FROM pg_catalog.pg_class c "
+ "JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid) "
+ "JOIN pg_catalog.pg_attribute a ON (c.oid = a.attrelid) "
+ "JOIN pg_catalog.pg_type t ON (a.atttypid = t.oid) "
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ResultSetMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ResultSetMetaDataTest.java
index 39649b43..98f9b78c 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ResultSetMetaDataTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ResultSetMetaDataTest.java
@@ -10,9 +10,11 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.postgresql.PGResultSetMetaData;
+import org.postgresql.core.ServerVersion;
import org.postgresql.jdbc.PreferQueryMode;
import org.postgresql.test.TestUtil;
+import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;
@@ -38,6 +40,11 @@ public class ResultSetMetaDataTest extends BaseTest4 {
TestUtil.dropSequence(conn, "serialtest_a_seq");
TestUtil.dropSequence(conn, "serialtest_b_seq");
+
+ if (TestUtil.haveMinimumServerVersion(conn, ServerVersion.v10)) {
+ TestUtil.createTable(conn, "identitytest", "id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY");
+ }
+
TestUtil.createTable(conn, "serialtest", "a serial, b bigserial, c int");
TestUtil.createTable(conn, "alltypes",
"bool boolean, i2 int2, i4 int4, i8 int8, num numeric(10,2), re real, fl float, ch char(3), vc varchar(3), tx text, d date, t time without time zone, tz time with time zone, ts timestamp without time zone, tsz timestamp with time zone, bt bytea");
@@ -52,6 +59,9 @@ public class ResultSetMetaDataTest extends BaseTest4 {
TestUtil.dropTable(conn, "rsmd1");
TestUtil.dropTable(conn, "timetest");
TestUtil.dropTable(conn, "serialtest");
+ if (TestUtil.haveMinimumServerVersion(conn, ServerVersion.v10)) {
+ TestUtil.dropTable(conn, "identitytest");
+ }
TestUtil.dropTable(conn, "alltypes");
TestUtil.dropTable(conn, "sizetest");
TestUtil.dropSequence(conn, "serialtest_a_seq");
@@ -248,6 +258,16 @@ public class ResultSetMetaDataTest extends BaseTest4 {
assertEquals("rsmd1", rsmd.getColumnTypeName(1));
}
+ @Test
+ public void testIdentityColumn() throws Exception {
+ assumeMinimumServerVersion(ServerVersion.v10);
+ assumePreparedStatementMetadataSupported();
+ PreparedStatement pstmt = conn.prepareStatement("SELECT id FROM identitytest");
+ ResultSet rs = pstmt.executeQuery();
+ ResultSetMetaData rsmd = pstmt.getMetaData();
+ Assert.assertTrue(rsmd.isAutoIncrement(1));
+ }
+
private void assumePreparedStatementMetadataSupported() {
Assume.assumeTrue("prepared statement metadata is not supported for simple protocol",
preferQueryMode.compareTo(PreferQueryMode.EXTENDED_FOR_PREPARED) >= 0);
[parent: 059628fcdf20]