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]