pentaho/pentaho-kettle · error · RuntimeException
Unhandled metadata injection of attribute:
Error message
Unhandled metadata injection of attribute:
What it means
During metadata injection (stepInjectionMetadata / loadFromInjectedMetadata), MonetDBBulkLoaderMeta only recognizes a fixed set of top-level attributes (e.g. CONNECTIONNAME, SCHEMANAME, TABLENAME, TRUNCATE, BUFFER_SIZE, FULLY_QUOTE_SQL). Any injected key outside this whitelist throws a RuntimeException with 'Unhandled metadata injection of attribute: ...'. This is a deliberate fail-fast guard against injecting attributes the step cannot map.
Solutions
- Read the exception's attr name/description, and correct the injected attribute key to one of the supported keys: CONNECTIONNAME, SCHEMANAME, TABLENAME, TRUNCATE, BUFFER_SIZE, FULLY_QUOTE_SQL.
- Check the plugin source (MonetDBBulkLoaderMeta.loadFromInjectedMetadata) for the exact case-sensitive key strings your PDI version accepts.
- Remove or drop the unsupported field from the Metadata Injection step's mapping so it is not passed to this step.
- If the attribute genuinely is supported in another plugin version, align plugin/PDI versions before injecting.
Example fix
// before (injection row key) key = "TABLE_NAME" // throws Unhandled metadata injection of attribute // after key = "TABLENAME" // whitelisted in loadFromInjectedMetadata
Defensive patterns
Strategy: validation
Validate before calling
// Java: verify injected keys against the supported whitelist before injecting
java.util.Set<String> supported = new java.util.HashSet<>(java.util.Arrays.asList(
"CONNECTIONNAME", "SCHEMANAME", "TABLENAME", "TRUNCATE", "BUFFER_SIZE", "FULLY_QUOTE_SQL"));
for (String key : injectedKeys) {
if (!supported.contains(key)) {
throw new IllegalArgumentException("Unsupported injection key for MonetDB Bulk Loader: " + key);
}
} Prevention
- Only inject attributes listed in MonetDBBulkLoaderMeta's injection whitelist; check the source for your plugin version.
- Never copy injection field lists from other steps (Table Output etc.); each step has its own spec.
- Keep the plugin and PDI versions aligned to avoid attribute-set drift.
- Test metadata injections on a scratch transformation before applying to production.
When it happens
Trigger: Using the Metadata Injection (ETL Metadata Injector) step to feed a mapping row containing an attribute key that is not one of the loader's supported top-level keys — e.g. a typo like 'TABLE NAME', an old/renamed key, or an attribute from a different step's injection spec.
Common situations: Typos in the injector's target-field list; injecting attributes copied from the Table Output or other loader steps; version drift where a newer/older plugin supports different attribute keys; programmatically building injection maps with wrong key names.
Related errors
- MonetDBBulkLoaderMeta.Exception.ConnectionNotDefined
- Reference key ' ': reference value ' ' is not equal to
- Reference key ' ': value is not null while the compare…
- Reference key ' ': value is null while the compare value is…
- TableOutputMeta.Exception.ConnectionUndefined
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/2dc36fe8fe2c27dc.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/monet-db-bulk-loader/impl/src/main/java/org/pentaho/di/trans/steps/monetdbbulkloader/MonetDBBulkLoaderMeta.java:945
tableName = (String) entry.getValue();
} else if ( entry.getKey().equals( "LOGFILE" ) ) {
logFile = (String) entry.getValue();
} else if ( entry.getKey().equals( "FIELD_SEPARATOR" ) ) {
fieldSeparator = (String) entry.getValue();
} else if ( entry.getKey().equals( "FIELD_ENCLOSURE" ) ) {
fieldEnclosure = (String) entry.getValue();
} else if ( entry.getKey().equals( "NULL_REPRESENTATION" ) ) {
setNULLrepresentation( (String) entry.getValue() );
} else if ( entry.getKey().equals( "ENCODING" ) ) {
encoding = (String) entry.getValue();
} else if ( entry.getKey().equals( "BUFFER_SIZE" ) ) {
bufferSize = (String) entry.getValue();
} else if ( entry.getKey().equals( "TRUNCATE" ) ) {
truncate = (Boolean) entry.getValue();
} else if ( entry.getKey().equals( "FULLY_QUOTE_SQL" ) ) {
fullyQuoteSQL = (Boolean) entry.getValue();
} else {
throw new RuntimeException( "Unhandled metadata injection of attribute: "
+ attr.toString() + " - " + attr.getDescription() );
}
} else {
// The data sets...
//
if ( attr.getKey().equals( "MAPPINGS" ) ) {
List<StepInjectionMetaEntry> selectMappings = entry.getDetails();
fieldTable = new String[selectMappings.size()];
fieldStream = new String[selectMappings.size()];
fieldFormatOk = new boolean[selectMappings.size()];
for ( int row = 0; row < selectMappings.size(); row++ ) {
StepInjectionMetaEntry selectField = selectMappings.get( row );
List<StepInjectionMetaEntry> fieldAttributes = selectField.getDetails();
//CHECKSTYLE:Indentation:OFF
for ( int i = 0; i < fieldAttributes.size(); i++ ) {View on GitHub (pinned to f3058517a1)