On Fri, 15 Aug 2003, Richard Froud wrote:
> Please enter a FULL description of your problem:
> ------------------------------------------------
> When reading database metadata for foreign keys using the JDBC
> DatabaseMetaData.getImportedKeys() and DatabaseMetaData.getExportedKeys()
> methods the ON UPDATE rule is returned as the ON DELETE rule. It is also
> correctly returned as the ON UPDATE rule. Therefore there is no way to
> access the ON DELETE rule. Consequenntly innaccurate representations of the
> database structure are obtained.
Here is a patch for this. Additionally the on delete rule would not
return importedKeyRestrict because of a missing if statement. Also an
addition to the test suite is attached.
Kris Jurka
Index: src/interfaces/jdbc/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java
===================================================================
RCS file:
/projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java,v
retrieving revision 1.18
diff -c -r1.18 DatabaseMetaDataTest.java
*** src/interfaces/jdbc/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java 29 May
2003 04:39:48 -0000 1.18
--- src/interfaces/jdbc/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java 3 Nov
2003 10:20:15 -0000
***************
*** 137,142 ****
--- 137,174 ----
fail(ex.getMessage());
}
}
+
+ public void testForeignKeyActions()
+ {
+ try {
+ Connection conn = TestUtil.openDB();
+ TestUtil.createTable(conn, "pkt", "id int primary key");
+ TestUtil.createTable(conn, "fkt1", "id int references pkt on
update restrict on delete cascade");
+ TestUtil.createTable(conn, "fkt2", "id int references pkt on
update set null on delete set default");
+ DatabaseMetaData dbmd = conn.getMetaData();
+
+ ResultSet rs = dbmd.getImportedKeys(null,"","fkt1");
+ assertTrue(rs.next());
+ assertTrue(rs.getInt("UPDATE_RULE") ==
DatabaseMetaData.importedKeyRestrict);
+ assertTrue(rs.getInt("DELETE_RULE") ==
DatabaseMetaData.importedKeyCascade);
+ rs.close();
+
+ rs = dbmd.getImportedKeys(null,"","fkt2");
+ assertTrue(rs.next());
+ assertTrue(rs.getInt("UPDATE_RULE") ==
DatabaseMetaData.importedKeySetNull);
+ assertTrue(rs.getInt("DELETE_RULE") ==
DatabaseMetaData.importedKeySetDefault);
+ rs.close();
+
+ TestUtil.dropTable(conn,"fkt2");
+ TestUtil.dropTable(conn,"fkt1");
+ TestUtil.dropTable(conn,"pkt");
+ }
+ catch (SQLException ex)
+ {
+ fail(ex.getMessage());
+ }
+ }
+
public void testForeignKeys()
{
try
Index: src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
===================================================================
RCS file:
/projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java,v
retrieving revision 1.25
diff -c -r1.25 AbstractJdbc1DatabaseMetaData.java
*** src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java 17 Sep
2003 06:42:47 -0000 1.25
--- src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java 3 Nov
2003 10:07:10 -0000
***************
*** 3114,3120 ****
if ( deleteRule != null )
{
! String rule = updateRule.substring(8,
updateRule.length() - 4);
int action =
java.sql.DatabaseMetaData.importedKeyNoAction;
if ("cascade".equals(rule))
--- 3114,3120 ----
if ( deleteRule != null )
{
! String rule = deleteRule.substring(8,
deleteRule.length() - 4);
int action =
java.sql.DatabaseMetaData.importedKeyNoAction;
if ("cascade".equals(rule))
***************
*** 3123,3128 ****
--- 3123,3130 ----
action =
java.sql.DatabaseMetaData.importedKeySetNull;
else if ("setdefault".equals(rule))
action =
java.sql.DatabaseMetaData.importedKeySetDefault;
+ else if ("restrict".equals(rule))
+ action =
java.sql.DatabaseMetaData.importedKeyRestrict;
tuple[10] = Integer.toString(action).getBytes();
}
---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?
http://archives.postgresql.org