{"record":{"id":"c4cee032f810c8ca","repo":"pentaho/pentaho-kettle","slug":"mysqldatabasemeta-exception-c4cee0","errorCode":"MySQLDatabaseMeta.Exception.LegacyColumnNameNoDBMetaDataException","errorMessage":"MySQLDatabaseMeta.Exception.LegacyColumnNameNoDBMetaDataException (localized via BaseMessages)","messagePattern":"MySQLDatabaseMeta\\.Exception\\.LegacyColumnNameNoDBMetaDataException \\(localized via BaseMessages\\)","errorType":"exception","errorClass":"KettleDatabaseException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/pentaho/di/core/database/MySQLDatabaseMeta.java","lineNumber":525,"sourceCode":"  }\n\n  @Override\n  public int getMaxTextFieldLength() {\n    return Integer.MAX_VALUE;\n  }\n\n  /**\n   * Returns the column name for a MySQL field checking if the driver major version is \"greater than\" or \"lower or equal\" to 3.\n   *\n   * @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":507,"sourceCodeEnd":539,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/core/src/main/java/org/pentaho/di/core/database/MySQLDatabaseMeta.java#L507-L539","documentation":"Thrown by MySQLDatabaseMeta.getLegacyColumnName when the JDBC DatabaseMetaData argument is null. The method needs the driver's major version (from DatabaseMetaData) to decide between getColumnLabel and getColumnName, so a null argument causes a localized KettleDatabaseException.","triggerScenarios":"Calling getLegacyColumnName(null, rsMetaData, index) — the caller had no DatabaseMetaData from its Connection (closed connection or getMetaData() returned null).","commonSituations":"Custom plugin/fork code calling the legacy API without a live connection; MySQL Connector/J connection failure leaving metadata null; test mocks returning null.","solutions":["Acquire DatabaseMetaData from an open Connection and null-check it before calling","Fix upstream code that produced the null metadata so a valid connection is always available","If driver version is known another way, use the appropriate ColumnLabel/ColumnName path directly instead of this method"],"exampleFix":"// before\nString name = meta.getLegacyColumnName(null, rsMetaData, index);\n// after\nDatabaseMetaData dbMetaData = connection.getMetaData();\nif (dbMetaData != null) {\n  String name = meta.getLegacyColumnName(dbMetaData, rsMetaData, index);\n}","handlingStrategy":"type-guard","validationCode":"DatabaseMetaData dbMeta = connection != null ? connection.getMetaData() : null;\nif (dbMeta == null) throw new IllegalStateException(\"No DatabaseMetaData: connection closed or invalid\");","typeGuard":"function hasDbMetaData(Connection c) { try { return c != null && c.getMetaData() != null; } catch (SQLException e) { return false; } }","tryCatchPattern":"try {\n  String name = mysqlMeta.getLegacyColumnName(dbMetaData, rsMetaData, index);\n} catch (KettleDatabaseException e) {\n  log.error(\"No DB metadata available for MySQL legacy column lookup\", e);\n}","preventionTips":["Verify MySQL Connector/J connectivity before metadata operations","Obtain DatabaseMetaData from an open Connection and null-check it","Do not pass null metadata from mocks/factories into production paths"],"tags":["jdbc","mysql","null-argument","metadata"],"backgroundTag":"null-argument","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"}