postgresql-jdbc.git / summary / log / commit / refs
commit b83e845eb07f2c2dd4b7f4425e6bc3aacbba2086
Author: Kris Jurka <books@ejurka.com>
Date: Sat Oct 23 07:30:47 2010 +0000
If a domain has a not null constraint, report that information
in the metadata for both DatabaseMetaData.getColumns and
ResultSetMetaData.isNullable.
Reported by Thomas Kellerer
org/postgresql/core/Field.java | 4 ++--
.../jdbc2/AbstractJdbc2DatabaseMetaData.java | 4 ++--
.../test/jdbc2/DatabaseMetaDataTest.java | 24 +++++++++++++++++++++-
3 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/org/postgresql/core/Field.java b/org/postgresql/core/Field.java
index e626d070..f7838190 100644
--- a/org/postgresql/core/Field.java
+++ b/org/postgresql/core/Field.java
@@ -3,7 +3,7 @@
* Copyright (c) 2003-2008, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/core/Field.java,v 1.12 2008/01/08 06:56:27 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/core/Field.java,v 1.13 2009/03/12 03:59:50 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -159,7 +159,7 @@ public class Field
PreparedStatement ps = null;
try
{
- ps = con.prepareStatement("SELECT attnotnull FROM pg_catalog.pg_attribute WHERE attrelid = ? AND attnum = ?;");
+ ps = con.prepareStatement("SELECT a.attnotnull OR (t.typtype = 'd' AND t.typnotnull) FROM pg_catalog.pg_attribute a JOIN pg_catalog.pg_type t ON (a.atttypid = t.oid) WHERE a.attrelid = ? AND a.attnum = ?;");
ps.setInt(1, tableOid);
ps.setInt(2, positionInTable);
res = ps.executeQuery();
diff --git a/org/postgresql/jdbc2/AbstractJdbc2DatabaseMetaData.java b/org/postgresql/jdbc2/AbstractJdbc2DatabaseMetaData.java
index 9051ff15..7a6c9e3a 100644
--- a/org/postgresql/jdbc2/AbstractJdbc2DatabaseMetaData.java
+++ b/org/postgresql/jdbc2/AbstractJdbc2DatabaseMetaData.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2008, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/AbstractJdbc2DatabaseMetaData.java,v 1.58 2010/10/16 00:38:31 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/AbstractJdbc2DatabaseMetaData.java,v 1.59 2010/10/16 00:43:40 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -2281,7 +2281,7 @@ public abstract class AbstractJdbc2DatabaseMetaData
else
sql = "";
- sql += "SELECT n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull,a.atttypmod,a.attlen,";
+ sql += "SELECT n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd' AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,";
if (connection.haveMinimumServerVersion("8.4"))
sql += "row_number() OVER (PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, ";
diff --git a/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java b/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java
index c863ab9e..d857e9b8 100644
--- a/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java
+++ b/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2008, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java,v 1.47 2010/08/06 22:01:21 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java,v 1.48 2010/10/16 00:38:31 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -55,6 +55,11 @@ public class DatabaseMetaDataTest extends TestCase
stmt.execute("CREATE OR REPLACE FUNCTION f3(IN a int, INOUT b varchar, OUT c timestamptz) AS $f$ BEGIN b := 'a'; c := now(); return; END; $f$ LANGUAGE 'plpgsql'");
}
stmt.execute("CREATE OR REPLACE FUNCTION f4(int) RETURNS testmetadata AS 'SELECT 1, ''a''::text, now(), ''c''::text, ''q''::text' LANGUAGE 'SQL'");
+
+ if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
+ stmt.execute("CREATE DOMAIN nndom AS int not null");
+ stmt.execute("CREATE TABLE domaintable (id nndom)");
+ }
stmt.close();
}
@@ -80,6 +85,10 @@ public class DatabaseMetaDataTest extends TestCase
if (TestUtil.haveMinimumServerVersion(con, "8.1")) {
stmt.execute("DROP FUNCTION f3(int, varchar)");
}
+ if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
+ stmt.execute("DROP TABLE domaintable");
+ stmt.execute("DROP DOMAIN nndom");
+ }
TestUtil.closeDB( con );
}
@@ -492,6 +501,19 @@ public class DatabaseMetaDataTest extends TestCase
rs.close();
}
+ public void testNotNullDomainColumn() throws SQLException
+ {
+ if (!TestUtil.haveMinimumServerVersion(con, "7.3"))
+ return;
+
+ DatabaseMetaData dbmd = con.getMetaData();
+ ResultSet rs = dbmd.getColumns("", "", "domaintable", "");
+ assertTrue(rs.next());
+ assertEquals("id", rs.getString("COLUMN_NAME"));
+ assertEquals("NO", rs.getString("IS_NULLABLE"));
+ assertTrue(!rs.next());
+ }
+
public void testAscDescIndexInfo() throws SQLException
{
if (!TestUtil.haveMinimumServerVersion(con, "8.3"))
[parent: 7f9a9722da9d]