{"record":{"id":"bae4f7f5b1f8a52d","repo":"pentaho/pentaho-kettle","slug":"mysqldatabasemeta-exception-legacycolumnnameexception","errorCode":"MySQLDatabaseMeta.Exception.LegacyColumnNameException","errorMessage":"%s: %s (localized message + e.getMessage())","messagePattern":"(.+?): (.+?) \\(localized message \\+ e\\.getMessage\\(\\)\\)","errorType":"exception","errorClass":"KettleDatabaseException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/pentaho/di/core/database/MariaDBDatabaseMeta.java","lineNumber":74,"sourceCode":"   * @param dbMetaData\n   * @param rsMetaData\n   * @param index\n   * @return The column label.\n   * @throws KettleDatabaseException\n   */\n  @Override public String getLegacyColumnName( DatabaseMetaData dbMetaData, ResultSetMetaData rsMetaData, int index ) throws KettleDatabaseException {\n    if ( dbMetaData == null ) {\n      throw new KettleDatabaseException( BaseMessages.getString( PKG, \"MySQLDatabaseMeta.Exception.LegacyColumnNameNoDBMetaDataException\" ) );\n    }\n\n    if ( rsMetaData == null ) {\n      throw new KettleDatabaseException( BaseMessages.getString( PKG, \"MySQLDatabaseMeta.Exception.LegacyColumnNameNoRSMetaDataException\" ) );\n    }\n\n    try {\n      return rsMetaData.getColumnLabel( index );\n    } catch ( Exception e ) {\n      throw new KettleDatabaseException( String.format( \"%s: %s\", BaseMessages.getString( PKG, \"MySQLDatabaseMeta.Exception.LegacyColumnNameException\" ), e.getMessage() ), e );\n    }\n  }\n}\n","sourceCodeStart":56,"sourceCodeEnd":78,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/core/src/main/java/org/pentaho/di/core/database/MariaDBDatabaseMeta.java#L56-L78","documentation":"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.","triggerScenarios":"ResultSetMetaData.getColumnLabel(index) throws — typically SQLException — due to an invalid index (index < 1 or > column count) or a closed/stale ResultSet.","commonSituations":"Looping over columns with a wrong upper bound; the ResultSet was closed before metadata access; driver errors during metadata retrieval.","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"],"exampleFix":"// before\nfor (int i = 0; i <= rsMetaData.getColumnCount(); i++) {\n  String label = meta.getLegacyColumnName(dbMetaData, rsMetaData, i);\n}\n// after\nfor (int i = 1; i <= rsMetaData.getColumnCount(); i++) {\n  String label = meta.getLegacyColumnName(dbMetaData, rsMetaData, i);\n}","handlingStrategy":"try-catch","validationCode":"if (index < 1 || index > rsMetaData.getColumnCount()) throw new IllegalArgumentException(\"Column index \" + index + \" out of 1..\" + rsMetaData.getColumnCount());","typeGuard":"function isValidColumnIndex(ResultSetMetaData md, int i) { try { return i >= 1 && i <= md.getColumnCount(); } catch (SQLException e) { return false; } }","tryCatchPattern":"try {\n  String label = meta.getLegacyColumnName(dbMetaData, rsMetaData, index);\n} catch (KettleDatabaseException e) {\n  Throwable cause = e.getCause(); // driver-level error (SQLException) — inspect and handle\n  log.error(\"Failed to read column label for index \" + index + \": \" + (cause != null ? cause.getMessage() : e.getMessage()), e);\n}","preventionTips":["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"],"tags":["jdbc","metadata","resultset","index-out-of-range"],"backgroundTag":"index-out-of-range","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}