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

  1. 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.
  2. Check the plugin source (MonetDBBulkLoaderMeta.loadFromInjectedMetadata) for the exact case-sensitive key strings your PDI version accepts.
  3. Remove or drop the unsupported field from the Metadata Injection step's mapping so it is not passed to this step.
  4. 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

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


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)