pentaho/pentaho-kettle · error · KettleStepException

There is no valid source step specified for the allowed…

Error message

There is no valid source step specified for the allowed values of validation [

What it means

Thrown from Validator.readSourceValuesFromInfoSteps when a validation is configured to source its allowed values from another step, but no connected info (hop) step is actually set for that validation's stream. The step cannot preload allowed values without a source step.

Solutions

  1. Connect the intended source step (e.g. Table Input / Get Values) to the Validator as an info hop.
  2. In the Validator dialog, re-select the source step for the validation's 'Source of allowed values'.
  3. If not using external allowed values, disable 'sourcing values' for that validation and specify constants instead.
  4. Check the transformation after edits — hops to validator steps can be silently removed.

Example fix

// before (config)
field.setSourcingValues(true); // but no info hop connected
// after
field.setSourcingValues(true);
// AND in TransMeta: validatorStepMeta.addSourceStep(sourceStepMeta); // connect the hop
Defensive patterns

Strategy: validation

Validate before calling

// Before execution: every sourcing validation must have an info stream
int i = 0;
for (Validation f : meta.getValidations()) {
  if (f.isSourcingValues() && meta.getStepIOMeta().getInfoStreams().get(i).getStepMeta() == null)
    throw new IllegalStateException("Validation [" + f.getName() + "] sources values but has no source step hop");
  i++;
}

Try / catch

try {
  trans.startThreads();
} catch (KettleStepException e) {
  if (e.getMessage().contains("no valid source step specified")) {
    // rewire the missing info hop and restart
  }
}

Prevention

When it happens

Trigger: processRow calls readSourceValuesFromInfoSteps; field.isSourcingValues() is true but meta.getStepIOMeta().getInfoStreams().get(i).getStepMeta() is null — the 'Source of allowed values' step is unset or the hop was deleted.

Common situations: Configuring allowed-values-from-step but forgetting to draw/keep the info hop; deleting the source step later; importing a transformation where the hop reference was lost.

Understand the failure class

Background: "X is required", "must be set", "cannot be empty": the missing-required-config error family, from Vertex AI project/location to WeChat keys — this error's family across 18 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/validator/Validator.java:188

    }
    if ( checkFeedback( getLinesRead() ) ) {
      logBasic( "Linenr " + getLinesRead() );
    }

    return true;
  }

  void readSourceValuesFromInfoSteps() throws KettleStepException {
    Map<String, Integer> inputStepWasProcessed = new HashMap<>();
    for ( int i = 0; i < meta.getValidations().size(); i++ ) {
      Validation field = meta.getValidations().get( i );
      List<StreamInterface> streams = meta.getStepIOMeta().getInfoStreams();

      // If we need to source the allowed values data from a different step, we do this here as well
      //
      if ( field.isSourcingValues() ) {
        if ( streams.get( i ).getStepMeta() == null ) {
          throw new KettleStepException(
            "There is no valid source step specified for the allowed values of validation ["
              + field.getName() + "]" );
        }
        if ( Utils.isEmpty( field.getSourcingField() ) ) {
          throw new KettleStepException(
            "There is no valid source field specified for the allowed values of validation ["
              + field.getName() + "]" );
        }

        // Still here : OK, read the data from the specified step...
        // The data is stored in data.listValues[i] and data.constantsMeta
        //
        String stepName = streams.get( i ).getStepname();
        if ( inputStepWasProcessed.containsKey( stepName ) ) {
          // step was processed for other StreamInterface
          data.listValues[ i ] = data.listValues[ inputStepWasProcessed.get( stepName ) ];
          data.constantsMeta[ i ] = data.constantsMeta[ inputStepWasProcessed.get( stepName ) ];
          continue;

View on GitHub (pinned to f3058517a1)