pentaho/pentaho-kettle · error · KettleDatabaseException
MySQLDatabaseMeta.Exception.LegacyColumnNameNoRSMetaDataException
MySQLDatabaseMeta.Exception.LegacyColumnNameNoRSMetaDataException
Error message
MySQLDatabaseMeta.Exception.LegacyColumnNameNoRSMetaDataException (localized via BaseMessages)
What it means
Thrown by MariaDBDatabaseMeta.getLegacyColumnName when the ResultSetMetaData argument is null. Without result set metadata there is no column label/name to return, so the method fails fast with a localized KettleDatabaseException.
Solutions
- Obtain ResultSetMetaData via resultSet.getMetaData() and verify it is non-null before calling getLegacyColumnName
- Ensure the query actually produced a ResultSet (executeQuery, not executeUpdate) before reading column metadata
- Refactor to read metadata immediately after executing the statement, while the ResultSet is still open
Example fix
// before
String label = meta.getLegacyColumnName(dbMetaData, null, index);
// after
ResultSetMetaData rsMetaData = resultSet.getMetaData();
if (rsMetaData != null) {
String label = 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 label = meta.getLegacyColumnName(dbMetaData, rsMetaData, index);
} catch (KettleDatabaseException e) {
log.error("No ResultSet metadata available for legacy column lookup", e);
} Prevention
- Read column metadata immediately after executeQuery while the ResultSet is open
- Never pass ResultSets from executeUpdate/no-result statements to metadata APIs
- Null-check rs.getMetaData() before use
When it happens
Trigger: Calling getLegacyColumnName(dbMetaData, null, index) — e.g. after a query that returned no ResultSet, or rs.getMetaData() returned null.
Common situations: Working with a closed/empty ResultSet, a statement executed without a result set, or refactored code that lost the ResultSet reference before reading column labels.
Related errors
- MySQLDatabaseMeta.Exception.LegacyColumnNameNoDBMetaDataException
- MySQLDatabaseMeta.Exception.LegacyColumnNameNoRSMetaDataException
- MySQLDatabaseMeta.Exception.LegacyColumnNameNoDBMetaDataException
- MySQLDatabaseMeta.Exception.LegacyColumnNameException
- No result set metadata available to retrieve row metadata!
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/335fbb0fa2bfba5c.
Report an issue: GitHub.
Appendix: source
Thrown at core/src/main/java/org/pentaho/di/core/database/MariaDBDatabaseMeta.java:68
return !( cause != null && SHORT_MESSAGE_EXCEPTIONS.contains( cause.getClass().getName() ) );
}
/**
* Returns the column name for a MariaDB field.
*
* @param dbMetaData
* @param rsMetaData
* @param index
* @return The column label.
* @throws KettleDatabaseException
*/
@Override 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 rsMetaData.getColumnLabel( 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)