pentaho/pentaho-kettle · critical · KettleException

dbInterface.getUnsupportedTableOutputMessage()

Error message

dbInterface.getUnsupportedTableOutputMessage()

What it means

During step initialization, the connected database's dialect (DatabaseInterface) reports supportsStandardTableOutput() == false, so TableOutput refuses to run and surfaces the dialect's own explanation via getUnsupportedTableOutputMessage(). Certain database types (e.g. SAP HANA-specific or specialized dialects) require dedicated steps instead of the generic TableOutput.

Solutions

  1. Read the dialect's getUnsupportedTableOutputMessage() for the required alternative step and use it (e.g. the database-specific output step).
  2. Check the connection's 'Database type' setting; if you intended a standard database, select the correct generic dialect.
  3. Upgrade Pentaho/Kettle if a newer version adds standard table output support for that dialect.

Example fix

// before: connection database type = SAP HANA (monetdb-like dialect) with TableOutput
// after: switch connection database type to the correct standard dialect, or use the HANA-specific output step
Defensive patterns

Strategy: validation

Validate before calling

// Check dialect support before building/running the transformation
DatabaseInterface dbi = databaseMeta.getDatabaseInterface();
if ( !dbi.supportsStandardTableOutput() ) {
  throw new IllegalStateException( dbi.getUnsupportedTableOutputMessage() );
}

Try / catch

try {
  step.init( meta, data );
} catch ( KettleException e ) {
  if ( e.getMessage().contains( "table output" ) || e.getMessage().contains( "TableOutput" ) ) {
    // switch to the dialect-specific output step or correct database type
  }
}

Prevention

When it happens

Trigger: init() succeeds in connecting, but dbInterface.supportsStandardTableOutput() returns false for the configured DatabaseMeta's database type, causing throw new KettleException(dbInterface.getUnsupportedTableOutputMessage()).

Common situations: Using a database connection type whose dialect forbids standard table output (e.g. SAP HANA with the dedicated HANA output step required); accidentally selecting the wrong database type in the connection dialog; plugin dialects that only support their own output steps.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/025c6bfcaaaf42ad. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/tableoutput/TableOutput.java:507

        // Disable batch mode in case
        // - we use an unlimited commit size
        // - if we need to pick up auto-generated keys
        // - if you are running the transformation as a single database transaction (unique connections)
        // - if we are reverting to save-points
        data.batchMode =
          meta.useBatchUpdate()
            && data.commitSize > 0 && !meta.isReturningGeneratedKeys()
            && !getTransMeta().isUsingUniqueConnections() && !data.useSafePoints;

        // Per PDI-6211 : give a warning that batch mode operation in combination with step error handling can lead to
        // incorrectly processed rows.
        if ( getStepMeta().isDoingErrorHandling() && !dbInterface.supportsErrorHandlingOnBatchUpdates() ) {
          log.logMinimal( BaseMessages.getString(
            PKG, "TableOutput.Warning.ErrorHandlingIsNotFullySupportedWithBatchProcessing" ) );
        }

        if ( !dbInterface.supportsStandardTableOutput() ) {
          throw new KettleException( dbInterface.getUnsupportedTableOutputMessage() );
        }

        if ( log.isBasic() ) {
          logBasic( "Connected to database [" + meta.getDatabaseMeta() + "] (commit=" + data.commitSize + ")" );
        }

        // Postpone commit as long as possible. PDI-2091
        if ( data.commitSize == 0 ) {
          data.commitSize = Integer.MAX_VALUE;
        }
        data.db.setCommitSize( data.commitSize );

        if ( !meta.isPartitioningEnabled() && !meta.isTableNameInField() ) {
          data.tableName = environmentSubstitute( meta.getTableName() );
        }

        return true;
      } catch ( KettleException e ) {

View on GitHub (pinned to f3058517a1)