{"record":{"id":"86f141f7bfe5c837","repo":"pentaho/pentaho-kettle","slug":"no-result-set-metadata-available-to-retrieve-row-metadata","errorCode":null,"errorMessage":"No result set metadata available to retrieve row metadata!","messagePattern":"No result set metadata available to retrieve row metadata!","errorType":"exception","errorClass":"KettleDatabaseException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/pentaho/di/core/database/Database.java","lineNumber":2879,"sourceCode":"    } catch ( SQLException ex ) {\n      throw new KettleDatabaseException( \"Couldn't close query: resultset or prepared statements\", ex );\n    }\n  }\n\n  /**\n   * Build the row using ResultSetMetaData rsmd\n   *\n   * @param rm             The resultset metadata to inquire\n   * @param ignoreLength   true if you want to ignore the length (workaround for MySQL bug/problem)\n   * @param lazyConversion true if lazy conversion needs to be enabled where possible\n   */\n  private RowMetaInterface getRowInfo( ResultSetMetaData rm, boolean ignoreLength, boolean lazyConversion )\n    throws KettleDatabaseException {\n    try {\n      log.snap( Metrics.METRIC_DATABASE_GET_ROW_META_START, databaseMeta.getName() );\n\n      if ( rm == null ) {\n        throw new KettleDatabaseException( \"No result set metadata available to retrieve row metadata!\" );\n      }\n\n      RowMetaInterface rowMeta = new RowMeta();\n\n      try {\n        int nrcols = rm.getColumnCount();\n        for ( int i = 1; i <= nrcols; i++ ) {\n          ValueMetaInterface valueMeta = getValueFromSQLType( rm, i, ignoreLength, lazyConversion );\n          rowMeta.addValueMeta( valueMeta );\n        }\n        return rowMeta;\n      } catch ( SQLException ex ) {\n        throw new KettleDatabaseException( \"Error getting row information from database: \", ex );\n      }\n    } finally {\n      log.snap( Metrics.METRIC_DATABASE_GET_ROW_META_STOP, databaseMeta.getName() );\n    }\n  }","sourceCodeStart":2861,"sourceCodeEnd":2897,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/core/src/main/java/org/pentaho/di/core/database/Database.java#L2861-L2897","documentation":"KettleDatabaseException thrown by Database.getRowInfo when the ResultSetMetaData argument is null. The library requires valid JDBC result set metadata to build a Kettle RowMetaInterface (column count, types, lengths); without it, row metadata cannot be derived. It is a fail-fast guard before column inspection.","triggerScenarios":"Calling getRowInfo/getRow with a ResultSet whose getMetaData() returned null (e.g. statement produced no result set, DDL execution results, or a driver that returns null metadata). Also thrown when Database.getRow(ResultSet, boolean) internally receives null from rs.getMetaData().","commonSituations":"Executing non-SELECT statements then trying to read rows; JDBC drivers (some custom/old drivers) that return null ResultSetMetaData; calling getRow() on a closed or never-executed statement's result set.","solutions":["Verify the SQL statement actually produces a result set (SELECT) before calling getRow","Check that rs.getMetaData() / the statement was executed successfully before reading rows","Update or replace the JDBC driver with one that returns valid metadata","Catch KettleDatabaseException and treat as 'no result data' rather than retrying"],"exampleFix":"// before\nObject[] row = db.getRow(rs, false);\n// after\nResultSetMetaData md = rs.getMetaData();\nif (md != null && md.getColumnCount() > 0) {\n  Object[] row = db.getRow(rs, false);\n} else {\n  // no result set data available\n}","handlingStrategy":"validation","validationCode":"ResultSetMetaData md = rs.getMetaData();\nif (md == null) {\n  throw new IllegalStateException(\"Query produced no result set metadata; is it a SELECT?\");\n}","typeGuard":"boolean hasMetadata(ResultSet rs) {\n  try { return rs.getMetaData() != null; } catch (SQLException e) { return false; }\n}","tryCatchPattern":"try {\n  row = db.getRow(rs, false);\n} catch (KettleDatabaseException e) {\n  if (e.getMessage().contains(\"No result set metadata\")) {\n    // treat as empty/no-data result\n  } else { throw e; }\n}","preventionTips":["Only call getRow/getRowInfo on executed SELECT statements","Check statement.getResultSet() != null before reading rows","Avoid reading rows from DDL/DML execution results","Use JDBC drivers known to return valid metadata"],"tags":["jdbc","metadata","resultset"],"backgroundTag":"unexpected-response-shape","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"}