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
- Open the Column Exists dialog and set the 'Columnname field' to the input field containing the column names
- Re-save the transformation and re-run
- Verify the step metadata XML/repository entry contains the columnname field setting
- 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
- Fill all required dialog fields before saving
- Use the step's Check/verify button in Spoon
- Review step config when copy-pasting steps between transformations
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
- ColumnExists.Error.TablenameFieldMissing
- JobSQL.NoSQLFileSpecified
- SymmetricCryptoTrans.Exception.MissingMessageField
- ZipFile.Error.SourceFilenameFieldMissing
- ZipFile.Error.TargetFilenameFieldMissing
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)