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