{"record":{"id":"a180fe6877d3614c","repo":"pentaho/pentaho-kettle","slug":"mysqldatabasemeta-exception-legacycolumnnameexception-s-s","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/MySQLDatabaseMeta.java","lineNumber":535,"sourceCode":"   * @param dbMetaData\n   * @param rsMetaData\n   * @param index\n   * @return The column label if version is greater than 3 or the column name if version is lower or equal to 3.\n   * @throws KettleDatabaseException\n   */\n  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 dbMetaData.getDriverMajorVersion() > 3 ? rsMetaData.getColumnLabel( index ) : rsMetaData.getColumnName( 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":517,"sourceCodeEnd":539,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/core/src/main/java/org/pentaho/di/core/database/MySQLDatabaseMeta.java#L517-L539","documentation":"Wraps any Exception from reading the column name/label (getColumnLabel or getColumnName, chosen by driver major version > 3) in MySQLDatabaseMeta.getLegacyColumnName. The message combines the localized 'LegacyColumnNameException' text with the underlying exception's message, keeping the cause chained.","triggerScenarios":"ResultSetMetaData.getColumnLabel(index) or getColumnName(index) throws — typically an invalid index (out of 1..columnCount range) or a closed/stale ResultSet.","commonSituations":"Off-by-one column loops; accessing metadata after closing the statement; MySQL Connector/J errors during metadata retrieval.","solutions":["Validate index against rsMetaData.getColumnCount() (1-based) before the call","Keep the ResultSet open until all columns are processed","Inspect the chained cause in the KettleDatabaseException for the driver-level error"],"exampleFix":"// before\nfor (int i = 0; i < rsMetaData.getColumnCount(); i++) {\n  String name = meta.getLegacyColumnName(dbMetaData, rsMetaData, i);\n}\n// after\nfor (int i = 1; i <= rsMetaData.getColumnCount(); i++) {\n  String name = 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 name = mysqlMeta.getLegacyColumnName(dbMetaData, rsMetaData, index);\n} catch (KettleDatabaseException e) {\n  Throwable cause = e.getCause(); // underlying SQLException from getColumnLabel/getColumnName\n  log.error(\"Failed to read MySQL column name for index \" + index + \": \" + (cause != null ? cause.getMessage() : e.getMessage()), e);\n}","preventionTips":["Use 1-based indices bounded by getColumnCount()","Keep the ResultSet open during metadata reads","Log the chained cause to identify driver version-specific issues"],"tags":["jdbc","mysql","metadata","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"}