{"record":{"id":"8f650a9980fb31ae","repo":"pentaho/pentaho-kettle","slug":"unknown-storage-type-valuemetatimestamp","errorCode":null,"errorMessage":" : Unknown storage type ","messagePattern":" : Unknown storage type ","errorType":"exception","errorClass":"KettleFileException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/pentaho/di/core/row/value/ValueMetaTimestamp.java","lineNumber":647,"sourceCode":"      }\n\n      switch ( storageType ) {\n        case STORAGE_TYPE_NORMAL:\n          // Handle Content -- only when not NULL\n          long time = inputStream.readLong();\n          int nanos = inputStream.readInt();\n          Timestamp timestamp = new Timestamp( time );\n          timestamp.setNanos( nanos );\n          return timestamp;\n\n        case STORAGE_TYPE_BINARY_STRING:\n          return readBinaryString( inputStream );\n\n        case STORAGE_TYPE_INDEXED:\n          return readSmallInteger( inputStream ); // just an index: 4-bytes should be enough.\n\n        default:\n          throw new KettleFileException( toString() + \" : Unknown storage type \" + getStorageType() );\n      }\n    } catch ( EOFException e ) {\n      throw new KettleEOFException( e );\n    } catch ( SocketTimeoutException e ) {\n      throw e;\n    } catch ( IOException e ) {\n      throw new KettleFileException( toString() + \" : Unable to read value timestamp data from input stream\", e );\n    }\n  }\n\n  @Override\n  public synchronized SimpleDateFormat getDateFormat() {\n    return getDateFormat( getType() );\n  }\n\n  private synchronized SimpleDateFormat getDateFormat( int valueMetaType ) {\n    if ( conversionMetadata != null ) {\n      return new SimpleTimestampFormat( conversionMetadata.getDateFormat().toPattern() );","sourceCodeStart":629,"sourceCodeEnd":665,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/core/src/main/java/org/pentaho/di/core/row/value/ValueMetaTimestamp.java#L629-L665","documentation":"ValueMetaTimestamp.readData() deserializes a value from an input stream and switches on the storage type read from the wire. If the storage-type code is not one of the known STORAGE_TYPE_* constants, it throws KettleFileException 'Unknown storage type'. This indicates corrupt or incompatible binary data.","triggerScenarios":"Reading a serialized row whose storage-type byte is negative or outside the defined range (STORAGE_TYPE_NORMAL/INDEXED/BINARY_STRING/SORTABLE); deserializing files written by a different Kettle version with new storage types.","commonSituations":"Kettle repository/kitchen files moved across Pentaho versions; truncated or corrupted serialized row streams; custom serialization bugs writing garbage before readData.","solutions":["Regenerate the corrupted serialized data with the same Pentaho version that reads it","Verify stream alignment: a desynchronization upstream can misread the storage-type byte","Align reader/writer Pentaho versions; do not stream rows between different Kettle releases","Inspect getStorageType() of the source ValueMeta before serializing"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if (storageType < 0 || storageType > STORAGE_TYPE_SORTABLE) { throw new KettleFileException(\"Storage type out of range: \" + storageType); }","typeGuard":null,"tryCatchPattern":"try {\n  value = valueMeta.readData(inputStream);\n} catch (KettleFileException e) {\n  LOG.error(\"Corrupt or incompatible row stream: \" + e.getMessage());\n  throw new IOException(\"Aborting read\", e);\n}","preventionTips":["Do not stream serialized rows between different Pentaho/Kettle versions","Validate file integrity (checksum) before deserializing","Regenerate binary artifacts after upgrading Kettle"],"tags":["serialization","deserialization","corrupt-data"],"backgroundTag":"invalid-enum-value","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}