pentaho/pentaho-kettle · error · KettleException

error reading step with id_step= from the repository

Error message

error reading step with id_step= from the repository

What it means

NumberRangeMeta.readRep() loads the step's range rules from the repository, parsing stored lower_bound/upper_bound strings into doubles. Any failure (DB read error or unparseable numeric text) is wrapped in a KettleException with 'error reading step with id_step=<id> from the repository'.

Solutions

  1. Inspect getCause(): if it is a NumberFormatException, fix the stored lower_bound/upper_bound attribute values in R_STEP_ATTRIBUTE to plain doubles.
  2. Verify repository connectivity and that id_step exists.
  3. Re-save the step from Spoon so bounds are rewritten in canonical format.
  4. Restore corrupted repository rows from backup.

Example fix

// before (repository attribute)
lower_bound = 0,5
// after
lower_bound = 0.5
Defensive patterns

Strategy: try-catch

Validate before calling

// Before readRep, sanity-check stored bounds in R_STEP_ATTRIBUTE are numeric

Type guard

boolean isParseableDouble(String s) { if (s == null) return false; try { Double.parseDouble(s.trim()); return true; } catch (NumberFormatException e) { return false; } }

Try / catch

try { meta.readRep(rep, metaStore, idStep, databases); } catch (KettleException e) { log.error("Number Range readRep failed for " + idStep + ": " + e.getCause(), e); }

Prevention

When it happens

Trigger: readRep(rep, metaStore, id_step) throwing when getStepAttributeString fails or Double.parseDouble rejects a stored bound value.

Common situations: Repository attributes hand-edited or written by a version using a different number format; repository DB connectivity loss; missing id_step / corrupted attribute rows.

Understand the failure class

Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/numberrange/NumberRangeMeta.java:178

      outputField = rep.getStepAttributeString( id_step, "outputField" );

      emptyRules();
      String fallBackValue = rep.getStepAttributeString( id_step, "fallBackValue" );
      setFallBackValue( fallBackValue );
      int nrfields = rep.countNrStepAttributes( id_step, "lower_bound" );
      for ( int i = 0; i < nrfields; i++ ) {
        String lowerBoundStr = rep.getStepAttributeString( id_step, i, "lower_bound" );
        String upperBoundStr = rep.getStepAttributeString( id_step, i, "upper_bound" );
        String value = rep.getStepAttributeString( id_step, i, "value" );

        double lowerBound = Double.parseDouble( lowerBoundStr );
        double upperBound = Double.parseDouble( upperBoundStr );

        addRule( lowerBound, upperBound, value );

      }
    } catch ( Exception dbe ) {
      throw new KettleException( "error reading step with id_step=" + id_step + " from the repository", dbe );
    }
  }

  @Override
  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "inputField", inputField );
      rep.saveStepAttribute( id_transformation, id_step, "outputField", outputField );
      rep.saveStepAttribute( id_transformation, id_step, "fallBackValue", getFallBackValue() );

      int i = 0;
      for ( NumberRangeRule rule : rules ) {
        rep
          .saveStepAttribute( id_transformation, id_step, i, "lower_bound", String
            .valueOf( rule.getLowerBound() ) );
        rep
          .saveStepAttribute( id_transformation, id_step, i, "upper_bound", String
            .valueOf( rule.getUpperBound() ) );

View on GitHub (pinned to f3058517a1)