pentaho/pentaho-kettle · error · KettleException

DenormaliserMeta.Exception.UnableToSaveStepInfo

DenormaliserMeta.Exception.UnableToSaveStepInfo

Error message

DenormaliserMeta.Exception.UnableToSaveStepInfo

What it means

DenormaliserMeta.saveRep wraps any exception thrown while saving this step's settings to a Kettle repository into a KettleException with the localized message 'DenormaliserMeta.Exception.UnableToSaveStepInfo' plus the step id. The original failure (typically a repository write error) is chained as the cause.

Solutions

  1. Inspect the chained cause for the underlying database/repository error
  2. Verify the repository is writable and has free space
  3. Re-save after re-establishing repository connection
  4. Check r_step_attribute table constraints and size limits for the failing values

Example fix

// before
} catch ( Exception e ) {
  throw new KettleException( BaseMessages.getString( PKG, "DenormaliserMeta.Exception.UnableToSaveStepInfo" ) + id_step, e );
}
// after: log full cause before rethrowing
} catch ( Exception e ) {
  logError( "Unable to save Denormaliser step " + id_step, e );
  throw new KettleException( BaseMessages.getString( PKG, "DenormaliserMeta.Exception.UnableToSaveStepInfo" ) + id_step, e );
}
Defensive patterns

Strategy: try-catch

Validate before calling

// before saving, verify repository is connected and writable
if ( repository == null || !repository.isConnected() ) {
  throw new KettleException("Repository not connected; cannot save transformation");
}

Try / catch

try {
  repository.save(transMeta, versionComment, null, metaStore);
} catch (KettleException e) {
  if (e.getMessage() != null && e.getMessage().contains("UnableToSaveStepInfo") || e.getCause() != null) {
    log.error("Save failed for Denormaliser step; cause: " + e.getCause(), e);
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling TransMeta.saveRep / repository save of a transformation containing a Denormaliser step when saveStepAttribute fails: repository connection lost, database read-only, constraint violation, or oversized attribute values.

Common situations: Repository database read-only or disk full; saving transformations across incompatible Pentaho versions; network interruption during save; invalid characters in field configuration.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/denormaliser/DenormaliserMeta.java:361

        rep.saveStepAttribute( id_transformation, id_step, i, "field_name", field.getFieldName() );
        rep.saveStepAttribute( id_transformation, id_step, i, "key_value", field.getKeyValue() );
        rep.saveStepAttribute( id_transformation, id_step, i, "target_name", field.getTargetName() );
        rep.saveStepAttribute( id_transformation, id_step, i, "target_type", field.getTargetTypeDesc() );
        rep.saveStepAttribute( id_transformation, id_step, i, "target_format", field.getTargetFormat() );
        rep.saveStepAttribute( id_transformation, id_step, i, "target_length", field.getTargetLength() );
        rep.saveStepAttribute( id_transformation, id_step, i, "target_precision", field.getTargetPrecision() );
        rep.saveStepAttribute( id_transformation, id_step, i, "target_decimal_symbol", field
          .getTargetDecimalSymbol() );
        rep.saveStepAttribute( id_transformation, id_step, i, "target_grouping_symbol", field
          .getTargetGroupingSymbol() );
        rep.saveStepAttribute( id_transformation, id_step, i, "target_currency_symbol", field
          .getTargetCurrencySymbol() );
        rep.saveStepAttribute( id_transformation, id_step, i, "target_null_string", field.getTargetNullString() );
        rep.saveStepAttribute( id_transformation, id_step, i, "target_aggregation_type", field
          .getTargetAggregationTypeDesc() );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString( PKG, "DenormaliserMeta.Exception.UnableToSaveStepInfo" )
        + id_step, e );
    }
  }

  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,
    RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,
    Repository repository, IMetaStore metaStore ) {
    CheckResult cr;

    if ( input.length > 0 ) {
      cr =
        new CheckResult( CheckResult.TYPE_RESULT_OK, BaseMessages.getString(
          PKG, "DenormaliserMeta.CheckResult.ReceivingInfoFromOtherSteps" ), stepMeta );
      remarks.add( cr );
    } else {
      cr =
        new CheckResult( CheckResult.TYPE_RESULT_ERROR, BaseMessages.getString(
          PKG, "DenormaliserMeta.CheckResult.NoInputReceived" ), stepMeta );

View on GitHub (pinned to f3058517a1)