{"record":{"id":"a11e2c5a16c51374","repo":"pentaho/pentaho-kettle","slug":"columnexistsmeta-exception-unabletoreadstepinfo","errorCode":null,"errorMessage":"ColumnExistsMeta.Exception.UnableToReadStepInfo","messagePattern":"ColumnExistsMeta\\.Exception\\.UnableToReadStepInfo","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/columnexists/ColumnExistsMeta.java","lineNumber":230,"sourceCode":"    retval.append( \"    \" + XMLHandler.addTagValue( \"istablenameInfield\", istablenameInfield ) );\n    retval.append( \"    \" + XMLHandler.addTagValue( \"tablenamefield\", tablenamefield ) );\n    retval.append( \"    \" + XMLHandler.addTagValue( \"columnnamefield\", columnnamefield ) );\n    retval.append( \"      \" + XMLHandler.addTagValue( \"resultfieldname\", resultfieldname ) );\n    return retval.toString();\n  }\n\n  private void readData( Node stepnode, List<DatabaseMeta> databases ) throws KettleXMLException {\n    try {\n      String con = XMLHandler.getTagValue( stepnode, \"connection\" );\n      database = DatabaseMeta.findDatabase( databases, con );\n      tablename = XMLHandler.getTagValue( stepnode, \"tablename\" );\n      schemaname = XMLHandler.getTagValue( stepnode, \"schemaname\" );\n      istablenameInfield = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, \"istablenameInfield\" ) );\n      tablenamefield = XMLHandler.getTagValue( stepnode, \"tablenamefield\" );\n      columnnamefield = XMLHandler.getTagValue( stepnode, \"columnnamefield\" );\n      resultfieldname = XMLHandler.getTagValue( stepnode, \"resultfieldname\" ); // Optional, can be null\n    } catch ( Exception e ) {\n      throw new KettleXMLException( BaseMessages.getString( PKG, \"ColumnExistsMeta.Exception.UnableToReadStepInfo\" ),\n          e );\n    }\n  }\n\n  public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases )\n    throws KettleException {\n    try {\n      database = rep.loadDatabaseMetaFromStepAttribute( id_step, \"id_connection\", databases );\n      tablename = rep.getStepAttributeString( id_step, \"tablename\" );\n      schemaname = rep.getStepAttributeString( id_step, \"schemaname\" );\n      istablenameInfield = rep.getStepAttributeBoolean( id_step, \"istablenameInfield\" );\n      tablenamefield = rep.getStepAttributeString( id_step, \"tablenamefield\" );\n      columnnamefield = rep.getStepAttributeString( id_step, \"columnnamefield\" );\n      resultfieldname = rep.getStepAttributeString( id_step, \"resultfieldname\" );\n    } catch ( Exception e ) {\n      throw new KettleException(\n          BaseMessages.getString( PKG, \"ColumnExistsMeta.Exception.UnexpectedErrorReadingStepInfo\" ), e );\n    }","sourceCodeStart":212,"sourceCodeEnd":248,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/columnexists/ColumnExistsMeta.java#L212-L248","documentation":"loadXML wraps any exception raised while parsing the step's XML node into a KettleXMLException with message 'Unable to read step info from XML node'. It indicates corrupt or malformed XML for the ColumnExists step definition.","triggerScenarios":"readData throws (XMLHandler.getTagValue fails, ClassCastException, etc.) while loading a .ktr/.kjb containing a ColumnExists step via loadXML.","commonSituations":"Hand-edited or truncated ktr XML; wrong tag casing/format from an old export; XML produced by an incompatible PDI version.","solutions":["Open the ktr file and repair/validate the <step> XML block for this step","Re-export or re-save the transformation from Spoon on a working version","Check the cause chain (e.getCause()) to find the exact parsing failure"],"exampleFix":"// before (malformed hand-edit)\n<istablenameInfield>yes</istablenameInfield>\n// after\n<istablenameInfield>Y</istablenameInfield>","handlingStrategy":"try-catch","validationCode":"Document doc = XMLHandler.loadXMLFile(ktrFile);\nif (XMLHandler.getSubNode(XMLHandler.getFirstSubNode(doc, \"transformation\"), \"step\") == null) {\n  throw new IllegalArgumentException(\"Transformation has no step nodes\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  transMeta = new TransMeta(ktrFile);\n} catch (KettleXMLException e) {\n  log.error(\"Cannot read ColumnExists step XML: \" + e.getCause(), e);\n  throw e;\n}","preventionTips":["Never hand-edit ktr XML; edit in Spoon","Validate XML against the PDI schema in CI","Keep PDI versions consistent between designers and runners"],"tags":["kettle","pdi","xml","deserialization"],"backgroundTag":"json-unmarshal-failed","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"}