summaryrefslogtreecommitdiff
path: root/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java')
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java54
1 files changed, 53 insertions, 1 deletions
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
index 0ded6e608b..f7f8241571 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
@@ -2966,7 +2966,59 @@ public abstract class AbstractJdbc1DatabaseMetaData
* the PK_NAME field.
*/
- if (connection.haveMinimumServerVersion("7.3")) {
+ if (connection.haveMinimumServerVersion("7.4")) {
+ String sql = "SELECT NULL::text AS PKTABLE_CAT, pkn.nspname AS PKTABLE_SCHEMA, pkc.relname AS PKTABLE_NAME, pka.attname AS PKCOLUMN_NAME, "+
+ "NULL::text AS FK_TABLE_CAT, fkn.nspname AS FKTABLE_SCHEMA, fkc.relname AS FKTABLE_NAME, fka.attname AS FKCOLUMN_NAME, "+
+ "pos.n AS KEY_SEQ, "+
+ "CASE con.confupdtype "+
+ " WHEN 'c' THEN " + DatabaseMetaData.importedKeyCascade +
+ " WHEN 'n' THEN " + DatabaseMetaData.importedKeySetNull +
+ " WHEN 'd' THEN " + DatabaseMetaData.importedKeySetDefault +
+ " WHEN 'r' THEN " + DatabaseMetaData.importedKeyRestrict +
+ " WHEN 'a' THEN " + DatabaseMetaData.importedKeyNoAction +
+ " ELSE NULL END AS UPDATE_RULE, "+
+ "CASE con.confdeltype "+
+ " WHEN 'c' THEN " + DatabaseMetaData.importedKeyCascade +
+ " WHEN 'n' THEN " + DatabaseMetaData.importedKeySetNull +
+ " WHEN 'd' THEN " + DatabaseMetaData.importedKeySetDefault +
+ " WHEN 'r' THEN " + DatabaseMetaData.importedKeyRestrict +
+ " WHEN 'a' THEN " + DatabaseMetaData.importedKeyNoAction +
+ " ELSE NULL END AS DELETE_RULE, "+
+ "con.conname AS FK_NAME, pkic.relname AS PK_NAME, "+
+ "CASE "+
+ " WHEN con.condeferrable AND con.condeferred THEN " + DatabaseMetaData.importedKeyInitiallyDeferred +
+ " WHEN con.condeferrable THEN " + DatabaseMetaData.importedKeyInitiallyImmediate +
+ " ELSE " + DatabaseMetaData.importedKeyNotDeferrable+
+ " END AS DEFERRABILITY "+
+ " FROM "+
+ " pg_catalog.pg_namespace pkn, pg_catalog.pg_class pkc, pg_catalog.pg_attribute pka, "+
+ " pg_catalog.pg_namespace fkn, pg_catalog.pg_class fkc, pg_catalog.pg_attribute fka, "+
+ " pg_catalog.pg_constraint con, information_schema._pg_keypositions() pos(n), "+
+ " pg_catalog.pg_depend dep, pg_catalog.pg_class pkic "+
+ " WHERE pkn.oid = pkc.relnamespace AND pkc.oid = pka.attrelid AND pka.attnum = con.confkey[pos.n] AND con.confrelid = pkc.oid "+
+ " AND fkn.oid = fkc.relnamespace AND fkc.oid = fka.attrelid AND fka.attnum = con.conkey[pos.n] AND con.conrelid = fkc.oid "+
+ " AND con.contype = 'f' AND con.oid = dep.objid AND pkic.oid = dep.refobjid AND pkic.relkind = 'i' AND dep.classid = 'pg_constraint'::regclass::oid AND dep.refclassid = 'pg_class'::regclass::oid ";
+ if (primarySchema != null && !"".equals(primarySchema)) {
+ sql += " AND pkn.nspname = '"+escapeQuotes(primarySchema)+"' ";
+ }
+ if (foreignSchema != null && !"".equals(foreignSchema)) {
+ sql += " AND fkn.nspname = '"+escapeQuotes(foreignSchema)+"' ";
+ }
+ if (primaryTable != null && !"".equals(primaryTable)) {
+ sql += " AND pkc.relname = '"+escapeQuotes(primaryTable)+"' ";
+ }
+ if (foreignTable != null && !"".equals(foreignTable)) {
+ sql += " AND fkc.relname = '"+escapeQuotes(foreignTable)+"' ";
+ }
+
+ if (primaryTable != null) {
+ sql += " ORDER BY fkn.nspname,fkc.relname,pos.n";
+ } else {
+ sql += " ORDER BY pkn.nspname,pkc.relname,pos.n";
+ }
+
+ return connection.createStatement().executeQuery(sql);
+ } else if (connection.haveMinimumServerVersion("7.3")) {
select = "SELECT DISTINCT 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) "+