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
> > 
> > [EMAIL PROTECTED]
> > 
> > 
> > ------------------------------------------------------------------------
> > 
> > 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 <[EMAIL PROTECTED]>
> > -           // 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 <[EMAIL PROTECTED]>
> > -           // 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 [EMAIL PROTECTED])
> > 
> 

---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to