{"record":{"id":"79cc0936a27690b7","repo":"pentaho/pentaho-kettle","slug":"there-is-no-valid-source-step-specified-for-the-allowed","errorCode":null,"errorMessage":"There is no valid source step specified for the allowed values of validation [","messagePattern":"There is no valid source step specified for the allowed values of validation \\[","errorType":"validation","errorClass":"KettleStepException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/validator/Validator.java","lineNumber":188,"sourceCode":"    }\n    if ( checkFeedback( getLinesRead() ) ) {\n      logBasic( \"Linenr \" + getLinesRead() );\n    }\n\n    return true;\n  }\n\n  void readSourceValuesFromInfoSteps() throws KettleStepException {\n    Map<String, Integer> inputStepWasProcessed = new HashMap<>();\n    for ( int i = 0; i < meta.getValidations().size(); i++ ) {\n      Validation field = meta.getValidations().get( i );\n      List<StreamInterface> streams = meta.getStepIOMeta().getInfoStreams();\n\n      // If we need to source the allowed values data from a different step, we do this here as well\n      //\n      if ( field.isSourcingValues() ) {\n        if ( streams.get( i ).getStepMeta() == null ) {\n          throw new KettleStepException(\n            \"There is no valid source step specified for the allowed values of validation [\"\n              + field.getName() + \"]\" );\n        }\n        if ( Utils.isEmpty( field.getSourcingField() ) ) {\n          throw new KettleStepException(\n            \"There is no valid source field specified for the allowed values of validation [\"\n              + field.getName() + \"]\" );\n        }\n\n        // Still here : OK, read the data from the specified step...\n        // The data is stored in data.listValues[i] and data.constantsMeta\n        //\n        String stepName = streams.get( i ).getStepname();\n        if ( inputStepWasProcessed.containsKey( stepName ) ) {\n          // step was processed for other StreamInterface\n          data.listValues[ i ] = data.listValues[ inputStepWasProcessed.get( stepName ) ];\n          data.constantsMeta[ i ] = data.constantsMeta[ inputStepWasProcessed.get( stepName ) ];\n          continue;","sourceCodeStart":170,"sourceCodeEnd":206,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/validator/Validator.java#L170-L206","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before (config)\nfield.setSourcingValues(true); // but no info hop connected\n// after\nfield.setSourcingValues(true);\n// AND in TransMeta: validatorStepMeta.addSourceStep(sourceStepMeta); // connect the hop","handlingStrategy":"validation","validationCode":"// Before execution: every sourcing validation must have an info stream\nint i = 0;\nfor (Validation f : meta.getValidations()) {\n  if (f.isSourcingValues() && meta.getStepIOMeta().getInfoStreams().get(i).getStepMeta() == null)\n    throw new IllegalStateException(\"Validation [\" + f.getName() + \"] sources values but has no source step hop\");\n  i++;\n}","typeGuard":null,"tryCatchPattern":"try {\n  trans.startThreads();\n} catch (KettleStepException e) {\n  if (e.getMessage().contains(\"no valid source step specified\")) {\n    // rewire the missing info hop and restart\n  }\n}","preventionTips":["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"],"tags":["kettle","validator","info-step","config"],"backgroundTag":"missing-required-config","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}