pentaho/pentaho-kettle · error · KettleException
Field [ ] couldn't be found in the input stream!
Error message
Field [ {0} ] couldn't be found in the input stream! What it means
In SalesforceUpdate.processRow(), for each configured update stream field, the step looks up its index in the incoming row metadata via getInputRowMeta().indexOfValue(). If a configured field name is not present in the incoming stream (index < 0), it throws a KettleException: 'Field [X] couldn't be found in the input stream!'. This is a hard fail-fast check to prevent sending wrong data to Salesforce.
Solutions
- Open the Salesforce Update step and correct the field name in the 'Update stream' column to match the incoming row field exactly (case included).
- Inspect the incoming fields (right-click the hop / View input fields) and align the mapping grid.
- Add or fix the upstream step (Text File Input, Select Values, etc.) so the field is actually produced.
- Use 'Get Fields' in the step dialog to re-populate from the real input stream.
Example fix
// before: mapping references a removed field updateStream[i] = "cust_id"; // upstream renamed it // after updateStream[i] = "customer_id"; // matches upstream field
Defensive patterns
Strategy: validation
Validate before calling
// Verify every configured update field exists in the input row metadata before running
RowMetaInterface input = transMeta.getPrevStepFields(stepMeta);
SalesforceUpdateMeta meta = (SalesforceUpdateMeta) stepMeta.getStepMetaInterface();
for (String field : meta.getUpdateStream()) {
if (input.indexOfValue(field) < 0) {
throw new IllegalArgumentException("Field [" + field + "] missing from input stream of "
+ stepMeta.getName());
}
} Try / catch
try {
trans.execute(null);
} catch (KettleException e) {
if (e.getMessage().contains("couldn't be found in the input stream")) {
log.error("Mapping references a non-existent field: {}", e.getMessage());
}
throw e;
} Prevention
- Use 'Get Fields' in the step dialog so mapping names come from the actual stream.
- Re-check mappings after renaming upstream fields or changing Select Values steps.
- Remember Kettle field names are case-sensitive.
- Run transMeta.check(remarks, ...) during development to catch field mismatches early.
When it happens
Trigger: Running the step when a field named in the 'Update stream' (or lookup) column of the mapping grid does not exist in the rows arriving on the input hop — renaming/deleting an upstream field, changing field casing, or a Select Values step dropping the field.
Common situations: Upstream step renamed an output field; CSV/text input columns changed; wrong hop connected to the Salesforce Update step; case-sensitive mismatch (Kettle field names are case-sensitive).
Related errors
- SalesforceInsert.CanNotFindField
- SalesforceInsertDialog.FieldsMissing.DialogMessage
- SalesforceUpdateDialog.FieldsMissing.DialogMessage
- SalesforceUpsert.FieldNotFound
- Unable to find field [" + fieldStream[i] + "] in the input…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/19f0d6cec168c34f.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforceupdate/SalesforceUpdate.java:94
// Check if field list is filled
if ( data.nrfields == 0 ) {
throw new KettleException( BaseMessages.getString( PKG,
"SalesforceUpdateDialog.FieldsMissing.DialogMessage" ) );
}
// Create the output row meta-data
data.inputRowMeta = getInputRowMeta().clone();
data.outputRowMeta = data.inputRowMeta.clone();
meta.getFields( getTransMeta().getBowl(), data.outputRowMeta, getStepname(), null, null, this, repository,
metaStore );
// Build the mapping of input position to field name
data.fieldnrs = new int[meta.getUpdateStream().length];
for ( int i = 0; i < meta.getUpdateStream().length; i++ ) {
data.fieldnrs[i] = getInputRowMeta().indexOfValue( meta.getUpdateStream()[i] );
if ( data.fieldnrs[i] < 0 ) {
throw new KettleException( "Field [" + meta.getUpdateStream()[i]
+ "] couldn't be found in the input stream!" );
}
}
}
try {
writeToSalesForce( outputRowData );
} catch ( Exception e ) {
throw new KettleStepException( BaseMessages.getString( PKG, "SalesforceUpdate.log.Exception" ), e );
}
return true;
}
@VisibleForTesting
void writeToSalesForce( Object[] rowData ) throws KettleException {
try {
View on GitHub (pinned to f3058517a1)