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

  1. Validate index is between 1 and rsMetaData.getColumnCount() before calling
  2. Keep the ResultSet/statement open until all column metadata has been read
  3. 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

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


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)