Re: DatabaseMetaData.getImported/ExportedKeys() patch

From: Barry Lind <barry(at)xythos(dot)com>
To: Jason Davies <jason(at)netspade(dot)com>
Cc: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: DatabaseMetaData.getImported/ExportedKeys() patch
Date: 2001-10-26 16:52:11
Message-ID: 3BD994BB.1050302@xythos.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

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).

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).

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)
>

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Barry Lind 2001-10-26 17:27:00 Re: j2ee compatiable jdbc driver on jdbc.postgresql.org?
Previous Message Ned Wolpert 2001-10-26 16:13:32 Re: j2ee compatiable jdbc driver on jdbc.postgresql.org?