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
- Connect the intended source step (e.g. Table Input / Get Values) to the Validator as an info hop.
- In the Validator dialog, re-select the source step for the validation's 'Source of allowed values'.
- If not using external allowed values, disable 'sourcing values' for that validation and specify constants instead.
- 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
- Draw info hops immediately when enabling step-sourced allowed values
- After deleting steps, re-check validator references
- Preview the source step to confirm it feeds the validator
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
- Caught a number format exception converting minimum length…
- Source field [
- There is no name specified for validator field #
- There is no valid source field specified for the allowed…
- Unable to find the specified fieldname '
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)