{"record":{"id":"7c8448323218e5bc","repo":"pentaho/pentaho-kettle","slug":"detectlastrowmeta-exception-unabletoreadstepinfo","errorCode":"DetectLastRowMeta.Exception.UnableToReadStepInfo","errorMessage":"DetectLastRowMeta.Exception.UnableToReadStepInfo","messagePattern":"DetectLastRowMeta\\.Exception\\.UnableToReadStepInfo","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/detectlastrow/DetectLastRowMeta.java","lineNumber":107,"sourceCode":"    if ( !Utils.isEmpty( resultfieldname ) ) {\n      ValueMetaInterface v =\n        new ValueMetaBoolean( space.environmentSubstitute( resultfieldname ) );\n      v.setOrigin( name );\n      row.addValueMeta( v );\n    }\n  }\n\n  public String getXML() {\n    StringBuilder retval = new StringBuilder();\n    retval.append( \"    \" + XMLHandler.addTagValue( \"resultfieldname\", resultfieldname ) );\n    return retval.toString();\n  }\n\n  private void readData( Node stepnode ) throws KettleXMLException {\n    try {\n      resultfieldname = XMLHandler.getTagValue( stepnode, \"resultfieldname\" );\n    } catch ( Exception e ) {\n      throw new KettleXMLException( BaseMessages.getString(\n        PKG, \"DetectLastRowMeta.Exception.UnableToReadStepInfo\" ), e );\n    }\n  }\n\n  public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases ) throws KettleException {\n    try {\n      resultfieldname = rep.getStepAttributeString( id_step, \"resultfieldname\" );\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"DetectLastRowMeta.Exception.UnexpectedErrorReadingStepInfo\" ), e );\n    }\n  }\n\n  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {\n    try {\n      rep.saveStepAttribute( id_transformation, id_step, \"resultfieldname\", resultfieldname );\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"DetectLastRowMeta.Exception.UnableToSaveStepInfo\" )","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/detectlastrow/DetectLastRowMeta.java#L89-L125","documentation":"DetectLastRowMeta.readData wraps any exception while parsing the step's XML node (resultfieldname tag) into a KettleXMLException with this localized message. It is thrown during loadXML when the step definition XML in a .ktr file cannot be read, with the original cause chained.","triggerScenarios":"Loading a transformation XML (KettleXMLException path via loadXML) whose DetectLastRow step node is malformed, empty, or contains invalid XML entities; XMLHandler.getTagValue throwing on corrupted content.","commonSituations":"Hand-edited or truncated .ktr files; transformations exported from different Pentaho versions with changed tag names; XML encoding issues; file corruption in version control or transfer.","solutions":["Open the .ktr in a text editor and verify the <detect_last_row> step node and its resultfieldname tag are intact","Re-export or re-save the transformation in Spoon to regenerate valid XML","Check file encoding and XML well-formedness with an XML validator","Restore the transformation from a known-good backup or VCS history"],"exampleFix":"// before\nresultfieldname = XMLHandler.getTagValue( stepnode, \"resultfieldname\" );\n// after: tolerate a missing tag and apply a default\nresultfieldname = XMLHandler.getTagValue( stepnode, \"resultfieldname\" );\nif ( resultfieldname == null ) {\n  resultfieldname = \"result\";\n}","handlingStrategy":"try-catch","validationCode":"// validate the .ktr XML is well-formed before loading\nDocumentBuilderFactory f = DocumentBuilderFactory.newInstance();\nf.parse(new File(\"trans.ktr\")); // throws SAXException on malformed XML","typeGuard":null,"tryCatchPattern":"try {\n  transMeta = new TransMeta(inputStream, metadataProvider, true, variables, null);\n} catch (KettleXMLException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"UnableToReadStepInfo\")) {\n    log.error(\"DetectLastRow step XML is malformed; cause: \" + e.getCause(), e);\n  }\n  throw e;\n}","preventionTips":["Validate .ktr files with an XML validator after any hand edit","Keep transformation files under version control for easy rollback","Do not truncate/transform .ktr files with scripts that can break encoding","Re-export transformations when migrating between Pentaho versions"],"tags":["kettle","xml","persistence","step-metadata"],"backgroundTag":"json-parse-error","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"}