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

Reply via email to