Patches for DatabaseMetaData.java for Postgresql 7.1.3 (sorry, here is the diff -c with explanations)

From: "Ed Yu" <ekyu(at)sc(dot)rr(dot)com>
To: "pgsql-jdbc" <pgsql-jdbc(at)postgresql(dot)org>
Subject: Patches for DatabaseMetaData.java for Postgresql 7.1.3 (sorry, here is the diff -c with explanations)
Date: 2002-01-06 03:52:48
Message-ID: 001d01c19665$9b8a9b20$bf00a8c0@sc.rr.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

This patch fixes a null pointer exception (because the return type of 'v' is
not in the switch statement causing the variable relKind to be assigned a
null value and a subsequent call to relKind.getBytes() throwing the
exception) when invoking method ResultSetMetaData.getTables().
In addition, this fix will properly recognize both the schema pattern and
the table name pattern with both "%" and "_" SQL wildcard characters.

*** DatabaseMetaData.java.orig Fri Feb 16 11:45:00 2001
--- DatabaseMetaData.java Sat Jan 5 13:46:01 2002
***************
*** 1635,1641 ****
if(types==null)
types = defaultTableTypes;

! if(tableNamePattern==null)
tableNamePattern="%";

// the field descriptors for the new ResultSet
--- 1635,1644 ----
if(types==null)
types = defaultTableTypes;

! if((schemaPattern==null) || (schemaPattern.length()==0))
! schemaPattern="%";
!
! if((tableNamePattern==null) || (tableNamePattern.length()==0))
tableNamePattern="%";

// the field descriptors for the new ResultSet
***************
*** 1650,1656 ****
f[4] = new Field(connection, "REMARKS", iVarcharOid, 32);

// Now form the query
! StringBuffer sql = new StringBuffer("select relname,oid,relkind from
pg_class where (");
boolean notFirst=false;
for(int i=0;i<types.length;i++) {
for(int j=0;j<getTableTypes.length;j++)
--- 1653,1660 ----
f[4] = new Field(connection, "REMARKS", iVarcharOid, 32);

// Now form the query
! StringBuffer sql = new StringBuffer(
! "select relname,pg_class.oid,relkind from pg_class, pg_user where
(");
boolean notFirst=false;
for(int i=0;i<types.length;i++) {
for(int j=0;j<getTableTypes.length;j++)
***************
*** 1663,1673 ****
}

// Added by Stefan Andreasen <stefan(at)linux(dot)kapow(dot)dk>
// Now take the pattern into account
! sql.append(") and relname like '");
! sql.append(tableNamePattern.toLowerCase());
! sql.append("'");

// Now run the query
r = connection.ExecSQL(sql.toString());

--- 1667,1693 ----
}

// Added by Stefan Andreasen <stefan(at)linux(dot)kapow(dot)dk>
+ // Modified by Ed Yu <ekyu(at)asgnet(dot)psc(dot)sc(dot)edu>
// Now take the pattern into account
! sql.append(") and relname");
! if ((tableNamePattern.indexOf("%") >= 0) ||
! (tableNamePattern.indexOf("_") >= 0))
! sql.append(" like ");
! else
! sql.append(" = ");
! sql.append("'" + tableNamePattern.toLowerCase() + "'");

+ // Added by Ed Yu <ekyu(at)asgnet(dot)psc(dot)sc(dot)edu>
+ // Now take the schemaPattern into account
+ sql.append(" and pg_class.relowner = pg_user.usesysid");
+ sql.append(" and pg_user.usename");
+ if ((schemaPattern.indexOf("%") >= 0) ||
+ (schemaPattern.indexOf("_") >= 0))
+ sql.append(" like ");
+ else
+ sql.append(" = ");
+ sql.append("'" + schemaPattern + "'");
+
// Now run the query
r = connection.ExecSQL(sql.toString());

***************
*** 1686,1691 ****
--- 1706,1713 ----
remarks = defaultRemarks;
dr.close();

+ // JDBC definition for TABLE_TYPE - "TABLE", "VIEW", "SYSTEM TABLE",
+ // "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM".
String relKind;
switch (r.getBytes(3)[0]) {
case 'r':
***************
*** 1697,1702 ****
--- 1719,1727 ----
case 'S':
relKind = "SEQUENCE";
break;
+ case 'v':
+ relKind = "VIEW";
+ break;
default:
relKind = null;
}
***************
*** 1704,1710 ****
tuple[0] = null; // Catalog name
tuple[1] = null; // Schema name
tuple[2] = r.getBytes(1); // Table name
! tuple[3] = relKind.getBytes(); // Table type
tuple[4] = remarks; // Remarks
v.addElement(tuple);
}
--- 1729,1743 ----
tuple[0] = null; // Catalog name
tuple[1] = null; // Schema name
tuple[2] = r.getBytes(1); // Table name
!
! // Added by Ed Yu <ekyu(at)asgnet(dot)psc(dot)sc(dot)edu>
! // Fix NullPointerException if return type is not handled in the
! // above switch statement.
! if (relKind==null)
! tuple[3] = null;
! else
! tuple[3] = relKind.getBytes(); // Table type
!
tuple[4] = remarks; // Remarks
v.addElement(tuple);
}

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Bear Giles 2002-01-07 00:00:35 JDBC: why is PGobject class instead of interface?
Previous Message Ed Yu 2002-01-06 03:39:18 Patches for ResultSetMetaData.java for Postgresql 7.1.3 (sorry, here is the diff -c with explanations)