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
- Set meta.setStorageType(ValueMetaInterface.STORAGE_TYPE_NORMAL) when the data is a plain BigDecimal
- Check getStorageType() against the valid constants before calling toString/getString and normalize invalid values
- Rebuild the step metadata and re-save the transformation through supported PDI tooling
- 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
- Use STORAGE_TYPE_* constants, never raw integers
- Validate metadata produced by dynamic/reflective metadata generators
- Keep the Kettle engine version uniform across pipeline nodes
- Add storageType assertions in integration tests for BigDecimal-heavy steps
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
- <toString()> : Unknown storage type
- Could not create ValueMetaInterface
- : I don't know how to convert binary values to BigDecimals.
- : I don't know how to convert binary values to numbers.
- : I don't know how to convert serializable values to…
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)