Обсуждение: Patches for DatabaseMetaData.java for Postgresql 7.1.3 (sorry, here is the diff -c with explanations)
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@linux.kapow.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@linux.kapow.dk>
+ // Modified by Ed Yu <ekyu@asgnet.psc.sc.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@asgnet.psc.sc.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@asgnet.psc.sc.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);
}
This has been saved for the 7.3 release:
http://candle.pha.pa.us/cgi-bin/pgpatches2
---------------------------------------------------------------------------
Ed Yu wrote:
> 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@linux.kapow.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@linux.kapow.dk>
> + // Modified by Ed Yu <ekyu@asgnet.psc.sc.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@asgnet.psc.sc.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@asgnet.psc.sc.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);
> }
>
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026