pentaho/pentaho-kettle · error · KettleDatabaseException
MySQLDatabaseMeta.Exception.LegacyColumnNameException
MySQLDatabaseMeta.Exception.LegacyColumnNameException
Error message
%s: %s (localized message + e.getMessage())
What it means
Wraps any Exception thrown while reading the column label via ResultSetMetaData.getColumnLabel(index) in MariaDBDatabaseMeta.getLegacyColumnName. The message is the localized 'LegacyColumnNameException' text plus the underlying exception message, chained as the cause.
Solutions
- Validate index is between 1 and rsMetaData.getColumnCount() before calling
- Keep the ResultSet/statement open until all column metadata has been read
- Catch KettleDatabaseException at the call site and inspect the chained cause for the driver-level error
Example fix
// before
for (int i = 0; i <= rsMetaData.getColumnCount(); i++) {
String label = meta.getLegacyColumnName(dbMetaData, rsMetaData, i);
}
// after
for (int i = 1; i <= rsMetaData.getColumnCount(); i++) {
String label = meta.getLegacyColumnName(dbMetaData, rsMetaData, i);
} Defensive patterns
Strategy: try-catch
Validate before calling
if (index < 1 || index > rsMetaData.getColumnCount()) throw new IllegalArgumentException("Column index " + index + " out of 1.." + rsMetaData.getColumnCount()); Type guard
function isValidColumnIndex(ResultSetMetaData md, int i) { try { return i >= 1 && i <= md.getColumnCount(); } catch (SQLException e) { return false; } } Try / catch
try {
String label = meta.getLegacyColumnName(dbMetaData, rsMetaData, index);
} catch (KettleDatabaseException e) {
Throwable cause = e.getCause(); // driver-level error (SQLException) — inspect and handle
log.error("Failed to read column label for index " + index + ": " + (cause != null ? cause.getMessage() : e.getMessage()), e);
} Prevention
- Use 1-based JDBC column indices; loop i=1..getColumnCount() inclusive
- Keep the ResultSet and Statement open while reading metadata
- Catch KettleDatabaseException and inspect getCause() for driver errors
When it happens
Trigger: ResultSetMetaData.getColumnLabel(index) throws — typically SQLException — due to an invalid index (index < 1 or > column count) or a closed/stale ResultSet.
Common situations: Looping over columns with a wrong upper bound; the ResultSet was closed before metadata access; driver errors during metadata retrieval.
Related errors
- MySQLDatabaseMeta.Exception.LegacyColumnNameNoRSMetaDataException
- MySQLDatabaseMeta.Exception.LegacyColumnNameException
- No result set metadata available to retrieve row metadata!
- Unable to retrieve metadata from resultset
- Cannot fetch driver metadata for
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/bae4f7f5b1f8a52d.
Report an issue: GitHub.
Appendix: source
Thrown at core/src/main/java/org/pentaho/di/core/database/MariaDBDatabaseMeta.java:74
* @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)