Re: DatabaseMetaData.getImported/ExportedKeys() patch

From: Justin Clift <justin(at)postgresql(dot)org>
To: Jason Davies <jason(at)netspade(dot)com>
Cc: Barry Lind <barry(at)xythos(dot)com>, pgsql-jdbc(at)postgresql(dot)org
Subject: Re: DatabaseMetaData.getImported/ExportedKeys() patch
Date: 2001-10-27 05:14:48
Message-ID: 3BDA42C8.916C39C7@postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Hi all,

I'm not sure, but these are the methods which allow an external
application (i.e. an ERD tool) to query a database and know the
relationships between the tables aren't they?

If so, this is a very important feature which, once implemented
properly, will allow Java tools and programs (for example the ERD tool
"DbDesigner", etc) to work correctly with PostgreSQL.

Given that these are the methods I'm thinking about, I hope this patch
is completed properly and accepted into the JDBC driver asap, even
though we are in beta. We have plenty of time to ensure things work
properly before final release.

:-)

Regards and best wishes,

Justin Clift

Jason Davies wrote:
>
> On Fri, Oct 26, 2001 at 09:52:11AM -0700, Barry Lind wrote:
> > Jason,
> >
> > Can you explain what this patch is attempting to fix? Given that we are
> > in beta with 7.2, I want to fully understand the problem here before
> > applying this patch. (Especially given that the diff is pretty large and
> > not a one or two line change).
>
> I guess "fix" is slightly misleading. This patch implements DatabaseMetaData.getExportedKeys() which was previously not implemented, and provides a better implementation of DatabaseMetaData.getImportedKeys() which was previously half-implemented.
>
> The methods are identical for both jdbc1 and jdbc2 so that's why the diff is quite large. Perhaps identical code should be put into a single class and have the code which differs in jdbc1 and jdbc2 in subclasses?
>
> > Also what testing have you done on this? (When you ask us to 'check
> > that it works', it doesn't give me a high level of confidence that this
> > is well tested).
>
> :-) I have tested it but only with 7.1.3 at the moment. What I meant to say is please check in case something major has been changed in 7.2. Also if the queries I'm using can be optimized in any way that would be great.
>
> At the moment a value for PK_NAME (primary key name) is not returned but the main part is implemented.
>
> Sorry for the lack of info, I'll try and be more helpful next time :)
>
> Jason Davies
>
> > thanks,
> > --Barry
> >
> >
> > Jason Davies wrote:
> >
> > > Hi,
> > >
> > > Here is a diff for DatabaseMetaData.getImportedKeys() and
> > > DatabaseMetaData.getExportedKeys(). Please check that it works :)
> > >
> > > Thanks,
> > > Jason Davies
> > >
> > > jason(at)netspade(dot)com
> > >
> > >
> > > ------------------------------------------------------------------------
> > >
> > > Index: jdbc1/DatabaseMetaData.java
> > > ===================================================================
> > > RCS file: /projects/cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java,v
> > > retrieving revision 1.35
> > > diff -c -r1.35 DatabaseMetaData.java
> > > *** jdbc1/DatabaseMetaData.java 2001/10/25 05:59:59 1.35
> > > --- jdbc1/DatabaseMetaData.java 2001/10/26 01:21:02
> > > ***************
> > > *** 2260,2345 ****
> > > );
> > > }
> > >
> > > ! private void importLoop(Vector tuples, java.sql.ResultSet keyRelation) throws SQLException
> > > ! {
> > > ! String s, s2;
> > > ! String origTable = null, primTable = new String(""), schema;
> > > ! int i;
> > > ! Vector v = new Vector();
> > > !
> > > ! s = keyRelation.getString(1);
> > > ! s2 = s;
> > > ! //System.out.println(s);
> > > !
> > > ! for (i = 0;;i++)
> > > ! {
> > > ! s = s.substring(s.indexOf("\\000") + 4);
> > > ! if (s.compareTo("") == 0)
> > > ! {
> > > ! //System.out.println();
> > > ! break;
> > > ! }
> > > ! s2 = s.substring(0, s.indexOf("\\000"));
> > > ! switch (i)
> > > ! {
> > > ! case 0:
> > > ! origTable = s2;
> > > ! break;
> > > ! case 1:
> > > ! primTable = s2;
> > > ! break;
> > > ! case 2:
> > > ! schema = s2;
> > > ! break;
> > > ! default:
> > > ! v.addElement(s2);
> > > ! }
> > > ! }
> > > !
> > > ! java.sql.ResultSet rstmp = connection.ExecSQL("select * from " + origTable + " where 1=0");
> > > ! java.sql.ResultSetMetaData origCols = rstmp.getMetaData();
> > > !
> > > ! String stmp;
> > > ! // Vector tuples=new Vector();
> > > ! byte tuple[][];
> > > !
> > > ! // the foreign keys are only on even positions in the Vector.
> > > ! for (i = 0;i < v.size();i += 2)
> > > {
> > > ! stmp = (String)v.elementAt(i);
> > > !
> > > ! for (int j = 1;j <= origCols.getColumnCount();j++)
> > > {
> > > ! if (stmp.compareTo(origCols.getColumnName(j)) == 0)
> > > {
> > > ! tuple = new byte[14][0];
> > > !
> > > ! for (int k = 0;k < 14;k++)
> > > ! tuple[k] = null;
> > > !
> > > ! //PKTABLE_NAME
> > > ! tuple[2] = primTable.getBytes();
> > > ! //PKTABLE_COLUMN
> > > ! stmp = (String)v.elementAt(i + 1);
> > > ! tuple[3] = stmp.getBytes();
> > > ! //FKTABLE_NAME
> > > ! tuple[6] = origTable.getBytes();
> > > ! //FKCOLUMN_NAME
> > > ! tuple[7] = origCols.getColumnName(j).getBytes();
> > > ! //KEY_SEQ
> > > ! tuple[8] = Integer.toString(j).getBytes();
> > > !
> > > ! tuples.addElement(tuple);
> > > !
> > > ! //System.out.println(origCols.getColumnName(j)+
> > > ! //": "+j+" -> "+primTable+": "+
> > > ! //(String)v.elementAt(i+1));
> > > ! break;
> > > }
> > > }
> > > }
> > >
> > > ! //return tuples;
> > > }
> > >
> > > /**
> > > --- 2260,2330 ----
> > > );
> > > }
> > >
> > > ! private byte[][] parseConstraint(java.sql.ResultSet keyRelation) 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
> > > }
> > > + }
> > > }
> > > + }
> > > }
> > > + }
> > > +
> > > + // 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();
> > >
> > > ! return tuple;
> > > }
> > >
> > > /**
> > > ***************
> > > *** 2395,2405 ****
> > > */
> > > public java.sql.ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException
> > > {
> > > - // Added by Ola Sundell <ola(at)miranda(dot)org>
> > > - // FIXME: error checking galore!
> > > - java.sql.ResultSet rsret;
> > > Field f[] = new Field[14];
> > > - byte tuple[][];
> > >
> > > f[0] = new Field(connection, "PKTABLE_CAT", iVarcharOid, 32);
> > > f[1] = new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32);
> > > --- 2380,2386 ----
> > > ***************
> > > *** 2416,2434 ****
> > > f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32);
> > > f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2);
> > >
> > > ! java.sql.ResultSet rs = connection.ExecSQL("select t.tgargs " +
> > > ! "from pg_class as c, pg_trigger as t " +
> > > ! "where c.relname like '" + table + "' and c.relfilenode=t.tgrelid");
> > > Vector tuples = new Vector();
> > >
> > > while (rs.next())
> > > {
> > > ! importLoop(tuples, rs);
> > > }
> > >
> > > ! rsret = new ResultSet(connection, f, tuples, "OK", 1);
> > > !
> > > ! return rsret;
> > > }
> > >
> > > /**
> > > --- 2397,2429 ----
> > > 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);
> > > }
> > >
> > > /**
> > > ***************
> > > *** 2486,2492 ****
> > > */
> > > public java.sql.ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException
> > > {
> > > ! throw org.postgresql.Driver.notImplemented();
> > > }
> > >
> > > /**
> > > --- 2481,2527 ----
> > > */
> > > 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);
> > > }
> > >
> > > /**
> > > Index: jdbc2/DatabaseMetaData.java
> > > ===================================================================
> > > RCS file: /projects/cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java,v
> > > retrieving revision 1.40
> > > diff -c -r1.40 DatabaseMetaData.java
> > > *** jdbc2/DatabaseMetaData.java 2001/10/25 05:59:59 1.40
> > > --- jdbc2/DatabaseMetaData.java 2001/10/26 01:21:10
> > > ***************
> > > *** 2273,2359 ****
> > > );
> > > }
> > >
> > > ! private Vector importLoop(java.sql.ResultSet keyRelation) throws SQLException
> > > ! {
> > > ! String s, s2;
> > > ! String origTable = null, primTable = new String(""), schema;
> > > ! int i;
> > > ! Vector v;
> > > !
> > > ! s = keyRelation.getString(1);
> > > ! s2 = s;
> > > ! // System.out.println(s);
> > > ! v = new Vector();
> > > ! for (i = 0;;i++)
> > > ! {
> > > ! s = s.substring(s.indexOf("\\000") + 4);
> > > ! if (s.compareTo("") == 0)
> > > ! {
> > > ! //System.out.println();
> > > ! break;
> > > ! }
> > > ! s2 = s.substring(0, s.indexOf("\\000"));
> > > ! switch (i)
> > > ! {
> > > ! case 0:
> > > ! origTable = s2;
> > > ! break;
> > > ! case 1:
> > > ! primTable = s2;
> > > ! break;
> > > ! case 2:
> > > ! schema = s2;
> > > ! break;
> > > ! default:
> > > ! v.add(s2);
> > > ! }
> > > ! }
> > > !
> > > ! java.sql.ResultSet rstmp = connection.ExecSQL("select * from " + origTable + " where 1=0");
> > > ! java.sql.ResultSetMetaData origCols = rstmp.getMetaData();
> > > !
> > > ! String stmp;
> > > ! Vector tuples = new Vector();
> > > ! byte tuple[][];
> > > !
> > > ! // the foreign keys are only on even positions in the Vector.
> > > ! for (i = 0;i < v.size();i += 2)
> > > {
> > > ! stmp = (String)v.elementAt(i);
> > > !
> > > ! for (int j = 1;j <= origCols.getColumnCount();j++)
> > > {
> > > ! if (stmp.compareTo(origCols.getColumnName(j)) == 0)
> > > {
> > > ! tuple = new byte[14][0];
> > > !
> > > ! for (int k = 0;k < 14;k++)
> > > ! tuple[k] = null;
> > > !
> > > ! //PKTABLE_NAME
> > > ! tuple[2] = primTable.getBytes();
> > > ! //PKTABLE_COLUMN
> > > ! stmp = (String)v.elementAt(i + 1);
> > > ! tuple[3] = stmp.getBytes();
> > > ! //FKTABLE_NAME
> > > ! tuple[6] = origTable.getBytes();
> > > ! //FKCOLUMN_NAME
> > > ! tuple[7] = origCols.getColumnName(j).getBytes();
> > > ! //KEY_SEQ
> > > ! tuple[8] = Integer.toString(j).getBytes();
> > > !
> > > ! tuples.add(tuple);
> > > ! /*
> > > ! System.out.println(origCols.getColumnName(j)+
> > > ! ": "+j+" -> "+primTable+": "+
> > > ! (String)v.elementAt(i+1));
> > > ! */
> > > ! break;
> > > }
> > > }
> > > }
> > >
> > > ! return tuples;
> > > }
> > >
> > > /**
> > > --- 2273,2343 ----
> > > );
> > > }
> > >
> > > ! private byte[][] parseConstraint(java.sql.ResultSet keyRelation) 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
> > > }
> > > + }
> > > }
> > > + }
> > > }
> > > + }
> > > +
> > > + // 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();
> > >
> > > ! return tuple;
> > > }
> > >
> > > /**
> > > ***************
> > > *** 2409,2419 ****
> > > */
> > > public java.sql.ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException
> > > {
> > > - // Added by Ola Sundell <ola(at)miranda(dot)org>
> > > - // FIXME: error checking galore!
> > > - java.sql.ResultSet rsret;
> > > Field f[] = new Field[14];
> > > - byte tuple[][];
> > >
> > > f[0] = new Field(connection, "PKTABLE_CAT", iVarcharOid, 32);
> > > f[1] = new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32);
> > > --- 2393,2399 ----
> > > ***************
> > > *** 2430,2448 ****
> > > f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32);
> > > f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2);
> > >
> > > ! java.sql.ResultSet rs = connection.ExecSQL("select t.tgargs " +
> > > ! "from pg_class as c, pg_trigger as t " +
> > > ! "where c.relname like '" + table + "' and c.relfilenode=t.tgrelid");
> > > Vector tuples = new Vector();
> > >
> > > while (rs.next())
> > > {
> > > ! tuples.addAll(importLoop(rs));
> > > }
> > >
> > > ! rsret = new ResultSet(connection, f, tuples, "OK", 1);
> > > !
> > > ! return rsret;
> > > }
> > >
> > > /**
> > > --- 2410,2442 ----
> > > 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);
> > > }
> > >
> > > /**
> > > ***************
> > > *** 2500,2506 ****
> > > */
> > > public java.sql.ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException
> > > {
> > > ! throw org.postgresql.Driver.notImplemented();
> > > }
> > >
> > > /**
> > > --- 2494,2540 ----
> > > */
> > > 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);
> > > }
> > >
> > > /**
> > >
> > >
> > > ------------------------------------------------------------------------
> > >
> > >
> > > ---------------------------(end of broadcast)---------------------------
> > > TIP 2: you can get off all lists at once with the unregister command
> > > (send "unregister YourEmailAddressHere" to majordomo(at)postgresql(dot)org)
> > >
> >
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo(at)postgresql(dot)org

--
"My grandfather once told me that there are two kinds of people: those
who work and those who take the credit. He told me to try to be in the
first group; there was less competition there."
- Indira Gandhi

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Gunnar Rønning 2001-10-27 07:59:22 Re: j2ee compatiable jdbc driver on jdbc.postgresql.org?
Previous Message Craig Lawton 2001-10-27 03:34:37 Error: ClassNotFoundException