diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java b/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java index 7a22cfd754..d4eceb3dbc 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java @@ -13,7 +13,7 @@ import org.postgresql.util.PSQLException; /** * This class provides information about the database as a whole. * - * $Id: DatabaseMetaData.java,v 1.37 2001/11/02 23:50:08 davec Exp $ + * $Id: DatabaseMetaData.java,v 1.38 2001/11/09 02:57:25 davec Exp $ * *

Many of the methods here return lists of information in ResultSets. You * can use the normal ResultSet methods such as getString and getInt to @@ -2272,72 +2272,117 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData ); } - private void parseConstraint(java.sql.ResultSet keyRelation, Vector tuples) throws SQLException + private java.sql.ResultSet getImportedExportedKeys(String catalog, String schema, String primaryTable, String foreignTable) throws SQLException { - byte tuple[][]=new byte[14][0]; - for (int k = 0;k < 14;k++) - tuple[k] = null; - String s=keyRelation.getString(1); - int pos=s.indexOf("\\000"); - if(pos>-1) - { - tuple[11]=s.substring(0,pos).getBytes();; // FK_NAME - int pos2=s.indexOf("\\000", pos+1); - if(pos2>-1) - { - tuple[2]=s.substring(pos+4, pos2).getBytes();; // PKTABLE_NAME - pos=s.indexOf("\\000", pos2+1); - if(pos>-1) - { - tuple[6]=s.substring(pos2+4, pos).getBytes();; // FKTABLE_NAME - pos=s.indexOf("\\000", pos+1); // Ignore MATCH type - if(pos>-1) - { - pos2=s.indexOf("\\000",pos+1); - if(pos2>-1) - { - tuple[3]=s.substring(pos+4, pos2).getBytes();; // PKCOLUMN_NAME - pos=s.indexOf("\\000", pos2+1); - if(pos>-1) - { - tuple[7]=s.substring(pos2+4, pos).getBytes(); //FKCOLUMN_NAME + Field f[]=new Field[14]; + + f[0]=new Field(connection, "PKTABLE_CAT", iVarcharOid, 32); + f[1]=new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32); + f[2]=new Field(connection, "PKTABLE_NAME", iVarcharOid, 32); + f[3]=new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32); + f[4]=new Field(connection, "FKTABLE_CAT", iVarcharOid, 32); + f[5]=new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32); + f[6]=new Field(connection, "FKTABLE_NAME", iVarcharOid, 32); + f[7]=new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32); + f[8]=new Field(connection, "KEY_SEQ", iInt2Oid, 2); + f[9]=new Field(connection, "UPDATE_RULE", iInt2Oid, 2); + f[10]=new Field(connection, "DELETE_RULE", iInt2Oid, 2); + f[11]=new Field(connection, "FK_NAME", iVarcharOid, 32); + f[12]=new Field(connection, "PK_NAME", iVarcharOid, 32); + f[13]=new Field(connection, "DEFERRABILITY", iInt2Oid, 2); + + java.sql.ResultSet rs = connection.ExecSQL("SELECT c.relname,c2.relname," + + "t.tgconstrname,ic.relname," + + "t.tgdeferrable,t.tginitdeferred," + + "t.tgnargs,t.tgargs,p.proname " + + "FROM pg_trigger t,pg_class c,pg_class c2," + + "pg_class ic,pg_proc p, pg_index i " + + "WHERE t.tgrelid=c.oid AND t.tgconstrrelid=c2.oid " + + "AND t.tgfoid=p.oid AND tgisconstraint " + + ((primaryTable!=null) ? "AND c2.relname='"+primaryTable+"' " : "") + + ((foreignTable!=null) ? "AND c.relname='"+foreignTable+"' " : "") + + "AND i.indrelid=c.oid " + + "AND i.indexrelid=ic.oid AND i.indisprimary " + + "ORDER BY c.relname,c2.relname" + ); + Vector tuples = new Vector(); + short seq=0; + if(rs.next()) { + boolean hasMore; + do { + byte tuple[][]=new byte[14][0]; + for (int k = 0;k < 14;k++) + tuple[k] = null; + + String fKeyName=rs.getString(3); + boolean foundRule=false; + do { + String proname=rs.getString(9); + if(proname!=null && proname.startsWith("RI_FKey_")) { + int col=-1; + if(proname.endsWith("_upd")) col=9; // UPDATE_RULE + else if(proname.endsWith("_del")) col=10; // DELETE_RULE + if(col>-1) { + String rule=proname.substring(8, proname.length()-4); + int action=importedKeyNoAction; + if("cascade".equals(rule)) action=importedKeyCascade; + else if("setnull".equals(rule)) action=importedKeySetNull; + else if("setdefault".equals(rule)) action=importedKeySetDefault; + tuple[col]=Integer.toString(action).getBytes(); + foundRule=true; + } + } + } while((hasMore=rs.next()) && fKeyName.equals(rs.getString(3))); + + if(foundRule) { + tuple[2]=rs.getBytes(2); //PKTABLE_NAME + tuple[6]=rs.getBytes(1); //FKTABLE_NAME + + // Parse the tgargs data + StringBuffer fkeyColumns=new StringBuffer(); + StringBuffer pkeyColumns=new StringBuffer(); + int numColumns=(rs.getInt(7) >> 1) - 2; + String s=rs.getString(8); + int pos=s.lastIndexOf("\\000"); + for(int c=0;c-1) { + int pos2=s.lastIndexOf("\\000", pos-1); + if(pos2>-1) { + if(fkeyColumns.length()>0) fkeyColumns.insert(0, ','); + fkeyColumns.insert(0, s.substring(pos2+4, pos)); //FKCOLUMN_NAME + pos=s.lastIndexOf("\\000", pos2-1); + if(pos>-1) { + if(pkeyColumns.length()>0) pkeyColumns.insert(0, ','); + pkeyColumns.insert(0, s.substring(pos+4, pos2)); //PKCOLUMN_NAME + } } } } + tuple[7]=fkeyColumns.toString().getBytes(); //FKCOLUMN_NAME + tuple[3]=pkeyColumns.toString().getBytes(); //PKCOLUMN_NAME + + tuple[8]=Integer.toString(seq++).getBytes(); //KEY_SEQ + tuple[11]=fKeyName.getBytes(); //FK_NAME + tuple[12]=rs.getBytes(4); //PK_NAME + + // DEFERRABILITY + int deferrability=importedKeyNotDeferrable; + boolean deferrable=rs.getBoolean(5); + boolean initiallyDeferred=rs.getBoolean(6); + if(deferrable) { + if(initiallyDeferred) + deferrability=importedKeyInitiallyDeferred; + else + deferrability=importedKeyInitiallyImmediate; + } + tuple[13]=Integer.toString(deferrability).getBytes(); + + tuples.addElement(tuple); } - } + } while(hasMore); } - // UPDATE_RULE - String rule=keyRelation.getString(2); - int action=importedKeyNoAction; - if("cascade".equals(rule)) action=importedKeyCascade; - else if("setnull".equals(rule)) action=importedKeySetNull; - else if("setdefault".equals(rule)) action=importedKeySetDefault; - tuple[9]=Integer.toString(action).getBytes(); - - // DELETE_RULE - rule=keyRelation.getString(3); - action=importedKeyNoAction; - if("cascade".equals(rule)) action=importedKeyCascade; - else if("setnull".equals(rule)) action=importedKeySetNull; - else if("setdefault".equals(rule)) action=importedKeySetDefault; - tuple[10]=Integer.toString(action).getBytes(); - - // DEFERRABILITY - int deferrability=importedKeyNotDeferrable; - boolean deferrable=keyRelation.getBoolean(4); - if(deferrable) - { - if(keyRelation.getBoolean(5)) - deferrability=importedKeyInitiallyDeferred; - else - deferrability=importedKeyInitiallyImmediate; - } - tuple[13]=Integer.toString(deferrability).getBytes(); - for (int i=0; i< 14; i++){ - tuples.addElement(tuple[i]); - } + return new ResultSet(connection, f, tuples, "OK", 1); } /** @@ -2393,51 +2438,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public java.sql.ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException { - Field f[]=new Field[14]; - - f[0]=new Field(connection, "PKTABLE_CAT", iVarcharOid, 32); - f[1]=new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32); - f[2]=new Field(connection, "PKTABLE_NAME", iVarcharOid, 32); - f[3]=new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32); - f[4]=new Field(connection, "FKTABLE_CAT", iVarcharOid, 32); - f[5]=new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32); - f[6]=new Field(connection, "FKTABLE_NAME", iVarcharOid, 32); - f[7]=new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32); - f[8]=new Field(connection, "KEY_SEQ", iInt2Oid, 2); - f[9]=new Field(connection, "UPDATE_RULE", iInt2Oid, 2); - f[10]=new Field(connection, "DELETE_RULE", iInt2Oid, 2); - f[11]=new Field(connection, "FK_NAME", iVarcharOid, 32); - f[12]=new Field(connection, "PK_NAME", iVarcharOid, 32); - f[13]=new Field(connection, "DEFERRABILITY", iInt2Oid, 2); - - java.sql.ResultSet rs = connection.ExecSQL("SELECT a.tgargs," - + "substring(a.proname from 9 for (char_length(a.proname)-12))," - + "substring(b.proname from 9 for (char_length(b.proname)-12))," - + "a.tgdeferrable," - + "a.tginitdeferred " - + "FROM " - + "(SELECT t.tgargs, t.tgconstrname, p.proname, t.tgdeferrable," - + "t.tginitdeferred " - + "FROM pg_class as c, pg_proc as p, pg_trigger as t " - + "WHERE c.relfilenode=t.tgrelid AND t.tgfoid = p.oid " - + "AND p.proname LIKE 'RI_FKey_%_upd') as a," - + "(SELECT t.tgconstrname, p.proname " - + "FROM pg_class as c, pg_proc as p, pg_trigger as t " - + "WHERE c.relfilenode=t.tgrelid AND t.tgfoid = p.oid " - + "AND p.proname LIKE 'RI_FKey_%_del') as b," - + "(SELECT t.tgconstrname FROM pg_class as c, pg_trigger as t " - + "WHERE c.relname like '"+table+"' AND c.relfilenode=t.tgrelid) as c " - + "WHERE a.tgconstrname=b.tgconstrname AND a.tgconstrname=c.tgconstrname" - ); - Vector tuples = new Vector(); - - while (rs.next()) - { - - parseConstraint(rs,tuples); - } - - return new ResultSet(connection, f, tuples, "OK", 1); + return getImportedExportedKeys(catalog, schema, null, table); } /** @@ -2495,47 +2496,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public java.sql.ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException { - Field f[] = new Field[14]; - - f[0] = new Field(connection, "PKTABLE_CAT", iVarcharOid, 32); - f[1] = new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32); - f[2] = new Field(connection, "PKTABLE_NAME", iVarcharOid, 32); - f[3] = new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32); - f[4] = new Field(connection, "FKTABLE_CAT", iVarcharOid, 32); - f[5] = new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32); - f[6] = new Field(connection, "FKTABLE_NAME", iVarcharOid, 32); - f[7] = new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32); - f[8] = new Field(connection, "KEY_SEQ", iInt2Oid, 2); - f[9] = new Field(connection, "UPDATE_RULE", iInt2Oid, 2); - f[10] = new Field(connection, "DELETE_RULE", iInt2Oid, 2); - f[11] = new Field(connection, "FK_NAME", iVarcharOid, 32); - f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32); - f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2); - - java.sql.ResultSet rs = connection.ExecSQL("SELECT a.tgargs," - + "substring(a.proname from 9 for (char_length(a.proname)-12))," - + "substring(b.proname from 9 for (char_length(b.proname)-12))," - + "a.tgdeferrable," - + "a.tginitdeferred " - + "FROM " - + "(SELECT t.tgargs, t.tgconstrname, p.proname," - + "t.tgdeferrable, t.tginitdeferred " - + "FROM pg_class as c, pg_proc as p, pg_trigger as t " - + "WHERE c.relname like '"+table+"' AND c.relfilenode=t.tgrelid " - + "AND t.tgfoid = p.oid AND p.proname LIKE 'RI_FKey_%_upd') as a, " - + "(SELECT t.tgconstrname, p.proname " - + "FROM pg_class as c, pg_proc as p, pg_trigger as t " - + "WHERE c.relname like '"+table+"' AND c.relfilenode=t.tgrelid " - + "AND t.tgfoid = p.oid AND p.proname LIKE 'RI_FKey_%_del') as b " - + "WHERE a.tgconstrname=b.tgconstrname"); - Vector tuples = new Vector(); - - while (rs.next()) - { - parseConstraint(rs,tuples); - } - - return new ResultSet(connection, f, tuples, "OK", 1); + return getImportedExportedKeys(catalog, schema, table, null); } /** @@ -2596,7 +2557,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public java.sql.ResultSet getCrossReference(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException { - throw org.postgresql.Driver.notImplemented(); + return getImportedExportedKeys(primaryCatalog, primarySchema, primaryTable, foreignTable); } /** diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java b/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java index f546342c02..431823631f 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java @@ -15,7 +15,7 @@ import org.postgresql.util.PSQLException; /** * This class provides information about the database as a whole. * - * $Id: DatabaseMetaData.java,v 1.43 2001/11/02 23:51:18 davec Exp $ + * $Id: DatabaseMetaData.java,v 1.44 2001/11/09 02:57:50 davec Exp $ * *

Many of the methods here return lists of information in ResultSets. You * can use the normal ResultSet methods such as getString and getInt to @@ -2400,71 +2400,118 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData ); } - private byte[][] parseConstraint(java.sql.ResultSet keyRelation) throws SQLException + private java.sql.ResultSet getImportedExportedKeys(String catalog, String schema, String primaryTable, String foreignTable) throws SQLException { - byte tuple[][]=new byte[14][0]; - for (int k = 0;k < 14;k++) - tuple[k] = null; - String s=keyRelation.getString(1); - int pos=s.indexOf("\\000"); - if(pos>-1) - { - tuple[11]=s.substring(0,pos).getBytes();; // FK_NAME - int pos2=s.indexOf("\\000", pos+1); - if(pos2>-1) - { - tuple[2]=s.substring(pos+4, pos2).getBytes();; // PKTABLE_NAME - pos=s.indexOf("\\000", pos2+1); - if(pos>-1) - { - tuple[6]=s.substring(pos2+4, pos).getBytes();; // FKTABLE_NAME - pos=s.indexOf("\\000", pos+1); // Ignore MATCH type - if(pos>-1) - { - pos2=s.indexOf("\\000",pos+1); - if(pos2>-1) - { - tuple[3]=s.substring(pos+4, pos2).getBytes();; // PKCOLUMN_NAME - pos=s.indexOf("\\000", pos2+1); - if(pos>-1) - { - tuple[7]=s.substring(pos2+4, pos).getBytes(); //FKCOLUMN_NAME - } - } - } - } - } - } + Field f[]=new Field[14]; - // UPDATE_RULE - String rule=keyRelation.getString(2); - int action=importedKeyNoAction; - if("cascade".equals(rule)) action=importedKeyCascade; - else if("setnull".equals(rule)) action=importedKeySetNull; - else if("setdefault".equals(rule)) action=importedKeySetDefault; - tuple[9]=Integer.toString(action).getBytes(); + f[0]=new Field(connection, "PKTABLE_CAT", iVarcharOid, 32); + f[1]=new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32); + f[2]=new Field(connection, "PKTABLE_NAME", iVarcharOid, 32); + f[3]=new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32); + f[4]=new Field(connection, "FKTABLE_CAT", iVarcharOid, 32); + f[5]=new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32); + f[6]=new Field(connection, "FKTABLE_NAME", iVarcharOid, 32); + f[7]=new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32); + f[8]=new Field(connection, "KEY_SEQ", iInt2Oid, 2); + f[9]=new Field(connection, "UPDATE_RULE", iInt2Oid, 2); + f[10]=new Field(connection, "DELETE_RULE", iInt2Oid, 2); + f[11]=new Field(connection, "FK_NAME", iVarcharOid, 32); + f[12]=new Field(connection, "PK_NAME", iVarcharOid, 32); + f[13]=new Field(connection, "DEFERRABILITY", iInt2Oid, 2); - // DELETE_RULE - rule=keyRelation.getString(3); - action=importedKeyNoAction; - if("cascade".equals(rule)) action=importedKeyCascade; - else if("setnull".equals(rule)) action=importedKeySetNull; - else if("setdefault".equals(rule)) action=importedKeySetDefault; - tuple[10]=Integer.toString(action).getBytes(); - // DEFERRABILITY - int deferrability=importedKeyNotDeferrable; - boolean deferrable=keyRelation.getBoolean(4); - if(deferrable) - { - if(keyRelation.getBoolean(5)) - deferrability=importedKeyInitiallyDeferred; - else - deferrability=importedKeyInitiallyImmediate; - } - tuple[13]=Integer.toString(deferrability).getBytes(); + java.sql.ResultSet rs = connection.ExecSQL("SELECT c.relname,c2.relname," + + "t.tgconstrname,ic.relname," + + "t.tgdeferrable,t.tginitdeferred," + + "t.tgnargs,t.tgargs,p.proname " + + "FROM pg_trigger t,pg_class c,pg_class c2," + + "pg_class ic,pg_proc p, pg_index i " + + "WHERE t.tgrelid=c.oid AND t.tgconstrrelid=c2.oid " + + "AND t.tgfoid=p.oid AND tgisconstraint " + + ((primaryTable!=null) ? "AND c2.relname='"+primaryTable+"' " : "") + + ((foreignTable!=null) ? "AND c.relname='"+foreignTable+"' " : "") + + "AND i.indrelid=c.oid " + + "AND i.indexrelid=ic.oid AND i.indisprimary " + + "ORDER BY c.relname,c2.relname" + ); + Vector tuples = new Vector(); + short seq=0; + if(rs.next()) { + boolean hasMore; + do { + byte tuple[][]=new byte[14][0]; + for (int k = 0;k < 14;k++) + tuple[k] = null; - return tuple; - } + String fKeyName=rs.getString(3); + boolean foundRule=false; + do { + String proname=rs.getString(9); + if(proname!=null && proname.startsWith("RI_FKey_")) { + int col=-1; + if(proname.endsWith("_upd")) col=9; // UPDATE_RULE + else if(proname.endsWith("_del")) col=10; // DELETE_RULE + if(col>-1) { + String rule=proname.substring(8, proname.length()-4); + int action=importedKeyNoAction; + if("cascade".equals(rule)) action=importedKeyCascade; + else if("setnull".equals(rule)) action=importedKeySetNull; + else if("setdefault".equals(rule)) action=importedKeySetDefault; + tuple[col]=Integer.toString(action).getBytes(); + foundRule=true; + } + } + } while((hasMore=rs.next()) && fKeyName.equals(rs.getString(3))); + + if(foundRule) { + tuple[2]=rs.getBytes(2); //PKTABLE_NAME + tuple[6]=rs.getBytes(1); //FKTABLE_NAME + + // Parse the tgargs data + StringBuffer fkeyColumns=new StringBuffer(); + StringBuffer pkeyColumns=new StringBuffer(); + int numColumns=(rs.getInt(7) >> 1) - 2; + String s=rs.getString(8); + int pos=s.lastIndexOf("\\000"); + for(int c=0;c-1) { + int pos2=s.lastIndexOf("\\000", pos-1); + if(pos2>-1) { + if(fkeyColumns.length()>0) fkeyColumns.insert(0, ','); + fkeyColumns.insert(0, s.substring(pos2+4, pos)); //FKCOLUMN_NAME + pos=s.lastIndexOf("\\000", pos2-1); + if(pos>-1) { + if(pkeyColumns.length()>0) pkeyColumns.insert(0, ','); + pkeyColumns.insert(0, s.substring(pos+4, pos2)); //PKCOLUMN_NAME + } + } + } + } + tuple[7]=fkeyColumns.toString().getBytes(); //FKCOLUMN_NAME + tuple[3]=pkeyColumns.toString().getBytes(); //PKCOLUMN_NAME + + tuple[8]=Integer.toString(seq++).getBytes(); //KEY_SEQ + tuple[11]=fKeyName.getBytes(); //FK_NAME + tuple[12]=rs.getBytes(4); //PK_NAME + + // DEFERRABILITY + int deferrability=importedKeyNotDeferrable; + boolean deferrable=rs.getBoolean(5); + boolean initiallyDeferred=rs.getBoolean(6); + if(deferrable) { + if(initiallyDeferred) + deferrability=importedKeyInitiallyDeferred; + else + deferrability=importedKeyInitiallyImmediate; + } + tuple[13]=Integer.toString(deferrability).getBytes(); + + tuples.addElement(tuple); + } + } while(hasMore); + } + + return new ResultSet(connection, f, tuples, "OK", 1); + } /** * Get a description of the primary key columns that are @@ -2519,50 +2566,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public java.sql.ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException { - Field f[]=new Field[14]; - - f[0]=new Field(connection, "PKTABLE_CAT", iVarcharOid, 32); - f[1]=new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32); - f[2]=new Field(connection, "PKTABLE_NAME", iVarcharOid, 32); - f[3]=new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32); - f[4]=new Field(connection, "FKTABLE_CAT", iVarcharOid, 32); - f[5]=new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32); - f[6]=new Field(connection, "FKTABLE_NAME", iVarcharOid, 32); - f[7]=new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32); - f[8]=new Field(connection, "KEY_SEQ", iInt2Oid, 2); - f[9]=new Field(connection, "UPDATE_RULE", iInt2Oid, 2); - f[10]=new Field(connection, "DELETE_RULE", iInt2Oid, 2); - f[11]=new Field(connection, "FK_NAME", iVarcharOid, 32); - f[12]=new Field(connection, "PK_NAME", iVarcharOid, 32); - f[13]=new Field(connection, "DEFERRABILITY", iInt2Oid, 2); - - java.sql.ResultSet rs = connection.ExecSQL("SELECT a.tgargs," - + "substring(a.proname from 9 for (char_length(a.proname)-12))," - + "substring(b.proname from 9 for (char_length(b.proname)-12))," - + "a.tgdeferrable," - + "a.tginitdeferred " - + "FROM " - + "(SELECT t.tgargs, t.tgconstrname, p.proname, t.tgdeferrable," - + "t.tginitdeferred " - + "FROM pg_class as c, pg_proc as p, pg_trigger as t " - + "WHERE c.relfilenode=t.tgrelid AND t.tgfoid = p.oid " - + "AND p.proname LIKE 'RI_FKey_%_upd') as a," - + "(SELECT t.tgconstrname, p.proname " - + "FROM pg_class as c, pg_proc as p, pg_trigger as t " - + "WHERE c.relfilenode=t.tgrelid AND t.tgfoid = p.oid " - + "AND p.proname LIKE 'RI_FKey_%_del') as b," - + "(SELECT t.tgconstrname FROM pg_class as c, pg_trigger as t " - + "WHERE c.relname like '"+table+"' AND c.relfilenode=t.tgrelid) as c " - + "WHERE a.tgconstrname=b.tgconstrname AND a.tgconstrname=c.tgconstrname" - ); - Vector tuples = new Vector(); - - while (rs.next()) - { - tuples.add(parseConstraint(rs)); - } - - return new ResultSet(connection, f, tuples, "OK", 1); + return getImportedExportedKeys(catalog, schema, null, table); } /** @@ -2620,48 +2624,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public java.sql.ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException { - Field f[] = new Field[14]; - - f[0] = new Field(connection, "PKTABLE_CAT", iVarcharOid, 32); - f[1] = new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32); - f[2] = new Field(connection, "PKTABLE_NAME", iVarcharOid, 32); - f[3] = new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32); - f[4] = new Field(connection, "FKTABLE_CAT", iVarcharOid, 32); - f[5] = new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32); - f[6] = new Field(connection, "FKTABLE_NAME", iVarcharOid, 32); - f[7] = new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32); - f[8] = new Field(connection, "KEY_SEQ", iInt2Oid, 2); - f[9] = new Field(connection, "UPDATE_RULE", iInt2Oid, 2); - f[10] = new Field(connection, "DELETE_RULE", iInt2Oid, 2); - f[11] = new Field(connection, "FK_NAME", iVarcharOid, 32); - f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32); - f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2); - - java.sql.ResultSet rs = connection.ExecSQL("SELECT a.tgargs," - + "substring(a.proname from 9 for (char_length(a.proname)-12))," - + "substring(b.proname from 9 for (char_length(b.proname)-12))," - + "a.tgdeferrable," - + "a.tginitdeferred " - + "FROM " - + "(SELECT t.tgargs, t.tgconstrname, p.proname," - + "t.tgdeferrable, t.tginitdeferred " - + "FROM pg_class as c, pg_proc as p, pg_trigger as t " - + "WHERE c.relname like '"+table+"' AND c.relfilenode=t.tgrelid " - + "AND t.tgfoid = p.oid AND p.proname LIKE 'RI_FKey_%_upd') as a, " - + "(SELECT t.tgconstrname, p.proname " - + "FROM pg_class as c, pg_proc as p, pg_trigger as t " - + "WHERE c.relname like '"+table+"' AND c.relfilenode=t.tgrelid " - + "AND t.tgfoid = p.oid AND p.proname LIKE 'RI_FKey_%_del') as b " - + "WHERE a.tgconstrname=b.tgconstrname" - ); - Vector tuples = new Vector(); - - while (rs.next()) - { - tuples.add(parseConstraint(rs)); - } - - return new ResultSet(connection, f, tuples, "OK", 1); + return getImportedExportedKeys(catalog, schema, table, null); } /** @@ -2722,7 +2685,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public java.sql.ResultSet getCrossReference(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException { - throw org.postgresql.Driver.notImplemented(); + return getImportedExportedKeys(primaryCatalog, primarySchema, primaryTable, foreignTable); } /**