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

Thrown in LDAPOutput.processRows when a field configured in the update stream mapping does not exist in the incoming row metadata — getInputRowMeta().indexOfValue(...) returns -1. The step builds the mapping of input positions to fields and aborts when a configured stream field is absent from the actual input rows.

Solutions

  1. Fix the field name in the LDAP Output dialog's stream-field column to exactly match an upstream field (case-sensitive)
  2. Inspect the row structure with 'Get Fields' in the dialog to refresh names from the input step
  3. Add/repair the upstream step that should produce the missing field
  4. If the field name uses variables, verify the variable resolves to the actual field name at runtime

Example fix

// before
Stream field: FirstName  (upstream produces 'firstname')
// after
Stream field: firstname
Defensive patterns

Strategy: validation

Validate before calling

// Verify configured stream fields exist in the input row metadata before running
RowMetaInterface in = transMeta.getPrevStepFields(stepMeta);
for (String f : ((LDAPOutputMeta) stepMeta.getStepMetaInterface()).getUpdateStream()) {
  if (in.indexOfValue(f) < 0) {
    throw new IllegalStateException("Field [" + f + "] missing from upstream output");
  }
}

Try / catch

try {
  runTransformation();
} catch (KettleException e) {
  if (e.getMessage().contains("couldn't be found in the input stream")) {
    String field = e.getMessage().replaceAll(".*Field \\[(.+?)\\].*", "$1");
    throw new IllegalStateException("Fix LDAP Output mapping: upstream has no field " + field);
  }
  throw e;
}

Prevention

When it happens

Trigger: A name in meta.getUpdateStream()[i] (after variable substitution) does not match any field of the input row: indexOfValue returns < 0 and the exception is thrown listing the missing field.

Common situations: Upstream step was renamed or removed a field; typo in the field name; field is generated conditionally so some rows lack it (metadata says it never exists); transformation moved between environments where variables resolve differently.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


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

Appendix: source

Thrown at plugins/ldap/impl/src/main/java/org/pentaho/di/trans/steps/ldapoutput/LDAPOutput.java:89

          throw new KettleException( BaseMessages.getString(
            PKG, "LDAPOutputUpdateDialog.FieldsMissing.DialogMessage" ) );
        }

        // Take care of variable
        data.fieldsAttribute = new String[data.nrfields];
        // Build the mapping of input position to field name
        data.fieldStream = new int[data.nrfields];

        // Fields to update
        List<Integer> fieldsToUpdateInStreaml = new ArrayList<Integer>();
        List<String> fieldsToUpdateAttributel = new ArrayList<String>();

        for ( int i = 0; i < data.nrfields; i++ ) {

          data.fieldStream[i] =
            getInputRowMeta().indexOfValue( environmentSubstitute( meta.getUpdateStream()[i] ) );
          if ( data.fieldStream[i] < 0 ) {
            throw new KettleException( "Field ["
              + meta.getUpdateStream()[i] + "] couldn't be found in the input stream!" );
          }
          data.fieldsAttribute[i] = environmentSubstitute( meta.getUpdateLookup()[i] );

          if ( meta.getOperationType() == LDAPOutputMeta.OPERATION_TYPE_UPSERT ) {
            if ( meta.getUpdate()[i].booleanValue() ) {
              // We need also to keep care of the fields to update
              fieldsToUpdateInStreaml.add( data.fieldStream[i] );
              fieldsToUpdateAttributel.add( data.fieldsAttribute[i] );
            }
          }
        }

        data.nrfieldsToUpdate = fieldsToUpdateInStreaml.size();
        if ( data.nrfieldsToUpdate > 0 ) {
          data.fieldStreamToUpdate = new int[data.nrfieldsToUpdate];
          data.fieldsAttributeToUpdate = new String[data.nrfieldsToUpdate];
          for ( int i = 0; i < fieldsToUpdateInStreaml.size(); i++ ) {

View on GitHub (pinned to f3058517a1)