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

  1. Call resultSet.getMetaData() and null-check before invoking
  2. Ensure the query produced a ResultSet and keep it open while reading column metadata
  3. 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

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


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)