pentaho/pentaho-kettle · error · KettleException

ExecProcess.ProcessEmpty

Error message

ExecProcess.ProcessEmpty

What it means

Message key ExecProcess.ProcessEmpty thrown in ExecProcess.processRow: the string taken from the configured process field is null/empty, so there is no command to execute and the step aborts row processing with this localized error.

Solutions

  1. Filter out rows with an empty command field before ExecProcess (Filter rows: field IS NOT NULL and <> '').
  2. Provide a default value upstream (e.g. 'Value Mapper' or NVL-style logic).
  3. Fix the upstream step that should populate the command field.
  4. If empty commands are expected but harmless, route those rows to a dummy/ignore branch.

Example fix

// before: empty commands reach the step
// (no filtering upstream)
// after: filter them in the transformation
// Filter rows: [command] IS NOT NULL AND [command] <> ''  -> ExecProcess
// else -> Dummy (do nothing)
Defensive patterns

Strategy: validation

Validate before calling

// upstream filter before ExecProcess
// Filter rows: [command] IS NOT NULL AND [command] <> ''

Try / catch

try { trans.execute(); } catch (KettleException e) { if (e.getMessage().contains("ProcessEmpty")) { /* add empty-value filtering upstream */ } }

Prevention

When it happens

Trigger: processRow, per row: data.previousRowMeta.getString(r, data.indexOfProcess) returns null or empty string for the current row (upstream produced blank value or null).

Common situations: Lookup/Stream Lookup returned null for the command field; a JavaScript/Calculator step left the field empty; source data rows contain blank command values; filter mistakenly passes empty rows through.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/execprocess/ExecProcess.java:122

                BaseMessages.getString( PKG, "ExecProcess.Exception.CouldnotFindField", fieldName ) );
            }
          }
        }
      }
    } // End If first

    Object[] outputRow = RowDataUtil.allocateRowData( data.outputRowMeta.size() );
    for ( int i = 0; i < data.NrPrevFields; i++ ) {
      outputRow[i] = r[i];
    }
    // get process to execute
    String processString = data.previousRowMeta.getString( r, data.indexOfProcess );

    ProcessResult processResult = new ProcessResult();

    try {
      if ( Utils.isEmpty( processString ) ) {
        throw new KettleException( BaseMessages.getString( PKG, "ExecProcess.ProcessEmpty" ) );
      }

      // execute and return result
      if ( meta.isArgumentsInFields() ) {
        List<String> cmdArray = new ArrayList<>();
        cmdArray.add( processString );

        for ( int i = 0; i < data.indexOfArguments.length; i++ ) {
          // Runtime.exec will fail on null array elements
          // Convert to an empty string if value is null
          String argString = data.previousRowMeta.getString( r, data.indexOfArguments[i] );
          cmdArray.add( Const.NVL( argString, "" ) );
        }

        execProcess( cmdArray.toArray( new String[0] ), processResult );
      } else {
        execProcess( processString, processResult );
      }

View on GitHub (pinned to f3058517a1)