diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
index 02798897ad148f60462b06dd6a55dd040420b313..a1a61a58cce89bf750bd7d1675aa1cbe67fb365a 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
@@ -2912,62 +2912,6 @@ public abstract class AbstractJdbc1DatabaseMetaData
 		return connection.createStatement().executeQuery(sql);
 	}
 
-	/*
-	 SELECT
-			c.relname as primary,
-			c2.relname as foreign,
-			t.tgconstrname,
-			ic.relname as fkeyname,
-			af.attnum as fkeyseq,
-			ipc.relname as pkeyname,
-			ap.attnum as pkeyseq,
-			t.tgdeferrable,
-			t.tginitdeferred,
-			t.tgnargs,t.tgargs,
-			p1.proname as updaterule,
-			p2.proname as deleterule
-	FROM
-			pg_trigger t,
-			pg_trigger t1,
-			pg_class c,
-			pg_class c2,
-			pg_class ic,
-			pg_class ipc,
-			pg_proc p1,
-			pg_proc p2,
-			pg_index if,
-			pg_index ip,
-			pg_attribute af,
-			pg_attribute ap
-	WHERE
-			(t.tgrelid=c.oid
-			AND t.tgisconstraint
-			AND t.tgconstrrelid=c2.oid
-			AND t.tgfoid=p1.oid
-			and p1.proname like '%%upd')
-
-			and
-			(t1.tgrelid=c.oid
-			and t1.tgisconstraint
-			and t1.tgconstrrelid=c2.oid
-			AND t1.tgfoid=p2.oid
-			and p2.proname like '%%del')
-
-			AND c2.relname='users'
-
-			AND
-			(if.indrelid=c.oid
-			AND if.indexrelid=ic.oid
-			and ic.oid=af.attrelid
-			AND if.indisprimary)
-
-			and
-			(ip.indrelid=c2.oid
-			and ip.indexrelid=ipc.oid
-			and ipc.oid=ap.attrelid
-			and ip.indisprimary)
-
-	*/
 	/**
 	 *
 	 * @param catalog
@@ -3014,55 +2958,68 @@ public abstract class AbstractJdbc1DatabaseMetaData
 		 */
 
 		if (connection.haveMinimumServerVersion("7.3")) {
-			select = "SELECT DISTINCT n.nspname as pnspname,n2.nspname as fnspname, ";
-			from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_namespace n2, pg_catalog.pg_trigger t, pg_catalog.pg_trigger t1, pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_class ic, pg_catalog.pg_proc p1, pg_catalog.pg_proc p2, pg_catalog.pg_index i, pg_catalog.pg_attribute a ";
-			where = " AND c.relnamespace = n.oid AND c2.relnamespace=n2.oid ";
+			select = "SELECT n1.nspname as pnspname,n2.nspname as fnspname, ";
+			from = " FROM pg_catalog.pg_namespace n1 "+
+				" JOIN pg_catalog.pg_class c1 ON (c1.relnamespace = n1.oid) "+
+				" JOIN pg_catalog.pg_index i ON (c1.oid=i.indrelid) "+
+				" JOIN pg_catalog.pg_class ic ON (i.indexrelid=ic.oid) "+
+				" JOIN pg_catalog.pg_attribute a ON (ic.oid=a.attrelid), "+
+				" pg_catalog.pg_namespace n2 "+
+				" JOIN pg_catalog.pg_class c2 ON (c2.relnamespace=n2.oid), "+
+				" pg_catalog.pg_trigger t1 "+
+				" JOIN pg_catalog.pg_proc p1 ON (t1.tgfoid=p1.oid), "+
+				" pg_catalog.pg_trigger t2 "+
+				" JOIN pg_catalog.pg_proc p2 ON (t2.tgfoid=p2.oid) ";
 			if (primarySchema != null && !"".equals(primarySchema)) {
-				where += " AND n.nspname = '"+escapeQuotes(primarySchema)+"' ";
+				where += " AND n1.nspname = '"+escapeQuotes(primarySchema)+"' ";
 			}
 			if (foreignSchema != null && !"".equals(foreignSchema)) {
 				where += " AND n2.nspname = '"+escapeQuotes(foreignSchema)+"' ";
 			}
 		} else {
-			select = "SELECT DISTINCT NULL::text as pnspname, NULL::text as fnspname, ";
-			from = " FROM pg_trigger t, pg_trigger t1, pg_class c, pg_class c2, pg_class ic, pg_proc p1, pg_proc p2, pg_index i, pg_attribute a ";
+			select = "SELECT NULL::text as pnspname, NULL::text as fnspname, ";
+			from = " FROM pg_class c1 "+
+				" JOIN pg_index i ON (c1.oid=i.indrelid) "+
+				" JOIN pg_class ic ON (i.indexrelid=ic.oid) "+
+				" JOIN pg_attribute a ON (ic.oid=a.attrelid), "+
+				" pg_class c2, "+
+				" pg_trigger t1 "+
+				" JOIN pg_proc p1 ON (t1.tgfoid=p1.oid), "+
+				" pg_trigger t2 "+
+				" JOIN pg_proc p2 ON (t2.tgfoid=p2.oid) ";
 		}
 
 		String sql = select
-			+ "c.relname as prelname, "
+			+ "c1.relname as prelname, "
 			+ "c2.relname as frelname, "
-			+ "t.tgconstrname, "
+			+ "t1.tgconstrname, "
 			+ "a.attnum as keyseq, "
 			+ "ic.relname as fkeyname, "
-			+ "t.tgdeferrable, "
-			+ "t.tginitdeferred, "
-			+ "t.tgnargs,t.tgargs, "
+			+ "t1.tgdeferrable, "
+			+ "t1.tginitdeferred, "
+			+ "t1.tgnargs,t1.tgargs, "
 			+ "p1.proname as updaterule, "
 			+ "p2.proname as deleterule "
 			+ from 
 			+ "WHERE "
 			// isolate the update rule
-			+ "(t.tgrelid=c.oid "
-			+ "AND t.tgisconstraint "
-			+ "AND t.tgconstrrelid=c2.oid "
-			+ "AND t.tgfoid=p1.oid "
-			+ "and p1.proname like 'RI\\\\_FKey\\\\_%\\\\_upd') "
+			+ "(t1.tgrelid=c1.oid "
+			+ "AND t1.tgisconstraint "
+			+ "AND t1.tgconstrrelid=c2.oid "
+			+ "AND p1.proname LIKE 'RI\\\\_FKey\\\\_%\\\\_upd') "
 
-			+ "and "
+			+ "AND "
 			// isolate the delete rule
-			+ "(t1.tgrelid=c.oid "
-			+ "and t1.tgisconstraint "
-			+ "and t1.tgconstrrelid=c2.oid "
-			+ "AND t1.tgfoid=p2.oid "
-			+ "and p2.proname like 'RI\\\\_FKey\\\\_%\\\\_del') "
-			+ "AND i.indrelid=c.oid "
-			+ "AND i.indexrelid=ic.oid "
-			+ "AND ic.oid=a.attrelid "
+			+ "(t2.tgrelid=c1.oid "
+			+ "AND t2.tgisconstraint "
+			+ "AND t2.tgconstrrelid=c2.oid "
+			+ "AND p2.proname LIKE 'RI\\\\_FKey\\\\_%\\\\_del') "
+
 			+ "AND i.indisprimary "
 			+ where;
 
 		if (primaryTable != null) {
-			sql += "AND c.relname='" + escapeQuotes(primaryTable) + "' ";
+			sql += "AND c1.relname='" + escapeQuotes(primaryTable) + "' ";
 		}
 		if (foreignTable != null) {
 			sql += "AND c2.relname='" + escapeQuotes(foreignTable) + "' ";
@@ -3076,8 +3033,14 @@ public abstract class AbstractJdbc1DatabaseMetaData
 		// since when getting crossreference, primaryTable will be defined
 
 		if (primaryTable != null) {
+			if (connection.haveMinimumServerVersion("7.3")) {
+				sql += "fnspname,";
+			}
 			sql += "frelname";
 		} else {
+			if (connection.haveMinimumServerVersion("7.3")) {
+				sql += "pnspname,";
+			}
 			sql += "prelname";
 		}
 
@@ -3160,6 +3123,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
 			// Parse the tgargs data
 			String fkeyColumn = "";
 			String pkeyColumn = "";
+			String fkName = "";
 			// Note, I am guessing at most of this, but it should be close
 			// if not, please correct
 			// the keys are in pairs and start after the first four arguments
@@ -3172,9 +3136,16 @@ public abstract class AbstractJdbc1DatabaseMetaData
 			// we are primarily interested in the column names which are the last items in the string
 
 			StringTokenizer st = new StringTokenizer(targs, "\\000");
+			if (st.hasMoreTokens()) {
+				fkName = st.nextToken();
+			}
+
+			if (fkName.startsWith("<unnamed>")) {
+				fkName = targs;
+			}
 
 			int advance = 4 + (keySequence - 1) * 2;
-			for ( int i = 0; st.hasMoreTokens() && i < advance ; i++ )
+			for ( int i = 1; st.hasMoreTokens() && i < advance ; i++ )
 				st.nextToken(); // advance to the key column of interest
 
 			if ( st.hasMoreTokens() )
@@ -3190,7 +3161,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
 			tuple[7] = fkeyColumn.getBytes(); //FKCOLUMN_NAME
 
 			tuple[8] = rs.getBytes(6); //KEY_SEQ
-			tuple[11] = targs.getBytes(); //FK_NAME this will give us a unique name for the foreign key
+			tuple[11] = fkName.getBytes(); //FK_NAME this will give us a unique name for the foreign key
 			tuple[12] = rs.getBytes(7); //PK_NAME
 
 			// DEFERRABILITY
diff --git a/src/interfaces/jdbc/org/postgresql/test/jdbc2/optional/ConnectionPoolTest.java b/src/interfaces/jdbc/org/postgresql/test/jdbc2/optional/ConnectionPoolTest.java
index da467bc22f5ac3a39d440a2bea28901e671a621f..8f84193990a5e1ab1bbbbd7f45d99b0f00fedd76 100644
--- a/src/interfaces/jdbc/org/postgresql/test/jdbc2/optional/ConnectionPoolTest.java
+++ b/src/interfaces/jdbc/org/postgresql/test/jdbc2/optional/ConnectionPoolTest.java
@@ -11,7 +11,7 @@ import java.sql.*;
  * interface to the PooledConnection is through the CPDS.
  *
  * @author Aaron Mulder (ammulder@chariotsolutions.com)
- * @version $Revision: 1.5 $
+ * @version $Revision: 1.6 $
  */
 public class ConnectionPoolTest extends BaseDataSourceTest
 {
@@ -391,38 +391,6 @@ public class ConnectionPoolTest extends BaseDataSourceTest
             }
     }
 
-    /**
-     * Ensures that the Statement proxy generated by the Connection handle
-     * throws the correct kind of exception.
-     */
-    public void testStatementProxy() {
-            Statement s = null;
-            try 
-            {
-                    PooledConnection pc = getPooledConnection();
-                    Connection con = pc.getConnection();
-                    s = con.createStatement();
-            } 
-            catch (SQLException e) 
-            {
-                    fail(e.getMessage());
-            }
-            try 
-            {
-                    s.executeQuery("SELECT * FROM THIS_TABLE_SHOULD_NOT_EXIST");
-                    fail("An SQL exception was not thrown that should have been");
-            } 
-            catch (SQLException e) 
-            {
-                    ; // This is the expected and correct path
-            }
-            catch (Exception e) 
-            {
-                    fail("bad exception; was expecting SQLException, not" +
-                         e.getClass().getName());
-            }
-    }
-
     /**
      * Ensures that a prepared statement generated by a proxied connection
      * returns the proxied connection from getConnection() [not the physical