@ -15,7 +15,7 @@ import org.postgresql.util.PSQLException;
/ *
* This class provides information about the database as a whole .
*
* $Id : DatabaseMetaData . java , v 1 . 46 2001 / 11 / 19 22 : 33 : 39 momjian Exp $
* $Id : DatabaseMetaData . java , v 1 . 47 2001 / 11 / 19 23 : 16 : 46 momjian Exp $
*
* < p > Many of the methods here return lists of information in ResultSets . You
* can use the normal ResultSet methods such as getString and getInt to
@ -88,7 +88,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
public String getURL ( ) throws SQLException
{
String url = connection . getURL ( ) ;
Driver . debug ( "getURL " + url ) ;
Driver . debug ( "getURL " + url ) ;
return url ;
}
@ -101,7 +101,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
public String getUserName ( ) throws SQLException
{
String userName = connection . getUserName ( ) ;
Driver . debug ( "getUserName " + userName ) ;
Driver . debug ( "getUserName " + userName ) ;
return userName ;
}
@ -114,7 +114,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
public boolean isReadOnly ( ) throws SQLException
{
boolean isReadOnly = connection . isReadOnly ( ) ;
Driver . debug ( "isReadOnly " + isReadOnly ) ;
Driver . debug ( "isReadOnly " + isReadOnly ) ;
return isReadOnly ;
}
@ -164,7 +164,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
public boolean nullsAreSortedAtEnd ( ) throws SQLException
{
boolean nullsAreSortedAtEnd = ! connection . haveMinimumServerVersion ( "7.2" ) ;
Driver . debug ( "nullsAreSortedAtEnd " + nullsAreSortedAtEnd ) ;
Driver . debug ( "nullsAreSortedAtEnd " + nullsAreSortedAtEnd ) ;
return nullsAreSortedAtEnd ;
}
@ -209,7 +209,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
}
/ *
* What is the version string of this JDBC driver ? Again , this is
* What is the version string of this JDBC driver ? Again , this is
* static .
*
* @return the JDBC driver name .
@ -218,7 +218,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
public String getDriverVersion ( ) throws SQLException
{
String driverVersion = connection . this_driver . getVersion ( ) ;
Driver . debug ( "getDriverVersion " + driverVersion ) ;
Driver . debug ( "getDriverVersion " + driverVersion ) ;
return driverVersion ;
}
@ -230,7 +230,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
public int getDriverMajorVersion ( )
{
int majorVersion = connection . this_driver . getMajorVersion ( ) ;
Driver . debug ( "getMajorVersion " + majorVersion ) ;
Driver . debug ( "getMajorVersion " + majorVersion ) ;
return majorVersion ;
}
@ -242,12 +242,12 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
public int getDriverMinorVersion ( )
{
int minorVersion = connection . this_driver . getMinorVersion ( ) ;
Driver . debug ( "getMinorVersion " + minorVersion ) ;
Driver . debug ( "getMinorVersion " + minorVersion ) ;
return minorVersion ;
}
/ *
* Does the database store tables in a local file ? No - it
* Does the database store tables in a local file ? No - it
* stores them in a file on the server .
*
* @return true if so
@ -298,7 +298,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
* /
public boolean storesUpperCaseIdentifiers ( ) throws SQLException
{
Driver . debug ( "storesUpperCaseIdentifiers " + false ) ;
Driver . debug ( "storesUpperCaseIdentifiers " + false ) ;
return false ;
}
@ -622,13 +622,13 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
public boolean supportsGroupByUnrelated ( ) throws SQLException
{
boolean supportsGroupByUnrelated = connection . haveMinimumServerVersion ( "6.4" ) ;
Driver . debug ( "supportsGroupByUnrelated " + supportsGroupByUnrelated ) ;
Driver . debug ( "supportsGroupByUnrelated " + supportsGroupByUnrelated ) ;
return supportsGroupByUnrelated ;
}
/ *
* Can a "GROUP BY" clause add columns not in the SELECT provided
* it specifies all the columns in the SELECT ? Does anyone actually
* it specifies all the columns in the SELECT ? Does anyone actually
* understand what they mean here ?
*
* ( I think this is a subset of the previous function . - - petere )
@ -686,7 +686,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
}
/ *
* Can columns be defined as non - nullable . A JDBC Compliant driver
* Can columns be defined as non - nullable . A JDBC Compliant driver
* always returns true .
*
* < p > This changed from false to true in v6 . 2 of the driver , as this
@ -715,12 +715,12 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
* /
public boolean supportsMinimumSQLGrammar ( ) throws SQLException
{
Driver . debug ( "supportsMinimumSQLGrammar TRUE" ) ;
return true ;
Driver . debug ( "supportsMinimumSQLGrammar TRUE" ) ;
return true ;
}
/ *
* Does this driver support the Core ODBC SQL grammar . We need
* Does this driver support the Core ODBC SQL grammar . We need
* SQL - 92 conformance for this .
*
* @return true if so
@ -910,7 +910,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
}
/ *
* Can a schema name be used in a data manipulation statement ? Nope .
* Can a schema name be used in a data manipulation statement ? Nope .
*
* @return true if so
* @exception SQLException if a database access error occurs
@ -1831,20 +1831,20 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
String relKind ;
switch ( r . getBytes ( 3 ) [ 0 ] )
{
case ( byte ) 'r' :
relKind = "TABLE" ;
break ;
case ( byte ) 'i' :
relKind = "INDEX" ;
break ;
case ( byte ) 'S' :
relKind = "SEQUENCE" ;
break ;
case ( byte ) 'v' :
relKind = "VIEW" ;
break ;
default :
relKind = null ;
case ( byte ) 'r' :
relKind = "TABLE" ;
break ;
case ( byte ) 'i' :
relKind = "INDEX" ;
break ;
case ( byte ) 'S' :
relKind = "SEQUENCE" ;
break ;
case ( byte ) 'v' :
relKind = "VIEW" ;
break ;
default :
relKind = null ;
}
tuple [ 0 ] = null ; // Catalog name
@ -2243,29 +2243,30 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
Vector v = new Vector ( ) ;
if ( tableNamePattern = = null )
tableNamePattern = "%" ;
tableNamePattern = "%" ;
f [ 0 ] = new Field ( connection , "TABLE_CAT" , iVarcharOid , 32 ) ;
f [ 1 ] = new Field ( connection , "TABLE_SCHEM" , iVarcharOid , 32 ) ;
f [ 2 ] = new Field ( connection , "TABLE_NAME" , iVarcharOid , 32 ) ;
f [ 3 ] = new Field ( connection , "COLUMN_NAME" , iVarcharOid , 32 ) ;
f [ 4 ] = new Field ( connection , "GRANTOR" , iVarcharOid , 32 ) ;
f [ 5 ] = new Field ( connection , "GRANTEE" , iVarcharOid , 32 ) ;
f [ 6 ] = new Field ( connection , "PRIVILEGE" , iVarcharOid , 32 ) ;
f [ 7 ] = new Field ( connection , "IS_GRANTABLE" , iVarcharOid , 32 ) ;
f [ 0 ] = new Field ( connection , "TABLE_CAT" , iVarcharOid , 32 ) ;
f [ 1 ] = new Field ( connection , "TABLE_SCHEM" , iVarcharOid , 32 ) ;
f [ 2 ] = new Field ( connection , "TABLE_NAME" , iVarcharOid , 32 ) ;
f [ 3 ] = new Field ( connection , "COLUMN_NAME" , iVarcharOid , 32 ) ;
f [ 4 ] = new Field ( connection , "GRANTOR" , iVarcharOid , 32 ) ;
f [ 5 ] = new Field ( connection , "GRANTEE" , iVarcharOid , 32 ) ;
f [ 6 ] = new Field ( connection , "PRIVILEGE" , iVarcharOid , 32 ) ;
f [ 7 ] = new Field ( connection , "IS_GRANTABLE" , iVarcharOid , 32 ) ;
// This is taken direct from the psql source
java . sql . ResultSet r = connection . ExecSQL ( "SELECT relname, relacl FROM pg_class, pg_user WHERE ( relkind = 'r' OR relkind = 'i') and relname !~ '^pg_' and relname !~ '^xin[vx][0-9]+' and usesysid = relowner and relname like '" + tableNamePattern . toLowerCase ( ) + "' ORDER BY relname" ) ;
while ( r . next ( ) ) {
byte [ ] [ ] tuple = new byte [ 8 ] [ 0 ] ;
tuple [ 0 ] = tuple [ 1 ] = "" . getBytes ( ) ;
DriverManager . println ( "relname=\"" + r . getString ( 1 ) + "\" relacl=\"" + r . getString ( 2 ) + "\"" ) ;
// For now, don't add to the result as relacl needs to be processed.
//v.addElement(tuple);
java . sql . ResultSet r = connection . ExecSQL ( "SELECT relname, relacl FROM pg_class, pg_user WHERE ( relkind = 'r' OR relkind = 'i') and relname !~ '^pg_' and relname !~ '^xin[vx][0-9]+' and usesysid = relowner and relname like '" + tableNamePattern . toLowerCase ( ) + "' ORDER BY relname" ) ;
while ( r . next ( ) )
{
byte [ ] [ ] tuple = new byte [ 8 ] [ 0 ] ;
tuple [ 0 ] = tuple [ 1 ] = "" . getBytes ( ) ;
DriverManager . println ( "relname=\"" + r . getString ( 1 ) + "\" relacl=\"" + r . getString ( 2 ) + "\"" ) ;
// For now, don't add to the result as relacl needs to be processed.
//v.addElement(tuple);
}
return new ResultSet ( connection , f , v , "OK" , 1 ) ;
return new ResultSet ( connection , f , v , "OK" , 1 ) ;
}
/ *
@ -2389,7 +2390,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
"a.attnum as KEY_SEQ," +
"ic.relname as PK_NAME " +
" FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a" +
" WHERE bc.relkind = 'r' " + // -- not indices
" WHERE bc.relkind = 'r' " + // -- not indices
" and upper(bc.relname) = upper('" + table + "')" +
" and i.indrelid = bc.oid" +
" and i.indexrelid = ic.oid" +
@ -2401,112 +2402,132 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
private java . sql . ResultSet getImportedExportedKeys ( String catalog , String schema , String primaryTable , String foreignTable ) 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 ) ;
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"
) ;
+ "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 < numColumns ; c + + ) {
if ( pos > - 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
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 ;
}
}
}
}
}
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 ( ) ;
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 < numColumns ; c + + )
{
if ( pos > - 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 ) ;
tuples . addElement ( tuple ) ;
}
}
} while ( hasMore ) ;
while ( hasMore ) ;
}
return new ResultSet ( connection , f , tuples , "OK" , 1 ) ;
@ -2565,7 +2586,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
* /
public java . sql . ResultSet getImportedKeys ( String catalog , String schema , String table ) throws SQLException
{
return getImportedExportedKeys ( catalog , schema , null , table ) ;
return getImportedExportedKeys ( catalog , schema , null , table ) ;
}
/ *
@ -2623,7 +2644,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData
* /
public java . sql . ResultSet getExportedKeys ( String catalog , String schema , String table ) throws SQLException
{
return getImportedExportedKeys ( catalog , schema , table , null ) ;
return getImportedExportedKeys ( catalog , schema , table , null ) ;
}
/ *
@ -2684,7 +2705,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
{
return getImportedExportedKeys ( primaryCatalog , primarySchema , primaryTable , foreignTable ) ;
return getImportedExportedKeys ( primaryCatalog , primarySchema , primaryTable , foreignTable ) ;
}
/ *