pentaho/pentaho-kettle · error · KettleDatabaseException
MySQLDatabaseMeta.Exception.LegacyColumnNameNoRSMetaDataException
MySQLDatabaseMeta.Exception.LegacyColumnNameNoRSMetaDataException
Error message
MySQLDatabaseMeta.Exception.LegacyColumnNameNoRSMetaDataException (localized via BaseMessages)
What it means
Thrown by MySQLDatabaseMeta.getLegacyColumnName when the ResultSetMetaData argument is null. Column names/labels cannot be resolved without it, so the method throws a localized KettleDatabaseException.
Solutions
- Call resultSet.getMetaData() and null-check before invoking
- Ensure the query produced a ResultSet and keep it open while reading column metadata
- Read metadata immediately after executing the statement
Example fix
// before
String name = meta.getLegacyColumnName(dbMetaData, null, index);
// after
ResultSetMetaData rsMetaData = resultSet.getMetaData();
if (rsMetaData != null) {
String name = meta.getLegacyColumnName(dbMetaData, rsMetaData, index);
} Defensive patterns
Strategy: type-guard
Validate before calling
if (resultSet == null || resultSet.getMetaData() == null) throw new IllegalStateException("ResultSet or its metadata is null"); Type guard
function hasRsMetaData(ResultSet rs) { try { return rs != null && rs.getMetaData() != null; } catch (SQLException e) { return false; } } Try / catch
try {
String name = mysqlMeta.getLegacyColumnName(dbMetaData, rsMetaData, index);
} catch (KettleDatabaseException e) {
log.error("No ResultSet metadata available for MySQL legacy column lookup", e);
} Prevention
- Use executeQuery so a ResultSet always exists before metadata access
- Read metadata while the ResultSet is still open
- Null-check rs.getMetaData() before invoking the API
When it happens
Trigger: Calling getLegacyColumnName(dbMetaData, null, index) — e.g. a statement executed without a result set, a closed ResultSet, or rs.getMetaData() returning null.
Common situations: Reading columns after the ResultSet was closed; using execute() return values incorrectly; refactors dropping the ResultSet before metadata access.
Related errors
- MySQLDatabaseMeta.Exception.LegacyColumnNameNoRSMetaDataException
- MySQLDatabaseMeta.Exception.LegacyColumnNameNoDBMetaDataException
- Couldn't close query: resultset or prepared statements
- Error closing resultset after getting catalogs!
- Error closing resultset after getting schemas!
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/697476a4186ab966.
Report an issue: GitHub.
Appendix: source
Thrown at core/src/main/java/org/pentaho/di/core/database/MySQLDatabaseMeta.java:529
return Integer.MAX_VALUE;
}
/**
* Returns the column name for a MySQL field checking if the driver major version is "greater than" or "lower or equal" to 3.
*
* @param dbMetaData
* @param rsMetaData
* @param index
* @return The column label if version is greater than 3 or the column name if version is lower or equal to 3.
* @throws KettleDatabaseException
*/
public String getLegacyColumnName( DatabaseMetaData dbMetaData, ResultSetMetaData rsMetaData, int index ) throws KettleDatabaseException {
if ( dbMetaData == null ) {
throw new KettleDatabaseException( BaseMessages.getString( PKG, "MySQLDatabaseMeta.Exception.LegacyColumnNameNoDBMetaDataException" ) );
}
if ( rsMetaData == null ) {
throw new KettleDatabaseException( BaseMessages.getString( PKG, "MySQLDatabaseMeta.Exception.LegacyColumnNameNoRSMetaDataException" ) );
}
try {
return dbMetaData.getDriverMajorVersion() > 3 ? rsMetaData.getColumnLabel( index ) : rsMetaData.getColumnName( index );
} catch ( Exception e ) {
throw new KettleDatabaseException( String.format( "%s: %s", BaseMessages.getString( PKG, "MySQLDatabaseMeta.Exception.LegacyColumnNameException" ), e.getMessage() ), e );
}
}
}
View on GitHub (pinned to f3058517a1)