pentaho/pentaho-kettle · error · KettleValueException

: Unknown storage type " + storageType + " specified.

Error message

 : Unknown storage type " + storageType + " specified.

What it means

In the TYPE_BIGNUMBER (BigDecimal) conversion branch of ValueMetaBase, an unrecognized storageType falls to the switch default and throws KettleValueException. The message includes the meta's toString() and the raw storageType integer so you can identify which field's metadata is broken.

Solutions

  1. Set meta.setStorageType(ValueMetaInterface.STORAGE_TYPE_NORMAL) when the data is a plain BigDecimal
  2. Check getStorageType() against the valid constants before calling toString/getString and normalize invalid values
  3. Rebuild the step metadata and re-save the transformation through supported PDI tooling
  4. Keep the Kettle engine version uniform across the pipeline

Example fix

// before
String s = bigDecMeta.toString(data); // bad storageType -> throws
// after
bigDecMeta.setStorageType(ValueMetaInterface.STORAGE_TYPE_NORMAL);
String s = bigDecMeta.toString(data);
Defensive patterns

Strategy: validation

Validate before calling

if (bdMeta.getType() == ValueMetaInterface.TYPE_BIGNUMBER) {
  int st = bdMeta.getStorageType();
  if (st != ValueMetaInterface.STORAGE_TYPE_NORMAL
      && st != ValueMetaInterface.STORAGE_TYPE_INDEXED
      && st != ValueMetaInterface.STORAGE_TYPE_BINARY_STRING) {
    bdMeta.setStorageType(ValueMetaInterface.STORAGE_TYPE_NORMAL);
  }
}

Type guard

boolean safeBigNumberMeta(ValueMetaInterface m) {
  return m != null && m.getType() == ValueMetaInterface.TYPE_BIGNUMBER && isKnownStorageType(m);
}

Try / catch

try {
  String s = bdMeta.toString(data);
} catch (KettleValueException e) {
  logError("Invalid storage type on bigdecimal field " + bdMeta.getName());
  bdMeta.setStorageType(ValueMetaInterface.STORAGE_TYPE_NORMAL);
  String s = bdMeta.toString(data);
}

Prevention

When it happens

Trigger: getString()/toString() on a TYPE_BIGNUMBER ValueMeta whose storageType is not NORMAL, INDEXED, or BINARY_STRING; typical after manually built metadata or corrupted serialization round-trips.

Common situations: Custom steps handling BigDecimal fields (financial data) with hand-set storage constants; metadata migrated across Pentaho/Kettle major versions; bytecode-manipulation or reflection utilities corrupting metadata fields.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


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

Appendix: source

Thrown at core/src/main/java/org/pentaho/di/core/row/value/ValueMetaBase.java:1874

              throw new KettleValueException( toString() + " : Unknown storage type " + storageType + " specified." );
          }
          break;

        case TYPE_BIGNUMBER:
          switch ( storageType ) {
            case STORAGE_TYPE_NORMAL:
              string = convertBigNumberToString( (BigDecimal) object );
              break;
            case STORAGE_TYPE_BINARY_STRING:
              string = convertBigNumberToString( (BigDecimal) convertBinaryStringToNativeType( (byte[]) object ) );
              break;
            case STORAGE_TYPE_INDEXED:
              string =
                  object == null ? null
                      : convertBigNumberToString( (BigDecimal) index[( (Integer) object ).intValue()] );
              break;
            default:
              throw new KettleValueException( toString() + " : Unknown storage type " + storageType + " specified." );
          }
          break;

        case TYPE_BOOLEAN:
          switch ( storageType ) {
            case STORAGE_TYPE_NORMAL:
              string = convertBooleanToString( (Boolean) object );
              break;
            case STORAGE_TYPE_BINARY_STRING:
              string = convertBooleanToString( (Boolean) convertBinaryStringToNativeType( (byte[]) object ) );
              break;
            case STORAGE_TYPE_INDEXED:
              string =
                  object == null ? null : convertBooleanToString( (Boolean) index[( (Integer) object ).intValue()] );
              break;
            default:
              throw new KettleValueException( toString() + " : Unknown storage type " + storageType + " specified." );
          }

View on GitHub (pinned to f3058517a1)