pentaho/pentaho-kettle · error · KettleException

ColumnExists.Error.ColumnnameFieldMissing

Error message

ColumnExists.Error.ColumnnameFieldMissing

What it means

ColumnExists.processRow checks that a dynamic columnname field was configured on the step before processing rows. If meta.getDynamicColumnnameField() is empty, it logs and throws a KettleException with this message. It is a configuration guard: the step needs to know which input field holds the column name to check for existence.

Solutions

  1. Open the Column Exists dialog and set the 'Columnname field' to the input field containing the column names
  2. Re-save the transformation and re-run
  3. Verify the step metadata XML/repository entry contains the columnname field setting
  4. If the field is optional in your flow, switch to a statically configured column name

Example fix

// before
Dynamic columnname field: (empty)
// after
Dynamic columnname field: column_name
Defensive patterns

Strategy: validation

Validate before calling

// Before executing, check the step metadata
if (meta.getDynamicColumnnameField() == null || meta.getDynamicColumnnameField().isEmpty()) {
  throw new IllegalStateException("Columnname field must be configured on Column Exists step");
}

Type guard

boolean hasDynamicField(ColumnExistsMeta m) {
  return m.getDynamicColumnnameField() != null && !m.getDynamicColumnnameField().isEmpty();
}

Try / catch

try {
  step.processRow();
} catch (KettleException e) {
  if (e.getMessage().contains("ColumnnameFieldMissing")) {
    // open step dialog, set Columnname field, re-run
  }
}

Prevention

When it happens

Trigger: Executing the Column Exists step without selecting a 'Columnname field' in the dialog, or with an empty value saved in the step metadata.

Common situations: Incomplete step configuration (user left the field blank), step metadata imported from XML/repository with the field dropped, copy-pasted step losing dialog settings.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


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

Appendix: source

Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/columnexists/ColumnExists.java:71

    // if no more input to be expected set done
    if ( r == null ) {
      setOutputDone();
      return false;
    }

    boolean columnexists = false;

    if ( first ) {
      first = false;

      data.outputRowMeta = getInputRowMeta().clone();
      meta.getFields( getTransMeta().getBowl(), data.outputRowMeta, getStepname(), null, null, this, repository,
        metaStore );

      // Check is columnname field is provided
      if ( Utils.isEmpty( meta.getDynamicColumnnameField() ) ) {
        logError( BaseMessages.getString( PKG, "ColumnExists.Error.ColumnnameFieldMissing" ) );
        throw new KettleException( BaseMessages.getString( PKG, "ColumnExists.Error.ColumnnameFieldMissing" ) );
      }
      if ( meta.isTablenameInField() ) {
        // Check is tablename field is provided
        if ( Utils.isEmpty( meta.getDynamicTablenameField() ) ) {
          logError( BaseMessages.getString( PKG, "ColumnExists.Error.TablenameFieldMissing" ) );
          throw new KettleException( BaseMessages.getString( PKG, "ColumnExists.Error.TablenameFieldMissing" ) );
        }

        // cache the position of the field
        if ( data.indexOfTablename < 0 ) {
          data.indexOfTablename = getInputRowMeta().indexOfValue( meta.getDynamicTablenameField() );
          if ( data.indexOfTablename < 0 ) {
            // The field is unreachable !
            logError( BaseMessages.getString( PKG, "ColumnExists.Exception.CouldnotFindField" ) + "["
                + meta.getDynamicTablenameField() + "]" );
            throw new KettleException( BaseMessages.getString( PKG, "ColumnExists.Exception.CouldnotFindField",
              meta.getDynamicTablenameField() ) );
          }

View on GitHub (pinned to f3058517a1)